一、像素坐标系
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<TP>(Point(x2, x1))效果相同。
演示程序如下:
#include<iostream>
#include<core/core.hpp>
#include<highgui/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat image(Size(500,500),CV_8UC3);
image.at<Vec3b>(100,250)[0]=0;
image.at<Vec3b>(100,250)[1]=0;
image.at<Vec3b>(100,250)[2]=255;
putText(image,"at(100,250) is Here!",Point(250,100),0,0.7,Scalar(255,0,0));
image.at<Vec3b>(Point(100,250))[0]=0;
image.at<Vec3b>(Point(100,250))[1]=0;
image.at<Vec3b>(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<Vec3b>(i,j)[0];
image.at<Vec3b>(i,j)[1];
image.at<Vec3b>(i,j)[2];
REF:
https://blog.csdn.net/lz0499/article/details/80978433