使用函数CVPTR2D()将指针指向中间的通道(“绿色”)

看到网上很多人使用

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");
}
复制代码

被注解掉的部分则是典型的错误答案。

你可能感兴趣的:(函数)