您的位置:首页 > 运维架构

OpenCV显示图像时,不同位深度的影响

2012-10-23 17:55 218 查看
最近在搞一个视频监控的项目,要用OpenCV库进行处理,但这两天一直有一个问题很纠结我,就是,处理过后的图像老是显示不正确,做了各种测试,具体问题可以用下面的例子阐明;

#include <stdio.h>

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

int main()
{
IplImage *test, *pFrame;
CvCapture *pCapture;

char pathName[256];
printf("请输入视频文件的路径名:");
scanf("%s",pathName);

pCapture = cvCreateFileCapture(pathName);
if (pCapture == NULL)
{
printf("输入的视频文件有问题\n");
return 0;
}

if (pFrame = cvQueryFrame(pCapture))
{
test = cvCreateImage(cvGetSize(pFrame), IPL_DEPTH_32F, 3);

cvConvertScale(pFrame, test, 1);

cvNamedWindow("original", 1);
cvNamedWindow("converted", 1);

cvShowImage("original", pFrame);
cvShowImage("converted", test);

//cvDestroyAllWindows();
}
for (;;)
{
if (cvWaitKey(2) >= 0)
break;
}
cvReleaseImage(&test);
cvReleaseCapture(&pCapture);

return 0;
}


程序的显示结果如下:





当时我想cvConvertScale(pFrame, test, 1)只是复制了图像数据,并没有进行比例变换呀。所以很郁闷。

然后我进行了如下尝试:

cvSaveImage("test.bmp", test);
test = cvLoadImage("test.bmp", CV_LOAD_IMAGE_ANYCOLOR | CV_LOAD_IMAGE_ANYDEPTH);
cvShowImage("converted", test);
结果显示正确了:



为什么会保存之后在读取显示会正确呢,那么在保存的时候,cvSaveImage函数一定做了什么事情。经过调试发现,保存前test数据的位深度是IPL_DEPTH_32F即32位的,而保存后读取的test数据的位深度是8位的。也就是说cvSaveImage函数在存储时把3通道32位的图像变成了3通道8位的图像。

然而查阅手册时发现,只有8位单通道或者3通道(通道顺序为'BGR' )可以使用这个函数保存,如果格式,深度或者通道不符合要求,请先用cvCvtScale 和cvCvtColor转换;或者使用通用的cvSave保存图像为XML或者YAML格式。最新的OpenCV 2.3.2 documentation也是这么说的。

然后我就纠结了,好吧,这个问题先放下。

上面所说的问题主要是由于图像位深度的原因,在显示的时候利用cvConvertScale()进行转换一下就可以了。

以后再补充吧。打球回来太累了。

21:23 Otc 23, 2012 @lab
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: