C++ Opencv之3D透视变换

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

前言:

各位小伙伴们是不是经常出现拍摄角度不佳,看着特别难受,想把图片中的某个物体翻转一下呢?

本文就以下面这本书为例,只需要鼠标按照顺时针点击书的四个脚就可以完成变换:

opencv鼠标点击透视矫正c++,opencv,c++,opencv,计算机视觉,图像处理,目标检测
侧着看好难受哦,想看正面怎么办?

效果:

opencv鼠标点击透视矫正c++,opencv,c++,opencv,计算机视觉,图像处理,目标检测
舒服了!!!

opencv鼠标点击透视矫正c++,opencv,c++,opencv,计算机视觉,图像处理,目标检测

目录

流程讲解:

1.先读取一个需要3D透视变换的图片,并创建一个MAT类型的图片变量,用来装处理后的图片

2.创建一个向量,用来存放鼠标点击的四个坐标点在处理后的图片变量中的位置

3.由于涉及到鼠标左键点击,需要创建一个结构体

4.创建一个刚才定义的结构体,并将读取到的原图片的图片变量保存给结构体,并调用鼠标点击函数

5.把点击的位置丢给计算函数,让其使用RANSAC算法,得出计算结果

6.结果转换,并将结果显示

7.如何使用:

所有的代码:


流程讲解:

1.先读取一个需要3D透视变换的图片,并创建一个MAT类型的图片变量,用来装处理后的图片

    Mat image=imread("D:/Qt_Opencv_Project/book1.png");
    Mat result=Mat::zeros(400,500,CV_8UC1);//400*500的大小,但是里面没有东西

2.创建一个向量,用来存放鼠标点击的四个坐标点在处理后的图片变量中的位置

听着可能有点乱,但是没事,往下看就懂了,顺便show一下原图片,方便后续的鼠标操作

    vector <Point2f>obj;
    obj.push_back(Point2f(0,0));
    obj.push_back(Point2f(500,0));
    obj.push_back(Point2f(500,400));
    obj.push_back(Point2f(0,400));//转换后的坐标
    imshow("image",image);

3.由于涉及到鼠标左键点击,需要创建一个结构体

结构体中需要有一个放原图片(方便点击产生的小点能直接显示在图片上,看起来比较直观),另一个存放鼠标点击的坐标点

struct imagedata
{
    Mat img;
    vector <Point2f> points;
};

4.创建一个刚才定义的结构体,并将读取到的原图片的图片变量保存给结构体,并调用鼠标点击函数

注意这个鼠标处理函数的参数为:

窗口名   鼠标处理的回调函数  处理结果产生数据保存给哪个变量

    struct imagedata data;
    data.img=image;
    setMouseCallback("image",mouseHundle,&data);//鼠标处理的回调函数
    waitKey(0);//按任意键关闭当前显示的窗口,显示下一个窗口

调用的回调函数:

第一个参数为鼠标点击的命令

第二、三个参数为点击的坐标

第四个参数为标记(保留,本次没有使用到)

第五个参数为传入的数据,将处理好的图片信息保存到这里,根据上面的代码,我们所传入的是一个第三点中自己创建的结构体

此回调函数的内容:

判断点击的是否为鼠标左键,如果是,则在点击位置画一个小红点,如果已经保存的小红点数目小于4个则保存小红点(为什么是4个?因为本文以书本为例,以书本的四个角来确定一本书在图片中的位置)

void mouseHundle(int event,int x,int y,int flag,void *per)
{
    struct imagedata * d=(struct imagedata*)per;//强转一下方便后面操作
    if(event==EVENT_LBUTTONDOWN)
    {//确定按下的是鼠标左键
        //用圆形标记一下鼠标按下左键标记的位置
        circle(d->img,Point(x,y),3,Scalar(0,0,255),3,CV_AA);//在图上标记,圆心为点击的位置
        imshow("image",d->img);//原窗口上显示
        if(d->points.size()<4)
        {
            d->points.push_back(Point2f(x,y));//把点击的点存起来
        }
    }
}

5.把点击的位置丢给计算函数,让其使用RANSAC算法,得出计算结果

作用:将四个鼠标点击的坐标及其框的内容,转换成刚才第二点中保存的结果图片的坐标

函数参数:  四个鼠标点击的坐标  需要转换的四个坐标  RANSAC算法的宏定义

返回值:图片变量(可以理解成保存刚才那张图片处理的格式,在下一点中可以将原图以这个规则转换成结果图)

    Mat res=findHomography(data.points,obj,CV_RANSAC);  //利用RANSAC算法计算出来一个小矩阵

6.结果转换,并将结果显示

将原图按照上一点中得到的计算结果,进行转换

参数:  原图   装效果图的图片变量  图片计算结果  装效果图的图片变量的大小

    warpPerspective(image,result,res,result.size());  //结果转换
    imshow("result",result);
    waitKey(0);

7.如何使用:

导入图片以后,按照顺时针点击你想要3D变换的目标(比如本例是那本书)的四个角,然后按下任意键(别是关机键。。)结果就会跳出来啦!

opencv鼠标点击透视矫正c++,opencv,c++,opencv,计算机视觉,图像处理,目标检测

所有的代码:

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

struct imagedata
{
    Mat img;
    vector <Point2f> points;
};

void mouseHundle(int event,int x,int y,int flag,void *per)
{
    struct imagedata * d=(struct imagedata*)per;
    if(event==EVENT_LBUTTONDOWN)
    {//确定按下的是鼠标左键
        //用圆形标记一下鼠标按下左键标记的位置
        circle(d->img,Point(x,y),3,Scalar(0,0,255),3,CV_AA);//在图上标记,圆心为点击的位置
        imshow("image",d->img);//原窗口上显示
        if(d->points.size()<4)
        {
            d->points.push_back(Point2f(x,y));//把点击的点存起来
        }
    }
}

