您的位置:首页 > 其它

CV_IMAGE_ELEM读取某点的像素

2014-11-05 14:46 204 查看
本文转载自:http://blog.csdn.net/haozivv/article/details/7174630

可以使用opencv定义的宏来提取象素值

假设灰度图像image,存取其i行j列的象素可以这样:CV_IMAGE_ELEM(image, uchar,y, x)

如果是彩色图像就是

CV_IMAGE_ELEM(image, uchar,y, 3*x)

CV_IMAGE_ELEM(image, uchar,y, 3*x+1)

CV_IMAGE_ELEM(image, uchar,y, 3*x+2)

CV_IMAGE_ELEM是一个宏,

#define CV_IMAGE_ELEM( image, elemtype, row, col ) \

(((elemtype*)((image)->imageData + (image)->widthStep*(row)))[(col)])

#define CV_MAT_ELEM( mat, elemtype, row, col ) \

(*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

呵呵,我一直把它当一个函数用,其实本质也没有什么区别的

但要想正确的得到图像的坐标为(x,y)点的像素值,是应该这样写CV_IMAGE_ELEM(Image, uchar, y, x)

要注意像素点的坐标xy和行列值的顺序是相反的(可以仔细思考为什么)

我刚开始一直写成CV_IMAGE_ELEM(Image, uchar, x, y),结果有时候就造成了访问image越界,从而报错,花了好长时间才捣鼓出来,

不过将IMAGE的数据按照原来的样子复制到mat中可以这么写:

CV_IMAGE_ELEM(pImage, uchar, i, j) = CV_MAT_ELEM(*mat, uchar, i, j)

不用改变顺序

总之,当应用这个宏是如果老报错,就试试换个顺序,或者检查访问的地址是否越界

本文转载自:http://blog.csdn.net/haozivv/article/details/7174630
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: