OpenCV显示图像时,不同位深度的影响
2012-10-23 17:55
218 查看
最近在搞一个视频监控的项目,要用OpenCV库进行处理,但这两天一直有一个问题很纠结我,就是,处理过后的图像老是显示不正确,做了各种测试,具体问题可以用下面的例子阐明;
程序的显示结果如下:
![](http://img.my.csdn.net/uploads/201210/23/1350997579_3737.JPG)
![](http://img.my.csdn.net/uploads/201210/23/1350997597_8362.JPG)
当时我想cvConvertScale(pFrame, test, 1)只是复制了图像数据,并没有进行比例变换呀。所以很郁闷。
然后我进行了如下尝试:
![](http://img.my.csdn.net/uploads/201210/23/1350997615_3612.JPG)
为什么会保存之后在读取显示会正确呢,那么在保存的时候,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
#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
相关文章推荐
- opencv Mat 显示不同数据类型图像
- opencv python 显示图像
- 利用GDI+在MFC中显示OpenCV中的Mat图像的关键点
- OPENCV系列(一) 读取图像中任意点的像素值,并显示坐标
- Opencv学习三-图像的载入,显示和输出
- OpenCV学习(一)显示图像
- Python for opencv 之 显示图像及在图像上书写文字
- OpenCV对不同图像深度的处理
- python3.4实现调用opencv3.1.0显示图像
- OpenCV如何把图像显示到MFC的picture控件上
- 【OpenCV学习笔记】【函数学习】十一(读入图像﹑显示图像和保存图像)
- opencv的Mat图像显示在MFC控件中
- openCV图像读取显示 ——pkg-config && LD_LIBRARY_PATH
- opencv 图像显示函数使用
- 初学openCV 之从文件中读入一幅图像,将之反色并显示
- OpenCV学习篇之一 显示图像
- 题目:利用OpenCV3.1.0从磁盘加载并显示一副图像
- Opencv学习笔记-显示图像
- OpenCV 学习笔记(1)显示图像
- Opencv学习_2 (opencv结构&显示图像)