void example_1()
{
    Mat image=imread("D:/Qt_Opencv_Project/book1.png");
    Mat result=Mat::zeros(400,500,CV_8UC1);//400*500的大小,但是里面没有东西
    //存放四个转换以后的坐标
    vector <Point2f>obj;
    obj.push_back(Point2f(0,0));
    obj.push_back(Point2f(500,0));
    obj.push_back(Point2f(500,400));
    obj.push_back(Point2f(0,400));//转换后的坐标
    imshow("image",image);
    struct imagedata data;
    data.img=image;
    setMouseCallback("image",mouseHundle,&data);//鼠标处理的回调函数
    waitKey(0);//按任意键关闭当前显示的窗口,显示下一个窗口
    Mat res=findHomography(data.points,obj,CV_RANSAC);  //利用RANSAC算法计算出来一个小矩阵
    warpPerspective(image,result,res,result.size());  //结果转换
    imshow("result",result);
    waitKey(0);
}



int main(int argc, char *argv[])
{
    example_1();
    return 0;
}

看完别忘三连哦!您的支持是对我最大的鼓励!

博主往期的其他实用文章:

C++使用opencv调用级联分类器来识别目标物体_一个不同的ID的博客-CSDN博客前言:相较于帧差法捕捉目标物体识别,级联分类器识别目标物体更加具有针对性,使用前者只要是动的物体都会被捕捉识别到,画面里有一点风吹草动,都会被捕捉识别下来,如果我想识别具体的人或者物,都无法做到精准的目标识别,所以有了级联分类器识别(即模型识别),会按照训练好的级联分类器(模型)来进行目标识别流程讲解:1.创建一个级联分类器对象创建一个级联分类器对象,并读取已经已经训练好的模型 CascadeClassifier cascade;//级联分类器(模型) cascadehttps://blog.csdn.net/baidu_38326512/article/details/124271434?spm=1001.2014.3001.5502C++调用opencv完成运动目标捕捉_一个不同的ID的博客-CSDN博客一、原理说明:差帧识别原理:将这一帧的图像和上一帧的图像进行比对,产生变化的即为运动的目标像素块二、过程详解:1.将传入的两帧先进行灰度处理,转化将rgb类型图片转化为灰度图,可大大降低处理时间和资源消耗将转换后的图片转存至frontGray和afterGray cvtColor(frontFrame,frontGray,CV_BGR2GRAY); cvtColor(afterFrame,afterGray,CV_BGR2GRAY);2.将两帧图片进行...https://blog.csdn.net/baidu_38326512/article/details/124236389?spm=1001.2014.3001.5502文章来源地址https://www.toymoban.com/news/detail-777591.html

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

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

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

相关文章

  • OpenCV 实现透视变换

    仿射变换(affine transform)与透视变换(perspective transform)在图像还原、图像局部变化处理方面有重要意义。通常,在2D平面中,仿射变换的应用较多,而在3D平面中,透视变换又有了自己的一席之地。两种变换原理相似,结果也类似,可针对不同的场合使用适当的变换。 仿射变换和

    2024年02月04日
    浏览(39)
  • 【opencv】:图像的透视变换

    仿射变换(Affine Transformation或 Affine Map) , 又称为仿射映射, 是指在几何中, 图像进行从一个向量空间进行一次线性变换和一次平移, 变换为到另一个向量空间的过程。我们常说的仿射变换是透视变换的一个特例。 以上便是透视变换的原理图,即将源图像通过投影映射,

    2024年02月15日
    浏览(32)
  • 用OpenCV进行透视变换

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

    2024年02月10日
    浏览(33)
  • 使用opencv对图像进行透视变换

    一.什么是透视变换 透视变换就是透视变换(Perspective Transformation)是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面(透视面)绕迹线(透视轴)旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。简单的来说就是

    2024年02月08日
    浏览(36)
  • 【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】

    透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变,使得图像中的物体在新的视平面上呈现更加规则的形状。 透视变换通常涉及到寻找图像中的特定

    2024年02月03日
    浏览(48)
  • 【Python】【OpenCV】OCR识别(二)——透视变换

    对于OCR技术在处理有角度有偏差的图像时是比较困难的,而水平的图像使用OCR识别准确度会高很多,因为文本通常是水平排列的,而OCR算法一般会假设文本是水平的。 针对上述情况,所以我们在处理有角度的图象时,需要将图像“摆正”,将使用到getPerspectiveTransform方法和

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

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

    2024年01月20日
    浏览(38)
  • opencv warpPerspective透视变换实现原理与过程

    【版权声明】 本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。         cv2.warpPerspective函数是OpenCV库中用于执行透视变换的函数之一。它可以将图像从一个透视投影转换为另一个透视投影,实现图像的旋转、缩放、平移等操作。该操作可表示为:

    2024年04月09日
    浏览(38)
  • 我在Vscode学OpenCV 几何变换(缩放、翻转、仿射变换、透视、重映射)

    几何变换指的是将一幅图像映射到另一幅图像内的操作。 cv2.warpAffine :使用仿射变换矩阵对图像进行变换,可以实现平移、缩放和旋转等操作。 cv2.warpPerspective :使用透视变换矩阵对图像进行透视变换,可以实现镜头校正、图像纠偏等操作。 cv2.getAffineTransform :计算仿射变换

    2024年02月05日
    浏览(38)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包