一、像素坐标系

OpenCV中像素坐标系的坐标原点在图像的左上角,这种坐标系在结构体Mat,Rect,Point中都是适用的。在Point(x,y)和Rect(x,y)中,第一个参数x代表的是元素所在图像的列数,第二个参数y代表的是元素所在图像的行数。

坐标体系的X轴为图像矩形的上面那条水平线,从左往右;Y轴为图像矩形左边的那条垂直线,从上往下。

以图像左上角为原点建立以像素为单位的直接坐标系u-v。像素的横坐标u与纵坐标v分别是在其图像数组中所在的列数与所在行数。(在OpenCV中u对应x,v对应y)

下面一张图能更好地展示opencv中像素坐标系:

点(3,4)表示的是从原点起,向下数四行,向右数三列。相对位置都是以0为索引开始计算,即图像坐标系先按宽,再按高进行索引,即(W,H)

二、操作像素的方法

1、at方法

这里要注意at中(i,j)的顺序表示的是第i行第j列,跟Point(i,j)和Rect(i,j)中表示第j行第i列是相反的。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1))效果相同。

演示程序如下:

#include

#include

#include

using namespace cv;

using namespace std;

int main()

{

Mat image(Size(500,500),CV_8UC3);

image.at(100,250)[0]=0;

image.at(100,250)[1]=0;

image.at(100,250)[2]=255;

putText(image,"at(100,250) is Here!",Point(250,100),0,0.7,Scalar(255,0,0));

image.at(Point(100,250))[0]=0;

image.at(Point(100,250))[1]=0;

image.at(Point(100,250))[2]=255;

putText(image,"at(Point(100,250)) is Here!",Point(100,250),0,0.7,Scalar(255,0,0));

imshow("Test Function at",image);

waitKey();

return 0;

}

NOTE:

如果所画图像是多通道的,比如说image图像的通道数时n,则使用Mat::at(x, y)时,其x的范围依旧是0到image的height,而y的取值范围则是0到image的width乘以n,因为这个时候是有n个通道,所以每个像素需要占有n列。但是如果在同样的情况下,使用Mat::at(point)来访问的话,则这时候可以不用考虑通道的个数,因为你要赋值给获取Mat::at(point)的值时,都不是一个数字,而是一个对应的n维向量。

如一幅3通道的彩色图像image的第i行j列的B、G、R分量分别表示为:

image.at(i,j)[0];

image.at(i,j)[1];

image.at(i,j)[2];

REF:

https://blog.csdn.net/lz0499/article/details/80978433

https://blog.csdn.net/liulina603/article/details/9376229

https://blog.csdn.net/dcrmg/article/details/51843295