做关于图像的程序,经常都会使用OpenCV,使用OpenCV又经常会使用一个重要的结构IplImage,使用这个结构又要经常对结构中的数据进行访问读写,所以就不得不对CV_IMAGE_ELEM记忆深刻了。
CV_IMAGE_ELEM(image,elemtype,row,col)是个宏定义,原来的访问函数较复杂,所以定义一个简单而方便使用的宏函数。
image参数为IplImage *指针,elemtype为数据类型,常为uchar,row和col分别是数据矩阵的行和列。
灰度图像为单通道,访问时使用CV_IMAGE_ELEM(image,uchar,i,j);
三通道的彩色图像,访问时使用CV_IMAGE_ELEM(image,uchar,i,j*3);CV_IMAGE_ELEM(image,uchar,i,j*3+1);CV_IMAGE_ELEM(image,uchar,i,j*3+2);访问三个通道的值。
值得注意的是初学者容易将i和j写反了,这样就出现了访问出界的错误,i的上限是img->height,而j的上限是img->width。
但这是情有可原的,因为OpenCV中CvRect和CvPoint等常用的结构使用的是点的坐标:
cvRect(int x,int y,int width,int height)和cvPoint(int x,int y)中的x上限是img->width,y上限是img->height。
也就是说,如果(i,j)这个点对应的像素值为CV_IMAGE_ELEM(image,uchar,i,j),那么它对应的点就是cvPoint(j,i)。
我在使用OpenCV之初,参考那本OpenCV的书,喜欢使用两个cvGetReal2D和cvSetReal2D两个函数访问图像数据,后来才发现这两个函数的速度是相当慢的,改为CV_IMAGE_ELEM的话速度简直飞速提高,你是不是也和我一样2过呢?哈哈~~~~~成长的路是艰辛的啊~
——菜鸟的学习笔记,希望和你一起进步!