【转】OpenCV仿射变换+投射变换+单…

原文来自 godenlove007的CSDN博客 http://blog.csdn.net/godenlove007/article/details/9364971
本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ 【转】OpenCV仿射变换+投射变换+单应性矩阵
  • estimateRigidTransform():计算多个二维点对或者图像之间的最优仿射变换矩阵 (2行x3列),H可以是部分自由度,比如各向一致的切变。
  • getAffineTransform():计算3个二维点对之间的仿射变换矩阵H(2行x3列),自由度为6.
  • warpAffine():对输入图像进行仿射变换
  • findHomography: 计算多个二维点对之间的最优单映射变换矩阵 H(3行x3列) ,使用最小均方误差或者RANSAC方法 
  • getPerspectiveTransform():计算4个二维点对之间的透射变换矩阵 H(3行x3列)
  • warpPerspective(): 对输入图像进行透射变换
  • perspectiveTransform():对二维或者三维矢量进行透射变换,也就是对输入二维坐标点或者三维坐标点进行投射变换。
  • estimateAffine3D:计算多个三维点对之间的最优三维仿射变换矩阵H (3行x4列)
  • transform():对输入的N维矢量进行变换,可用于进行仿射变换、图像色彩变换.
  • findFundamentalMat:计算多个点对之间的基矩阵H。
快速解决:
  • 问题1:如何计算3个二维点对之间的仿射变换矩阵?
答:使用getAffineTransform()。
  • 问题2:如何计算多个二维点对之间的仿射变换矩阵(使用误差最小准则 )?
答:使用estimateRigidTransform()或者findHomography。
  • 问题3:如何计算4个二维点对之间的透射变换?
答:使用getPerspectiveTransform()。
  • 问题4:如何计算多个三维点对之间的仿射变换?
答:使用estimateAffine3D。
  • 问题5:如何对输入图像进行仿射变换?
答:使用warpAffine()。
  • 问题6:如何对输入图像进行透射变换?
答:使用perspectiveTransform()。
  • 问题7:如何对输入的二维点对进行仿射变换?
答:使用transform()。
  • 问题8:如何对输入的三维点对进行投射变换?
答:使用perspectiveTransform()。
OpenCV和OpenGL是两个不同的计算机视觉和图形学库,它们的目的和使用场景也不同。OpenCV主要用于计算机视觉中的图像处理和分析,而OpenGL则用于图形渲染和3D图形处理。因此,将OpenCV仿射变换换为OpenGL需要一些额外的工作。 一种将OpenCV仿射变换换为OpenGL的方法是使用OpenGL的矩阵变换函数来处理。以下是一些步骤: 1. 定义一个OpenGL矩阵,将其初始化为位矩阵。 2. 使用OpenCV的getAffineTransform函数计算仿射变换矩阵。 3. 将OpenCV仿射变换矩阵换为OpenGL的矩阵格式。 4. 使用OpenGL的glLoadMatrix函数将OpenGL矩阵加载到OpenGL的模型视图矩阵堆栈中。 5. 使用OpenGL的glBegin和glEnd函数定义一个简的多边形或立方体,然后使用OpenGL的glTranslatef,glRotatef和glScalef函数来对其进行变换。 6. 使用OpenGL的glGetFloatv函数将变换后的多边形或立方体的顶点坐标读取回来。 以下是一些示例代码: // 定义OpenGL矩阵 GLfloat matrix[16]; memset(matrix, 0, sizeof(matrix)); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.0f; // 计算OpenCV仿射变换矩阵 cv::Mat src, dst; cv::Mat M = cv::getAffineTransform(src, dst); // 将OpenCV仿射变换矩阵换为OpenGL矩阵格式 matrix[0] = M.at<double>(0, 0); matrix[1] = M.at<double>(0, 1); matrix[3] = M.at<double>(0, 2); matrix[4] = M.at<double>(1, 0); matrix[5] = M.at<double>(1, 1); matrix[7] = M.at<double>(1, 2); // 加载OpenGL矩阵到模型视图矩阵堆栈中 glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glLoadMatrixf(matrix); // 定义一个简的多边形并进行变换 glBegin(GL_POLYGON); glVertex3f(-0.5f, -0.5f, 0.0f); glVertex3f(0.5f, -0.5f, 0.0f); glVertex3f(0.5f, 0.5f, 0.0f); glVertex3f(-0.5f, 0.5f, 0.0f); glEnd(); glTranslatef(1.0f, 0.0f, 0.0f); glRotatef(45.0f, 0.0f, 0.0f, 1.0f); glScalef(0.5f, 0.5f, 0.5f); // 读取变换后的多边形的顶点坐标 GLfloat vertices[12]; glGetFloatv(GL_MODELVIEW_MATRIX, vertices);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值