Opencv关于成员函数data,step,at的使用
发布时间
阅读量:
阅读量
我们为了解决一个具体的问题深入研究这些成员函数的技术细节:这个方法帮助我们在实际项目中应用所学知识。
2.现在希望获得图片color中,位于第v行第u列的像素点的BGR值,先放代码:
//方法一:
//程序上方读取了一张图片color
color.data[ v*color.step + u*color.channels() ]; //B
color.data[ v*color.step + u*color.channels() +1 ]; //G
color.data[ v*color.step + u*color.channels() +2 ]; //R
//方法二:
//程序上方读取了一张图片color
color.at<cv::Vec3b>(v, u)[0]; //B
color.at<cv::Vec3b>(v, u)[1]; //G
color.at<cv::Vec3b>(v, u)[2]; //R
3.解析:
方法一解析:
color.step的作用是什么?可以从图片的color属性入手分析其功能定位。具体而言,在这一实例中图片宽度为640像素、高度为480像素。

在方法一中使用的代码涉及成员函数step,在该函数中其返回值为1920(如前所述, 图片的宽度为640, 巧合的是640乘以3等于1920)
为了详细讲解成员函数step呢?
该成员函数step表示该Mat对象一行占用的数据字节数。
由此可知,在处理具有三个颜色通道的颜色对象(图像对象)color时,调用color.step方法后会返回与图像宽度相等但乘以三的结果。具体来说,在图像中每一个像素占据三个连续的字节空间,并且这些字节依次存储着红(R)、绿(G)、蓝(B)三个分量的数值信息。通过观察内存布局可以推断出该图像采用的是8位无符号数编码方式。
回到方法一的代码块中,代码是如何通过v,u定位某个像素的呢?
//当(v,u)=(0,0)时,本人通过测试得知:
color.data[ 0*color.step + 0*color.channels() ] = color.data[0]
color.data[ 0*color.step + 0*color.channels() +1] = color.data[1]
color.data[ 0*color.step + 0*color.channels() +2] = color.data[2]
//当(v,u)=(0,1)时,本人通过测试得知:
color.data[ 0*color.step + 1*color.channels() ] =color.data[3]
color.data[ 0*color.step + 1*color.channels() +1] = color.data[4]
color.data[ 0*color.step + 1*color.channels() +2] = color.data[5]
//当(v,u)=(1,0)时,本人通过测试得知:
color.data[ 1*color.step + 0*color.channels() ] =color.data[1920]
color.data[ 1*color.step + 0*color.channels() +1] = color.data[1921]
color.data[ 1*color.step + 0*color.channels() +2] = color.data[1922]
不知道说完上面的测试后,能不能让我讲明白这个step和(v,u)的定位呢…
改写说明
方法二解析:
貌似还是方法二更直观,解析嘛…就不班门弄斧…
全部评论 (0)
还没有任何评论哟~
