使用opencv对图像进行透视变换

这篇具有很好参考价值的文章主要介绍了使用opencv对图像进行透视变换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.什么是透视变换

透视变换就是透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简单的来说就是把一张斜着看的二维图形变为俯瞰的二维图像,透视变换再计算机视觉中相当常用,因为计算机采集的图形并非规整的图像,比如再使用自动倒车,赛道识别等方面都需要使用透视变换来改变计算机所采集的的信息,比如:

使用opencv对图像进行透视变换

二.代码演示: 

目标是把这张图片:

使用opencv对图像进行透视变换

变为:

使用opencv对图像进行透视变换 

 首先是打开图片

frame = imread("test3.jpg", 1);
frame1 = frame.clone();

这里先定义两张一样的图片,一张用于用户输入,一张用于数据处理

然后调整一下图片的大小,这里我测试了一下,把图片都变成正方形可以使变换的更加准确

Size a = frame.size();
resize(frame, frame, Size(max(a.height,a.width), max(a.height ,a.width)));
resize(frame1, frame1, Size(max(a.height, a.width), max(a.height, a.width)));

然后使确定矩形的四个点,这里我们让用户自己再图片上进行点击,我们可以使用openCV自带的函数setmousecallback,用法如下:

使用opencv对图像进行透视变换

这里共有三个参数:

第一个:窗口名称

第二个:鼠标的响应函数和回调函数

第三个:回调函数的参数

我们在第二个参数中写一个返回值void的函数On_mouse,其中识别鼠标按下的回调的参数是:EVENT_LBUTTONDOWN

	setMouseCallback("test", On_mouse, 0);

然后我们期望用户点击后在用户点击的地方显示一个点,我们可以使用circle函数,所以On_mouse函数如下:

int num_point = 0, out_size = 0;
void On_mouse(int event, int x, int y, int flags, void*) {
	if (event == EVENT_LBUTTONDOWN) {
		in_point[num_point] = Point(x, y);
        cout << x << ' ' << y << endl;
        circle(frame1, in_point[num_point], 6, Scalar(0, 255, 0), -1);
        imshow("test", frame1);
        num_point++;
	}
}

然后我们把输入的四个点的坐标存在in_point这个数组里

最后我们使用getPerspectiveTransform和warpPerspective函数进行透视变换:

temp = getPerspectiveTransform(in_point, out_point);
warpPerspective(frame, result, temp, frame.size());

这里注意我们输入点的顺序是:左上,右上,左下,右下。

完整代码:

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat frame,frame1;
Point2f in_point[4];
Point2f out_point[4];
int num_point = 0, out_size = 0;
void On_mouse(int event, int x, int y, int flags, void*) {
	if (event == EVENT_LBUTTONDOWN) {
		in_point[num_point] = Point(x, y);
        cout << x << ' ' << y << endl;
        circle(frame1, in_point[num_point], 6, Scalar(0, 255, 0), -1);
        imshow("test", frame1);
        num_point++;
	}
}
int main(){
    cout << "请依次点击需要变换的四边形的左上角,右上角,左下角,右下角" << endl;
    cout << "点选取好后单击Enter" << endl;
	frame = imread("test3.jpg", 1);  //test3.jpg是我自己在这个目录下的文件,也可以替换为图片的绝对路径,但是要注意使用双斜杠
    frame1 = frame.clone();
    Size a = frame.size();
    resize(frame, frame, Size(max(a.height,a.width), max(a.height ,a.width)));
    resize(frame1, frame1, Size(max(a.height, a.width), max(a.height, a.width)));
    imshow("test", frame);
	setMouseCallback("test", On_mouse, 0);
    while (1) {
        if (waitKey(10) == 13) {
            out_size = std::max(in_point[1].x - in_point[0].x, in_point[3].x - in_point[2].x);
            out_point[0] = Point2f(0.0, 0.0);
            out_point[1] = Point2f(out_size * 1.0, 0.0);
            out_point[2] = Point2f(0.0, out_size * 1.0);
            out_point[3] = Point2f(out_size * 1.0, out_size * 1.0);
            Mat temp, result;
            temp = getPerspectiveTransform(in_point, out_point);
            warpPerspective(frame, result, temp, frame.size());
            imshow("result", result);
            cout << "转换完成" << endl;
            waitKey(0);
        }    
    }
	return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-476185.html


 

 

 

到了这里,关于使用opencv对图像进行透视变换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用OpenCV进行透视变换

    欢迎回来!今天我们将焦点聚焦在我在图像处理中最喜欢的话题之一——透视变换。使用该技术,可以灵活方便的实现各种各样好玩的特效。 闲话少说,我们直接开始吧! 我们首先展开对单应矩阵的深入研究。作为图像处理的基本工具,它在捕捉图像中的几何变换方面发挥

    2024年02月10日
    浏览(44)
  • OpenCV(图像处理)-基于Python-图像的基本变换-平移-翻转-仿射变换-透视变换

    为了方便开发人员的操作,OpenCV还提供了一些图像变换的API,本篇文章讲简单介绍各种API的使用,并附上一些样例。 图像缩放函数,用于把图像按指定的尺寸放大或缩小。 dst = cv2.resize(src, dsize, fx, fy, interpolation) dst = 生成的目的图像 src:需要变换的原图像 disize:(x, y)需要

    2024年02月08日
    浏览(68)
  • Python中OpenCV透视变换恢复扭曲图像

    在处理图像问题时,经常会遇到将要处理的目标的位置是斜的,需要使用透视变换进行矫正。如下图,该图片中左边的目标是扭曲倾斜拍摄的,那么任务就是将其矫正过来,如下图右图所示。 前提1:这里假设我已经知道四个点坐标(可用深度学习方法检测/分割)和目标宽高

    2024年01月20日
    浏览(50)
  • 【Python图像处理篇】opencv中的仿射变换和透视变换

    仿射变换可以将矩形图片映射为平行四边形, 透视变换可以将矩形图片映射为任意四边形。 opencv提供了两个变换函数,cv2.warpAffine和cv2.warpPerspective, 使用这两个函数可以实现所有类型的变换。 cv2.warpAffine 接收的参数2x3的变换矩阵; 而 cv2.warpPerspective 接收的3x3的变换矩阵。

    2024年01月24日
    浏览(67)
  • Opencv-C++笔记 (16) : 几何变换 (图像的翻转(镜像),平移,旋转,仿射,透视变换)

    图像旋转是指图像按照某个位置转动一定的角度的过程,旋转中图像仍保持着原始尺寸。图像旋转后图像水平对称轴、垂直对称轴及中心坐标原点都可能会发生变换,因此需要对图像旋转中的坐标进行相应转换。 假设有一个点:P(x,y),它在绕原点 O(0,0) 旋转 β 后,被转换成

    2024年02月14日
    浏览(71)
  • opencv-25 图像几何变换04- 透视 cv2.warpPerspective()

    透视是一种几何学概念,用于描述在三维空间中观察物体时,由于视角的不同而产生的变形效果。在现实世界中,当我们从不同的角度或位置观察物体时,它们会呈现出不同的形状和大小。这种现象被称为透视效果。 透视效果主要由以下几个因素造成: 远近关系 :在视野范

    2024年02月15日
    浏览(51)
  • 基于OpenCV的图像透视变换详解(从理论到实现再到实践)

             一直无法理解两种仿射变换与透视变换的区别,因此详细学习了两种变换的具体细节,重新书写了公式,并给出自己的一些看法。         可以认为, 仿射变换 是 透视变换 的一种 特例 。         仿射变换 是一种 二维坐标 到 二维坐标 之间的 线性变换

    2024年02月01日
    浏览(35)
  • VC++中使用OpenCV对原图像中的四边形区域做透视变换

    最近闲着跟着油管博主murtazahassan,学习了一下LEARN OPENCV C++ in 4 HOURS | Including 3x Projects | Computer Vision,对应的Github源代码地址为:Learn-OpenCV-cpp-in-4-Hours 视频里面讲到到原图中的扑克牌四个顶点标记画圆,并且将扑克牌K做透视变换后摆正重新显示,资源图像文件 cards.png 下载地

    2024年01月17日
    浏览(38)
  • 图像的透视变换

    透视变换是一种图像变换技术,用于将图像投影到新的视平面上。它可以通过对图像进行透视、旋转、缩放和扭曲等操作,从而改变图像的视角和形状。在OpenCV中,我们可以使用 cv2.warpPerspective 函数来实现透视变换操作。 透视变换的原理是基于透视几何学的原理。给定原始图

    2024年02月11日
    浏览(29)
  • 图像尺寸、仿射、透视变换

      1.2.1 图像缩放  1.2.2 图像翻转 1.2.3 图像拼接    4个像素坐标,图有误  3.4 透视变换函数  

    2024年02月12日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包