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

来源:互联网 发布:大型网络3d手游2016年 编辑:程序博客网 时间:2024/05/19 02:00

最近在搞一个视频监控的项目,要用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

原创粉丝点击