您的位置:首页 > 其它

学习笔记——CV_IMAGE_ELEM

2012-12-07 15:21 295 查看
        做关于图像的程序,经常都会使用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过呢?哈哈~~~~~成长的路是艰辛的啊~

——菜鸟的学习笔记,希望和你一起进步!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: