Opencv图像处理坐标系认识

转自:http://blog.csdn.net/liulina603/article/details/9376229

r--row 行坐标

c--column 列坐标

(x,y)对应的应该是(c,r)

例如:cvget2D(img,r,c)   取的是对应的直角坐标系中 (c,r)点的值

Mat orginmodify(Size(2 * orgin.cols, 2 * orgin.rows), CV_8UC3);
for (int i = 0; i < orgin.cols; i++)
{
for (int j = 0; j < orgin.rows; j++)
{
//orginmodify.at<cv::Vec3b>(ceil(0.5*orgin.cols) + j, ceil(0.5 *orgin.rows) + i) = orgin.at<cv::Vec3b>(j, i);
orginmodify.at<cv::Vec3b>(j,  i) = orgin.at<cv::Vec3b>(j, i);
}
}


实验基础

  本次实验通过一个简短的例子,主要来说明下面4个问题:

  1. 坐标体系中的零点坐标为图片的左上角,X轴为图像矩形的上面那条水平线;Y轴为图像矩形左边的那条垂直线。该坐标体系在诸如结构体Mat,Rect,Point中都是适用的。(OpenCV中有些数据结构的坐标原点是在图片的左下角,可以设置的)。

  2. 在使用image.at<TP>(x1, x2)来访问图像中点的值的时候,x1并不是图片中对应点的x轴坐标而是图片中对应点的y坐标。因此其访问的结果其实是访问image图像中的Point(x2, x1)点,即与image.at<TP>(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维向量。

  4. 多通道图像在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像素点其实有多个坐标,所以是不会给出的。因此在编程时,这2个位置应该给NULL。

 

  实验代码及注释

main.cpp: 

[html]  view plain copy
  1. #include <iostream>  
  2. #include <opencv2/core/core.hpp>  
  3. #include <opencv2/highgui/highgui.hpp>  
  4.   
  5. using namespace std;  
  6. using namespace cv;  
  7.   
  8. int main()  
  9. {  
  10.     Mat image, image_3c;  
  11.     image.create(Size(256, 256), CV_8UC1);  
  12.     image_3c.create(Size(256, 256), CV_8UC3);   //3通道的图像  
  13.     image.setTo(0);  
  14.     image_3c.setTo(0);  
  15.   
  16.     image.at<uchar>(10, 200) = 255; //使用at函数的地方,用的是10,200  
  17.     Point point(20, 100);  
  18.     image.at<uchar>(point) = 250;//使用at函数的地方,用的是Point(10,200)  
  19.   
  20.     image_3c.at<uchar>(10, 300) = 255;  
  21.     image_3c.at<uchar>(10, 302) = 254;  
  22.     Point point_3c(20, 200);  
  23.     image_3c.at<uchar>(point_3c) = 250;  
  24.   
  25.     double maxVal = 0; //最大值一定要赋初值,否则运行时会报错  
  26.     Point maxLoc;  
  27.     minMaxLoc(image, NULL, &maxVal, NULL, &maxLoc);  
  28.     cout << "单通道图像最大值: " << maxVal << endl;  
  29.     double min_3c, max_3c;  
  30.     //注意多通道在使用minMaxLoc()函数是不能给出其最大最小值坐标的,因为每个像素点其实有多个坐标,所以是不会给出的  
  31.     minMaxLoc(image_3c, &min_3c, &max_3c, NULL, NULL);  
  32.     cout << "3通道图像最大值: " << max_3c << endl;  
  33.   
  34.     imshow("image", image);  
  35.     imshow("image_3c", image_3c);  
  36.     waitKey(0);  
  37.     return 0;  
  38. }  


实验结果:

  单通道图像的输出结果如下所示:

  

  由上图可以看出,黑色的图像中有2个白色的点(读者可以仔细看下,由于只有1个像素点,所以需要自己找下,呵呵)的位置是不同的,因此可以证明Mat::at(x,y)和Mat::at(Point(x, y))是有区别的。

 

  3通道图像的输出结果如下所示:

  

  由上图可以看出,3通道的图像也是有2个点的,但是程序中在使用Mat::at(x, y)其y的值为300和302,这已经超出了图像的宽度256。这同时证明了实验基础中的第3点。

 

  后台输出结果如下:

  

 

  实验总结:由此可见,平时一定要注意一些细节上的东西。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值