opencv中的像素坐标系与操作像素的方法

一、像素坐标系

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

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

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值