OpenCV图像坐标系与行列宽高的关系

刚开始接触图像处理,关于图像坐标系与行列宽高的关系感到纠结,但是似乎没有更好的处理方法了,其对应关系大致如下

row == height == Point.y
col == width  == Point.x

lena

这是因为在计算机中,图像是以矩阵的形式保存的。

一张宽度640像素、长度480像素的灰度图保存在一个480 * 640的矩阵中。

先行后列。

而我们习惯的坐标表示是先X横坐标,再Y纵坐标。在OpenCV中需要对矩阵进行计算,先行再列。

这种隐形的错误需要细心。

一个典型的程序示例:

#include<opencv2/opencv.hpp>

using namespace cv;

int main() {

	Mat srcImage = imread("Lenna.png");
	Mat logo = imread("smile.png");

	Mat imageROI;

	imageROI = srcImage(Rect(0, 100, logo.cols, logo.rows));
	//imageROI = srcImage(Range(0, 0 + logo.cols), Range(100, 00 + logo.rows));

	Mat mask = imread("smile.png", 0);

	logo.copyTo(imageROI, mask);

	namedWindow("LOL");
	imshow("LOL", srcImage);

	waitKey(0);

	return 0;
}

这里

template<typename _Tp> inline
Rect_<_Tp>::Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height)
    : x(_x), y(_y), width(_width), height(_height) {}

Rect的构造函数给定的X,Y坐标即为矩形的左上角坐标。
设置为(0,100),效果如下。

![rect](https://img-blog.csdnimg.cn/img_convert/ead25412ced13f9b0f0537f663848da4.png)

对比例程

#include<opencv2/opencv.hpp>

using namespace cv;

int main() {

	Mat srcImage = imread("Lenna.png");
	Mat logo = imread("logo.jpg");

	Mat imageROI;

	//imageROI = srcImage(Rect(0, 200, logo.cols, logo.rows));
	imageROI = srcImage(Range(0, 0 + logo.cols), Range(200, 200 + logo.rows));

	Mat mask = imread("logo.jpg", 0);

	logo.copyTo(imageROI, mask);

	namedWindow("LOL");
	imshow("LOL", srcImage);

	waitKey(0);

	return 0;
}

这里是直接从源图像中截取出片区域,选取的是一个从0行,200列坐标点开始的一片宽 x 高的区域。

![dota](https://img-blog.csdnimg.cn/img_convert/d5554202635bbd0087d37128f562196d.png)

补充(详细解释)

  1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。(虽然网上有学着说OpenCV中有些数据结构的坐标原点是在图片的左下角,但是我暂时还没碰到过)。

  2. 在使用image.at(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标,而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at(Point(x2, x1))效果相同。

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

### 回答1: OpenCV 是一个计算机视觉库,它提供了许多功能来处理和分析图像,包括识别、跟踪、检测等。在 OpenCV 中,图像坐标系是指在二维平面上的任何点的 x 和 y 坐标。此坐标系的原点(0, 0)位于图像的左上角,x 正方向向右延伸,y 正方向向下延伸,因此可以按照 (x,y) 的顺序访问图像像素。在 OpenCV 中,图像坐标系一般使用像素单位,即每个像素都有一个唯一的坐标值。 因此,已知了图像坐标系,就可以根据坐标值对图像进行处理,如绘制图形、分割图像、检测物体等。在 OpenCV 中,还可以使用像素值来表示不同的颜色或灰度,从而对彩色或灰度图像进行处理。总之,图像坐标系OpenCV 中非常基础和重要的概念,对于图像处理和分析有着重要的作用。 ### 回答2: OpenCV是一个开源的计算机视觉库,已知图像坐标系是其中的重要概念之一。在OpenCV中,图像坐标系是一种二维坐标系,其中原点位于左上角,x轴沿图像向右延伸,y轴沿图像向下延伸。 OpenCV在处理图像时常常需要使用图像坐标系,比如在进行图像处理、目标检测、跟踪等一系列计算时。通过已知图像坐标系,可以精确确定图像中的目标位置、大小等信息,从而帮助我们更好地分析图像,并且对于计算机视觉任务的实现也非常重要。 对于OpenCV图像坐标系的处理,常常需要将其转化为世界坐标系或相机坐标系等3D坐标系,以便更好地进行目标检测、跟踪、姿态估计等任务。因此,对于OpenCV中的图像坐标系的理解和应用是计算机视觉工程师必备的基础能力之一。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值