在图形图像开发过程中,经常会用到opencv和opengl,有时候还是会搞混坐标系,导致画面上下反转。本文记录下gl和cv的坐标差异,是不是可以温习下。
坐标系统
OpenGL使用的是右手笛卡尔坐标系统,Z正轴垂直屏幕向外,X正轴从左到右,Y正轴从下到上。
右手定则:以右手握住z轴,当右手的四指从正向x轴以π/2角度转向正向y轴时,大拇指的指向就是z轴的正向。[左手定则同理]
世界坐标系:在现实世界中,所有的物体都具有三维特征,但计算机本身只能处理数字,显示二维的图形,将三维物体及二维数据联系在一起的唯一纽带就是坐标。为了使被显示的三维物体数字化,要在被显示的物体所在的空间中定义一个坐标系。这个坐标系的长度单位和坐标轴的方向要适合对被显示物体的描述,这个坐标系称为世界坐标系。世界坐标系是始终固定不变的。
世界坐标系以屏幕中心为原点(0, 0, 0),在OpenGL中用来描述场景的坐标。比如使用这个坐标系来描述物体及光源的位置。世界坐标系,是不会被改变的。
局部坐标系:OpenGL还定义了局部坐标系的概念,所谓局部坐标系,也就是坐标系以物体的中心为坐标原点,物体的旋转或平移等操作都是围绕局部坐标系进行的,这 时,当物体模型进行旋转或平移等操作时,局部坐标系也执行相应的旋转或平移操作。需要注意的是,如果对物体模型进行缩放操作,则局部坐标系也要进行相应的 缩放,如果缩放比例在案各坐标轴上不同,那么再经过旋转操作后,局部坐标轴之间可能不再相互垂直。无论是在世界坐标系中进行转换还是在局部坐标系中进行转 换,程序代码是相同的,只是不同的坐标系考虑的转换方式不同罢了。
视坐标系:以视点为原点,以视线方向为Z轴正方向的坐标系。OpenGL会将世界坐标系先变换到视坐标系,然后进行裁剪,只有在视见体之内的场景才会进入下一个阶段进行处理。
屏幕坐标系:计算机对数字化的显示物体作了加工处理后,要在图形显示器上显示,这就要在图形显示器屏幕上定义一个二维直角坐标系,这个坐标系称为屏幕坐标系。这个坐标系坐标轴的方向通常取成平行于屏幕的边缘,坐标原点取在左下角,长度单位常取成一个象素。
Opencv 坐标系
opencv 的原点位于屏幕的左上方,所以访问的时候要注意跟OpenGL的坐标系进行区分.
1) 该坐标系在诸如结构体Mat,Rect,Point中都是适用的
cols == width == Point.x;
rows == height == Point.y;
2)在使用image.at(i,j)来访问像素点的时候, i 应该为Mat的行号, j为Mat的列好, 区别与图片坐标系中的坐标。
Mat::at(Point(x,y)) == Mat::at(y,x);
参考
http://www.songho.ca/opengl/gl_projectionmatrix.html
文档信息
- 本文作者:Kiah Zhao
- 本文链接:/2022/12/01/gl_cv_coordinates/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)