欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用

发布时间:2024/9/21 58 豆豆
生活随笔 收集整理的这篇文章主要介绍了 opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

 

透视变换在图像还原的上的应用很广泛,他是将成像投影到一个新的视平面。比如两个摄像头在不同的角度对统一物体进行拍照,物体上的同一个点在两张照片上的坐标是不一样的,为了实现两张图片同一个点的对应关系映射,透视变换就实现了此功能。

一、获取透视变换矩阵函数GetPerspectiveTransform

功能描述

从四对对应的点计算透视变换.函数计算的是 3*3的满足以下关系的透视转换矩阵:

此处

原型

CV_EXPORTS_W Mat getPerspectiveTransform(InputArray src, InputArray dst, int solveMethod = DECOMP_LU); CV_EXPORTS Mat getPerspectiveTransform(const Point2f src[], const Point2f dst[], int solveMethod = DECOMP_LU);

参数释义

  • 参数 src 源图像四边形顶点坐标.

  • 参数 dst 目标图像对应的四边形顶点坐标.

  • 参数 solveMethod 传递给cv::solve(#DecompTypes)的计算方法,默认是DECOMP_LU

  • 参考 findHomography, warpPerspective, perspectiveTransform

     

二、透视变换函数warpPerspective

功能描述

通过透视矩阵把透视变换应用到一个图像上。

如果指定 CV_WARP_INVERSE_MAP,函数warpPerspective使用下面指定矩阵转换源图像:

否则,转换首先使用反转进行反转,然后代替M放到上面的公式中,这个函数不能使用in-place(就地)操作。

原型

CV_EXPORTS_W void warpPerspective( InputArray src, OutputArray dst,InputArray M, Size dsize,int flags = INTER_LINEAR,int borderMode = BORDER_CONSTANT,const Scalar& borderValue = Scalar());

参数释义

  • 参数:src 输入图像。

  • 参数: dst 输出图像,具有Size dsize并且和源图像具有相同的类型 .

  • 参数: M 3*3的转换矩阵.

  • 参数: dsize 输出图像的大小.

  • 参数: flags 插值方法的组合(INTER_LINEAR(双线性插值)或 INTER_NEAREST(双线性插值))和可选的标志g #WARP_INVERSE_MAP, 为了设置M作为反转转换 (dst->src)

  • 参数: borderMode 像素外推方法 (#BORDER_CONSTANT指定常数填充 or #BORDER_REPLICATE复制边缘像素填充).

  • 参数: borderValue 固定边缘情况下使用的值,缺省是0.

  • 参考warpAffine, resize, remap, getRectSubPix, perspectiveTransform

源码示例:

#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/imgproc/imgproc_c.h> ​ using namespace cv; int main() {// 源图像Mat srcImage = imread("D:\\OpenCVtest\\images\\juice.png");// 目标图像Mat dstImage;// 取原图四个顶点Point2f AffinePointsSrc[4] = { Point2f(40, 50), Point2f(100, 190), Point2f(200, 50), Point2f(300, 190) };// 取原图四个顶点在目标图像上的坐标Point2f AffinePointsDst[4] = { Point2f(50, 60), Point2f(120, 200), Point2f(200, 50), Point2f(300, 190) }; ​ ​// 求出透视变换矩阵Mat TransImage = getPerspectiveTransform(AffinePointsSrc, AffinePointsDst); ​warpPerspective(srcImage, dstImage, TransImage, Size(srcImage.cols, srcImage.rows), CV_INTER_CUBIC); ​// 目标图像上的四个点上标记圆形for (int i = 0; i < 4; i++){circle(dstImage, AffinePointsDst[i], 2, Scalar(0, 0, 255), 2);}imshow("src", srcImage);imshow("dst", dstImage);waitKey(); }

运行结果

 

总结

以上是生活随笔为你收集整理的opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。