使用OpenCV实现透视变换

部署运行你感兴趣的模型镜像

1 透视变换

透视变换(Perspective Transformation)是将成像投影到一个新的视平面(Viewing Plane),也称作投影映射(Projective Mapping)。如下图所示,通过透视变换ABC变换到A’B’C’。

在这里插入图片描述

2 使用OpenCV实现透视变换

2.1 getPerspectiveTransform

由四对点计算透射变换,返回由源图像中矩形到目标图像矩形变换的矩阵。

在这里插入图片描述

2.2 warpPerspective

使用getPerspectiveTransform得到的透视变换矩阵,对图像进行透视变换,返回的是相同size的图片。

在这里插入图片描述

3 代码实现

3.1 C++

#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() );
 
	/// 设置4组点,求出变换矩阵
	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 );
 
	//计算4个二维点对之间的仿射变换矩阵(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;
}

3.2 Python

import cv2 as cv
import numpy as np
img = cv.imread("test/scene2.png",0)
w,h = img.shape
point1 = np.array([[308,230],[500,230],[308,640],[500,640]],dtype = "float32")
point2 = np.array([[308,230],[500,230],[155,30],[835,30]],dtype = "float32")
M = cv.getPerspectiveTransform(point1,point2)
out_img = cv.warpPerspective(img,M,(w,h))
cv.imshow("img",out_img)
cv.waitKey(0)

4 参考

[1] OpenCV官方文档:

  • getPerspectiveTransform: https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform
  • warpPerspective: https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#warpperspective

[2] https://www.cnblogs.com/aoru45/p/9763983.html

[3] https://blog.youkuaiyun.com/i_chaoren/article/details/78324184

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值