如何从已保存在文件中的像素显示图像?

时间:2012-01-10 00:38:26

标签: c++ opencv computer-vision vision

我使用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]; 

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

2 个答案:

答案 0 :(得分: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函数处理图像的一个好处是,您的系统将能够识别并显示它们(这对于调试来说非常重要)。

答案 1 :(得分: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-&gt; imageData中的所有信息并将其放在原始代码中的像素中?

所以,karlphillip的回答:&#34;你需要mempcy()读取到new_image-&gt; imageData&#34;就是我在我的代码中所做的。