OpenCV—透视变换warpPerspective

下图是维基百科中对透视投影的解释:https://zh.wikipedia.org/wiki/%E9%80%8F%E8%A7%86%E6%8A%95%E5%BD%B1


透视变换矩原理可以参见博客:http://blog.csdn.net/xiaowei_cqu/article/details/26471527

opencv中实现透视变换主要是以下两个API:

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[])

详细参数参见官方文档:

warpPerspective

https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#warpperspective

getPerspectiveTransform

https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform

示例源代码如下:

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

/// 全局变量
const char* source_window = "Source image";;
const char* warpPerspective_window = "warpPerspective";

/**
 * @主函数
 */
int main( )
{
	Point2f srcTri[4];
	Point2f dstTri[4];

	Mat warpPerspective_mat( 3, 3, CV_32FC1 );
	Mat src, warpPerspective_dst;

	/// Load the image
	src = imread( "lena.bmp", IMREAD_COLOR );

	/// Set the dst image the same type and size as src
	warpPerspective_dst = Mat::zeros( src.rows, src.cols, src.type() );

	/// 设置三组点,求出变换矩阵
	srcTri[0] = Point2f( 0,0 );
	srcTri[1] = Point2f( src.cols - 1,0 );
	srcTri[2] = Point2f( 0,src.rows - 1);
	srcTri[3] = Point2f(src.cols - 1,src.rows - 1);

	dstTri[0] = Point2f( 0,src.rows*0.13 );
	dstTri[1] = Point2f( src.cols*0.9,0 );
	dstTri[2] = Point2f( src.cols*0.2,src.rows*0.7 );
	dstTri[3] = Point2f( src.cols*0.8,src.rows );

	//计算3个二维点对之间的仿射变换矩阵(2行x3列)
	warpPerspective_mat = getPerspectiveTransform( srcTri, dstTri );

	//应用仿射变换,可以恢复出原图
	warpPerspective( src, warpPerspective_dst, warpPerspective_mat, src.size() );

	//显示结果
	namedWindow( source_window, WINDOW_AUTOSIZE );
	imshow( source_window, src );

	namedWindow( warpPerspective_window, WINDOW_AUTOSIZE );
	imshow( warpPerspective_window, warpPerspective_dst );
  /// 等待,直到用户退出
  waitKey(0);
  return 0;
}

程序执行结果如下所示:

发布了89 篇原创文章 · 获赞 210 · 访问量 47万+

猜你喜欢

转载自blog.csdn.net/i_chaoren/article/details/78324184