opencv学习 密集透射变换

举报
kobesdu 发表于 2022/03/25 09:00:44 2022/03/25
【摘要】 1 简介透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维平面变换矩阵,而透视变换本质上空间立体三维变换,根据其次坐标方差,要把三维坐标投影到另外一个视平面,就需要一个完全不同的变换矩阵M,所以这个是透视变换跟OpenCV中几何仿射变换最大的不同。我们经常提到的...

1 简介

透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维平面变换矩阵,而透视变换本质上空间立体三维变换,根据其次坐标方差,要把三维坐标投影到另外一个视平面,就需要一个完全不同的变换矩阵M,所以这个是透视变换跟OpenCV中几何仿射变换最大的不同。我们经常提到的对图像的透视变换都是指密集透视变换。而稀疏透视变换在OpenCV的特征点匹配之后的特征对象区域标识中经常用到。一般情况下密集透视变换warpPerspective函数常与函数getPerspectiveTransform一起使用实现对图像的透视校正。而稀疏透视变换perspectiveTransform经常与findhomography一起使用。

2 API介绍

总体步骤是先用cvGetPerspectiveTransform(形变,拉伸,收缩,源目标图像四个点对应确定)求出变换矩阵,然后用cvWarpPerspective进行密集透视变换。由四对点计算透射变换

 

函数warpPerspective参数:

InputArray src:输入的图像

OutputArray dst:输出的图像

InputArray M:透视变换的矩阵

Size dsize:输出图像的大小

int flags=INTER_LINEAR:输出图像的插值方法,

CvMat* cvGetPerspectiveTransform参数:

src   输入图像的四边形顶点坐标。

dst   输出图像的相应的四边形顶点坐标。

map_matrix  指向3×3输出矩阵的指针。

 

3 代码如下

 

#include "stdafx.h"

#include <cv.h>

#include <highgui.h>

 

int main(int argc, char** argv)

{

   CvPoint2D32f srcQuad[4], dstQuad[4];

   CvMat* warp_matrix = cvCreateMat(3,3,CV_32FC1);

   IplImage *src, *dst;

    if( argc == 1 && ((src=cvLoadImage("lena.jpg",1)) != 0 ))

    {

   dst = cvCloneImage(src);

   dst->origin = src->origin;

   cvZero(dst);

 

 

   srcQuad[0].x = 0;           //src Top left

   srcQuad[0].y = 0;

   srcQuad[1].x = src->width - 1;  //src Top right

   srcQuad[1].y = 0;

   srcQuad[2].x = 0;           //src Bottom left

   srcQuad[2].y = src->height - 1;

   srcQuad[3].x = src->width - 1;  //src Bot right

   srcQuad[3].y = src->height - 1;

      //- - - - - - - - - - - - - -//

   dstQuad[0].x = src->width*0.05;  //dst Top left

   dstQuad[0].y = src->height*0.33;

   dstQuad[1].x = src->width*0.9;  //dst Top right

   dstQuad[1].y = src->height*0.25;

   dstQuad[2].x = src->width*0.2;  //dst Bottom left

   dstQuad[2].y = src->height*0.7;      

   dstQuad[3].x = src->width*0.8;  //dst Bot right

   dstQuad[3].y = src->height*0.9;

 

 

   cvGetPerspectiveTransform(srcQuad,dstQuad,

                                     warp_matrix);//由四对点计算透射变换

 

 

   cvWarpPerspective(src,dst,warp_matrix);//对图像进行透视变换

 

 

   cvNamedWindow( "Perspective_Warp", 1 );

      cvShowImage( "Perspective_Warp", dst );

      cvWaitKey();

    }

   cvReleaseImage(&dst);

   cvReleaseMat(&warp_matrix);

    return 0;

}

 

4 运行结果截图

 

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。