首页 > 《学习OpenCV》第三章习题 第3题

《学习OpenCV》第三章习题 第3题

这是一个很有意思的题目,通过这个题我们可以理解图形的内部存储和cvPtr*D函数族的使用方法。

简单来说,图像就是矩阵,在一般的图像中,每个像素中存储了3个变量,分别代表BGR三通道的值,cvPtr*D函数族就是帮助我们快速定位到矩阵中的每个像素点,如本题,我们希望从起始点开始绘制矩形,于是我将从cvPtr2D的参数设置为(left,top)也就是(20,5)。于是函数马上返回一个指针指向那个像素点的第一个变量,也就是蓝色通道的值,由于我们需要的是绿色通道,所以将指针加1让他指向绿色通道的值。

 

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"int main(int argc, char** argv)
{IplImage *img;img = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 3);cvZero(img);int right = 40, bottom = 20, top = 5, left = 20;for (; top <= bottom; top++){*(cvPtr2D(img, left, top, NULL) + 1) = 255;*(cvPtr2D(img, right, top, NULL) + 1) = 255;}top = 5;for (; left <= right; left++){*(cvPtr2D(img, left, top, NULL) + 1) = 255;*(cvPtr2D(img, left, bottom, NULL) + 1) = 255;}cvNamedWindow("test", CV_WINDOW_AUTOSIZE);cvShowImage("test", img);cvWaitKey();return 0;
}

结果显示的图像是这样的:

是不是和我们想象中的不太一样?好像在纵向是20~40,横向是5~20。难道说在图像处理的时候,x轴是纵向而y轴是横向吗?我们再想想,cvPtr2D的参数是idx0和idx1,并不是所谓的横纵坐标,而是矩阵的下标,也就是说idx0是指行下标,idx1是指列下标,这下我们就明白了,x轴实际对应的是列,y轴对应的是行。

因此需要修改一下代码,如下:

#include "stdafx.h"
#include "cv.h"
#include "highgui.h"int main(int argc, char** argv)
{IplImage *img;img = cvCreateImage(cvSize(200, 200), IPL_DEPTH_8U, 3);cvZero(img);int right = 40, bottom = 20, top = 5, left = 20;for (; top <= bottom; top++){*(cvPtr2D(img, top, left , NULL) + 1) = 255;*(cvPtr2D(img, top, right, NULL) + 1) = 255;}top = 5;for (; left <= right; left++){*(cvPtr2D(img, top, left, NULL) + 1) = 255;*(cvPtr2D(img, bottom, left, NULL) + 1) = 255;}cvNamedWindow("test", CV_WINDOW_AUTOSIZE);cvShowImage("test", img);cvWaitKey();return 0;
}

这样运行之后,会是下面的结果:

这下就没问题了~

转载于:https://www.cnblogs.com/sixfancy/p/3482680.html

更多相关: