OpenCV:透视变换

37 篇文章 4 订阅
34 篇文章 4 订阅

一、话说透视变换

 透视变换是将图像从一个视平面投影到另外一个视平面的过程,所以透视变换也被称为投影映射(Projection Mapping)。我们知道在图像的仿射变换中需要变换矩阵是一个2x3的两维平面变换矩阵,而透视变换本质上空间立体三维变换,根据其次坐标方差,要把三维坐标投影到另外一个视平面,就需要一个完全不同的变换矩阵M,所以这个是透视变换跟OpenCV中几何仿射变换最大的不同。 
OpenCV中透视变换的又分为两种:

                                                    - 稀疏透视变换

                                                    - 密集透视变换

我们经常提到的对图像的透视变换都是指密集透视变换,而稀疏透视变换在OpenCV的特征点匹配之后的特征对象区域标识中经常用到。一般情况下密集透视变换warpPerspective函数常与函数getPerspectiveTransform一起使用实现对图像的透视校正。而稀疏透视变换perspectiveTransform经常与findhomography一起使用。

二、原理公式

u,v是原始图片左边,对应得到变换后的图片坐标x,y,其中

变换矩阵可以分作四部分来理解,表示线性变换,表示平移,产生透视,


所以可以理解成仿射等是透视变换的特殊形式。经过透视变换之后的图片通常不是平行四边形(除非映射视平面和原来平面平行的情况)。

重写之前的变换公式可以得到:

所以,已知变换对应的几个点就可以求取变换公式。反之,特定的变换公式也能新的变换后的图片。简单的看一个正方形到四边形的变换:

根据变换公式得到:
 

定义几个辅助变量:
 

都为0时变换平面与原来是平行的,可以得到:
 

不为0时,得到
 

求解出的变换矩阵就可以将一个正方形变换到四边形。反之,四边形变换到正方形也是一样的。于是,我们通过两次变换:四边形变换到正方形+正方形变换到四边形就可以将任意一个四边形变换到另一个四边形。
 

三、实验

透视变换的一般过程:读入图片,获取边界点,定义目标边界点,获取转换矩阵,执行转换。
 

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2\core\core.hpp>  
#include <opencv2\highgui\highgui.hpp>  
#include <opencv2\imgproc\imgproc.hpp>
#include <vector>
using namespace cv;
using namespace std;
int main()
{
	Mat src = imread("100.jpg");
	vector<Point2f>src_coners(4);
	src_coners[0] = Point2f(74, 144);
	src_coners[1] = Point2f(306, 54);
	src_coners[2] = Point2f(120, 277);
	src_coners[3] = Point2f(379, 187);
	
	//对四个点画圆点标记
	circle(src, src_coners[0], 3, Scalar(0, 0, 255), 3, 8);
	circle(src, src_coners[1], 3, Scalar(0, 0, 255), 3, 8);
	circle(src, src_coners[2], 3, Scalar(0, 0, 255), 3, 8);
	circle(src, src_coners[3], 3, Scalar(0, 0, 255), 3, 8);
	vector<Point2f>dst_coners(4);
	dst_coners[0] = Point2f(0, 0);
	dst_coners[1] = Point2f(400, 0);
	dst_coners[2] = Point2f(0, 300);
	dst_coners[3] = Point2f(400, 300);
	Mat warpMatrix = getPerspectiveTransform(src_coners, dst_coners);
	Mat dst;
	warpPerspective(src, dst, warpMatrix, dst.size(), INTER_LINEAR, BORDER_CONSTANT);
	imshow("原图", src);
	imshow("输出结果", dst);
	waitKey();
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个强大的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,包括透视变换。在Python,使用OpenCV进行透视变换通常涉及到`cv2.getPerspectiveTransform()`和`cv2.warpPerspective()`这两个核心函数。 1. **获取透视变换矩阵**: `cv2.getPerspectiveTransform(src, dst)` 函数接收两个输入:源图像的四个点(定义了源图像的不规则矩形区域),以及目标矩形区域的对应点。这个函数会计算一个透视变换矩阵,用于将源图像映射到目标矩形。 2. **应用透视变换**: `cv2.warpPerspective(img, M, dsize, flags=0, borderMode=BORDER_CONSTANT, borderValue=None)` 用这个函数来实际执行变换,其 `img` 是源图像,`M` 是从上面获得的透视变换矩阵,`dsize` 是目标图像的大小,`flags` 可选参数影响变换的行为(如插值方法),`borderMode` 和 `borderValue` 控制边界像素的处理方式。 一个简单的例子可能如下所示: ```python import cv2 import numpy as np # 假设src_points和dst_points是四点坐标 src_points = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) dst_points = np.float32([[0, 0], [300, 0], [0, 300], [300, 300]]) # 计算透视变换矩阵 M = cv2.getPerspectiveTransform(src_points, dst_points) # 读取原图并进行透视变换 img = cv2.imread('input.jpg') warped_img = cv2.warpPerspective(img, M, (300, 300)) # 显示原图和变换后的图像 cv2.imshow('Original', img) cv2.imshow('Warped', warped_img) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值