我如何显示已保存在文件中的像素的图像? [已关闭]

问题描述 投票:0回答:2

我正在使用 opencv 和 c++ 将图像的像素保存在文件中,现在我想恢复图像以便再次显示它。你能给一些建议吗?

[更新:包含OP评论中的代码] 我正在使用这些循环将图像的像素保存在文件中

for(int row=0; row<a;row++) 
    for(int col=0;col<b;col++) { 
        pixel[row][col]= ((uchar *)(img->imageData + row*img->widthStep))[col*img->nChannels +0]; 

现在我正在尝试读取这些像素以显示图像

c++ opencv computer-vision
2个回答
2
投票

在磁盘中存储图像数据的标准(推荐)方法是将像素放入图像容器(jpg/png/bmp/tiff/...)中并将其保存到文件中。 OpenCV 处理这个过程非常容易,因为你已经有了

img
作为
IplImage*
,你需要做的就是调用
cvSaveImage()
并给出文件名:

if (!cvSaveImage("output.png", img))
{
    // print cvSaveImage failed and deal with error
}

然后,要从磁盘读取此文件,可以使用

cvLoadImage()
,您可能已经使用过它。

如果出于某种神秘的原因,您实际上只将像素存储在文件中,那么您想要将它们读回

IplImage
结构是完全可以理解的。为此,您正在寻找的功能是
cvCreateImage()
:

IplImage* new_img = cvCreateImage(cvSize(width, height), /*img depth*/, /* nChannels*/);

创建

new_image
后,您需要将
mempcy()
像素读取到
new_image->imageData

但是,您需要事先知道图像的实际尺寸是多少才能使用这种方法。如果您只是将图像的像素存储在文件中,那么我建议您将图像的大小存储为文件名的一部分。

使用 OpenCV 函数处理图像的一个好处是您的系统将能够识别并显示它们(这对于调试目的非常重要)。


0
投票
img->imageData = malloc(a*img->widthStep);  //do this if you didnt allocate the memory before. a*img->widthStep shouldbe the right size of memor needed if imn ot wrong.   
for(int row=0; row<a;row++) 
{
     for(int col=0;col<b;col++) 
     { 
  ((uchar*)(img->imageData + row*img->widthStep))[col*img->nChannels +0] = pixel[row][col];
   // you didnt say what is th type of date in imadeData : put other casts if necessary.
        }
    }

您是否将 img->imageData 中的所有信息放入原始代码中的像素中?

所以,karlphillip 的答案:“你需要 mempcy() 将像素读取到 new_image->imageData”,这就是我在代码中所做的。

© www.soinside.com 2019 - 2024. All rights reserved.