看到网上很多人使用
CvMat * Mdata;
Mdata= cvCreateMat(100,100,CV_8UC3);
//将矩阵数据赋值为0;
cvZero(Mdata);
//pData指针指向中间通道
uchar * pData = cvPtr2D(Mdata,1,0,NULL);
|
这个程序段来访问图像的中间通道。不解cvPtr2D函数中的第二,三个参数值分别取1,0 怎么就是指向中间通道?!
我认为它只是指向坐标(1,0)元素的第一个通道,cvPtr2D( )函数返回一个指向所需元素的指针,那么第二通道的访问代码应该是
CvMat * Mdata;
Mdata= cvCreateMat(100,100,CV_8UC3);
//将矩阵数据赋值为0;
cvZero(Mdata);
//pData指针指向中间通道
uchar * pData = cvPtr2D(Mdata,i,j,NULL)+1;
|
所以,对月题目:先定义一个数组,再使用函数cvPtr2D()将指针指向中间的通道(“绿色”),以给定的两个点画一个绿色的长方形的程序应该为:
#include "cv.h" #include "highgui.h" int main(int argc, char** argv){ IplImage *img; img = cvCreateImage(cvSize(100,100),IPL_DEPTH_8U,3); cvZero(img); //uchar* pData = cvPtr2D(img,1,0,NULL); //cvRectangle(img,cvPoint(20,5),cvPoint(40,20),cvScalar(0,255,0),1); int left = 20,top=5,right=40,bottom = 20; for( ;left<=right;left++) { *(cvPtr2D(img,left,top,NULL)+1)=255; *(cvPtr2D(img,left,bottom,NULL)+1)=255; } left=20; for( ;top<=bottom;top++) { *(cvPtr2D(img,left,top,NULL)+1)=255; *(cvPtr2D(img,right,top,NULL)+1)=255; } cvNamedWindow("source",CV_WINDOW_AUTOSIZE); cvShowImage("source",img); cvWaitKey(0); cvReleaseImage(&img); cvDestroyWindow("source"); }
被注解掉的部分则是典型的错误答案。