一 original属性问题
在使用opencv显示图像时会出现图像倒立的情况,IplImage的origin属性有关系。origin为0表示顶左结构,即图像的原点是左上角,如果为1为左下角。一般从硬盘读入的图片或者通过cvCreateImage方法创建的IplImage图片默认的origin为0,即显示的时候都是正的。而由摄像头或者视频文件获取的帧图像origin为1,此时显示的时候扫描顺序根据当前的图像的原点在左下角因此会是从下到上扫描,所以显示也是正的。
二 彩色图像变成灰度图像
IplImage* colorImage = cvCreateImage( cvSize(IMG_WIDTH,IMG_HEIGHT),IPL_DEPTH_8U,3);(此时刚定义的时候 colorImage->origin = 0)
IplImage* grayColorImage = cvCreateImage( cvSize(IMG_WIDTH,IMG_HEIGHT),IPL_DEPTH_8U,1);(此时刚定义的时候 grayColorImage->origin = 0)
将执行colorImage = cvRetrieveFrame(capture_Color);之后,此时会发生变化,结果为colorImage->origin =1;
然后我们将
cvCvtColor(colorImage,grayColorImage,CV_BGR2GRAY);(注意opencv读取进来的图像是按照BGR格式读取的,而不是matlab中的RGB格式),这个时候
由于grayColorImage->origin = 0,即我们创建的灰度图像的原点(0,0)在左上角,而彩色图像原点(0,0)却是左下角 ,此时彩色图像会将
它的第i行(从图像下往上算的)也会给灰度图像的第i行(此时灰度图像的第i行是从上到下排列的),因此图像会出现倒立。
解决方法:
将grayColorImage->origin = colorImage->origin;即灰度图像也变成原点(0,0)在左下角。此时在用cvShowImage显示就没有问题呢!!!
三 总结
无论图像的原点是左上角还是左下角(对于显示来说这个不是很重要),opencv都能显示正确,它是通过判断图像原点在哪里,然后再根据那个来扫描显示的。