OpenCV透视变换应用之书本视图矫正+广告屏幕切换

目录
  • 一、透视变换的实际应用场景
  • 二、案例了解透视变换--书本视图矫正
  • 三、案例了解透视变换--广告屏幕切换

一、透视变换的实际应用场景

我们在出门坐车时,经常会看到司机会使用一种行车辅助工具,这其中就使用到了透视变换的相关操作,协助司机安全行车。

可以看出,自身小车周围路况的正常显示,便利了司机的行车操作

像这种透视变换的实际生活应用,其实还有许多,接下来,我们就来学习一下OpenCV的透视变换

二、案例了解透视变换--书本视图矫正

原图:

目标:需要使用透视变换 将书桌上的课本 正视视角查看

结果展示:

书本视图矫正完整代码如下:【这里是鼠标点击从左上角开始顺时针选取4个点透视变换】

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

//鼠标操作 自己准备结构体
struct imagedata
{
    Mat img;//目标图像 用于点击 确定坐标
    vector<Point2f> points;//存放原图的坐标 通过鼠标的点击进行存放
};

//鼠标操作的回调函数:用于选择四个角的点(使用方法:从左上角开始顺时针选择四个点,选完之后回车操作)
void mouseHundle(int event,int x,int y,int flag,void *arg)
{
    //强制转换
    struct imagedata * d = (struct imagedata*)arg;
    //如果按下的是鼠标左键
    if(event==EVENT_LBUTTONDOWN)
    {
        //用圆形来标记下鼠标按下左键标记的位置
        circle(d->img,Point(x,y),3,Scalar(255,0,0),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:/00000000000003jieduanshipincailliao/book2.jpg");
    Mat result=Mat::zeros(400,500,CV_8UC1);//最终结果显示 单通道

    //准备坐标:存放四个转换以后的坐标
    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);

    //利用RANSAC算法  计算得到转换映射矩阵3*3
    Mat res=findHomography(data.points,obj,CV_RANSAC);
    //查看转换矩阵
    //imshow("res",res);

    //原图转换出来结果图
    warpPerspective(image,result,res,result.size());
    //查看转换结果图 透视变换
    imshow("result",result);

    waitKey(0);
}

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

以上是使用鼠标点击确定坐标,当然,我们也可以在代码中写上选定的坐标进行透视变换的相关操作。 依然选取左上角开始顺时针坐标选取,这里以左上角为例,其他三个点可以类比左上角坐标选择来确定下坐标选取

可以看到左上角坐标 x=282,y=43

自己定下透视变换使用到的四个坐标 直接回车 即可查看透视变换结果

    //鼠标操作  鼠标处理的回调函数
    //setMouseCallback("image",mouseHundle,&data);

    //不使用鼠标点击,自己定下透视变换的四个坐标
    vector<Point2f>src;
    src.push_back(Point2f(283,134));
    src.push_back(Point2f(745,234));
    src.push_back(Point2f(578,463));
    src.push_back(Point2f(61,299));

    //按任意键关闭当前显示的窗口,显示下一个窗口
    waitKey(0);

    //利用RANSAC算法  计算得到转换映射矩阵3*3
    Mat res=findHomography(src,obj,CV_RANSAC);
    //查看转换矩阵
    //imshow("res",res);

程序运行 直接回车操作 查看

三、案例了解透视变换--广告屏幕切换

背景图片:

想要切换的广告图片:

目标:选择广告屏幕 切换 广告屏幕内容

结果:广告屏上面的 内容推荐 成功切换成自己想要切换的广告图片

实现方法:处理后两张图片的叠加,就是先将想要更换的广告屏填充黑色背景图,再将自己想要的广告图片 两张图片叠加就能达到切换广告屏幕的效果

广告屏幕切换完整代码如下:

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

struct imagedata
{
    Mat img;//目标图像
    vector <Point2f> points;//3D点
};

//鼠标操作函数:用于选择四个角的点(使用方法有顺序的,从左上角顺时针选择,选完之后回车)
void mouseHundle(int event,int x,int y,int flag,void *ptr)
{
    struct imagedata * d=(struct imagedata*)ptr;
    if(event==EVENT_LBUTTONDOWN)
    {
        //确定按下的是鼠标左键
        //用圆形标记一下鼠标按下左键标记的位置
        circle(d->img,Point(x,y),3,Scalar(255,0,0),3,CV_AA);//在图上标记,圆心为点击的位置

        imshow("dst",d->img);//在dst背景图中显示鼠标选取的图片

        if(d->points.size()<4)//只存下来,最先点的前四个点
        {
            d->points.push_back(Point2f(x,y));//把鼠标操作点击的点存起来
        }
    }
}

void example_2()
{
    Mat image1=imread("D:/00000000000003jieduanshipincailliao/0802.jpg");//想要切换的广告内容
    Mat image2=imread("D:/00000000000003jieduanshipincailliao/city.jpg");//纽约时代广场图片背景

    Mat dst=image2.clone();//背景图片 克隆

    //存放原图坐标 想要切换的广告屏图片
    vector <Point2f>obj;
    obj.push_back(Point2f(0,0));
    obj.push_back(Point2f(image1.cols,0));
    obj.push_back(Point2f(image1.cols,image1.rows));
    obj.push_back(Point2f(0,image1.rows));

    //纽约时代广场图背景图显示
    imshow("dst",dst);
    struct imagedata data;
    data.img =dst;

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

    //计算得到转换映射矩阵 3*3  原图坐标转换为鼠标选择
    Mat res = findHomography(obj,data.points,CV_RANSAC);
    //imshow("res",res);
    //透视变换
    warpPerspective(image1,dst,res,dst.size());
    //仅有的却换后的广告图图片
    //imshow("image1",dst);

    Point pts[4];
    for(int i=0;i<4;i++)
    {
        pts[i]=data.points[i];
    }
    //鼠标点选的四个坐标的区域填充成黑色
    fillConvexPoly(image2,pts,4,Scalar(0),CV_AA);
    //imshow("image2",image2);

    //将仅有的却换后的广告图图片 和  鼠标点选的四个坐标的区域填充成黑色的背景图图片 叠加
    image2+=dst;
    //显示出最后广告换屏结果图片
    imshow("final",image2);

    waitKey(0);
}

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

到此这篇关于OpenCV透视变换应用之书本视图矫正+广告屏幕切换的文章就介绍到这了,更多相关OpenCV透视变换应用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Opencv透视变换综合实例详解

    本文实例为大家分享了Opencv透视变换综合实例的具体代码,供大家参考,具体内容如下 案例背景:对下面发生畸变的图像进行校正 方案思路:灰度二值化分割,闭操作,寻找轮廓,霍夫直线检测,直线排序,直线方程,直线交点,透视矩阵,透视变换. #include<opencv2\opencv.hpp> using namespace cv; using namespace std; int main(int arc, char** argv) { Mat src = imread("1.jpg

  • OpenCV实现透视变换矫正

    本文实例为大家分享了OpenCV实现透视变换矫正的具体代码,供大家参考,具体内容如下 演示结果参考: 功能实现:运行程序,会显示图片的尺寸,按回车键后,依次点击需矫正的图片的左上.右上.左下.右下角,并能显示其坐标,结果弹出矫正后的图片,如图上的PIC2对话框.可以继续选择图片四个点进行实验,按下字符'q'后退出. 代码如下:(注:图中的11.jpg图片自己选取放到该程序目录下.) //使用鼠标在原图像上选取感兴趣区域 #include <opencv2/opencv.hpp> #includ

  • Python Opencv基于透视变换的图像矫正

    本文实例为大家分享了Python Opencv基于透视变换的图像矫正,供大家参考,具体内容如下 一.自动获取图像顶点变换(获取图像轮廓顶点矫正) 图像旋转校正思路如下 1.以灰度图读入2.腐蚀膨胀,闭合等操作3.二值化图像4.获取图像顶点5.透视矫正 #(基于透视的图像矫正) import cv2 import math import numpy as np def Img_Outline(input_dir):     original_img = cv2.imread(input_dir)

  • OpenCV和C++实现图像的翻转(镜像)、平移、旋转、仿射与透视变换

    目录 一.翻转(镜像) 二.仿射扭曲 获取变换矩阵 仿射扭曲函数 warpAffine 旋转 平移 三.仿射变换 四.透视变换 综合示例 总结 官网教程 一.翻转(镜像) 头文件 quick_opencv.h:声明类与公共函数 #pragma once #include <opencv2\opencv.hpp> using namespace cv; class QuickDemo { public: ... void flip_Demo(Mat& image); void rotat

  • opencv3/C++ 平面对象识别&透视变换方式

    findHomography( ) 函数findHomography( )找到两个平面之间的透视变换H. 参数说明: Mat findHomography( InputArray srcPoints, //原始平面中点的坐标 InputArray dstPoints, //目标平面中点的坐标 int method = 0, //用于计算单应性矩阵的方法 double ransacReprojThreshold = 3, OutputArray mask=noArray(), //通过鲁棒法(RA

  • OpenCV图像几何变换之透视变换

    本文实例为大家分享了Android九宫格图片展示的具体代码,供大家参考,具体内容如下 1. 基本原理 透视变换(Perspective Transformation)的本质是将图像投影到一个新的视平面,其通用变换公式为: (u,v)为原始图像像素坐标,(x=x'/w',y=y'/w')为变换之后的图像像素坐标.透视变换矩阵图解如下: 仿射变换(Affine Transformation)可以理解为透视变换的特殊形式.透视变换的数学表达式为: 所以,给定透视变换对应的四对像素点坐标,即可求得透视变

  • OpenCV透视变换应用之书本视图矫正+广告屏幕切换

    目录 一.透视变换的实际应用场景 二.案例了解透视变换--书本视图矫正 三.案例了解透视变换--广告屏幕切换 一.透视变换的实际应用场景 我们在出门坐车时,经常会看到司机会使用一种行车辅助工具,这其中就使用到了透视变换的相关操作,协助司机安全行车. 可以看出,自身小车周围路况的正常显示,便利了司机的行车操作 像这种透视变换的实际生活应用,其实还有许多,接下来,我们就来学习一下OpenCV的透视变换 二.案例了解透视变换--书本视图矫正 原图: 目标:需要使用透视变换 将书桌上的课本 正视视角查看

  • 浅析iOS多视图滑动点击切换的集成

    前言 多视图滑动点击切换这个视图在很多App都有用到,我对这个View进行了封装,外界只需要调用一个接口,就能实现这个效果,使用方法和系统的tabbarController很相似. 外界只需要调用下面这个接口即可集成. /** * 添加一个子控制器 */ - (void)addSubItemWithViewController:(UIViewController *)viewController; HYTabbarView效果图如下 HYTabbarView可灵活配置一屏宽显示多少个标题,以及标

  • 比较IOS开发中常用视图的四种切换方式

    在iOS开发中,比较常用的切换视图的方式主要有以下几种: 1. push.pop 使用举例(ViewController假设为需要跳转的控制器): [self.navigationController pushViewController:ViewController animated:YES]; //入栈,跳转到指定控制器视图 [self.navigationController popViewControllerAnimated:YES]; //弹栈,返回到前一个视图 [self.navig

  • Python OpenCV超详细讲解透视变换的实现

    目录 准备工作 场景描述 透视变换 准备工作 右击新建的项目,选择Python File,新建一个Python文件,然后在开头import cv2导入cv2库,import numpy并且重命名为np. 我们还要知道在OpenCV中,坐标轴的方向是x轴向右,y轴向下,坐标原点在左上角,比如下面这张长为640像素,宽为480像素的图片.OK,下面开始本节的学习吧. 场景描述 给定任意一张图像,从中分割出你需要的区域,并且以指定的大小显示出来.而且分割出的图像在线性空间中还是与显示的窗口是平行的.就

  • Java OpenCV图像处理之仿射变换,透视变换,旋转详解

    目录 1 仿射变换 2 透视变换 3 图像旋转 1 仿射变换 仿射变换:一种二维坐标到二维坐标的线性变换,它保持二维图像的平直性与平行性,即变换后直线依然是直线,平行的线依然平行. package com.xu.opencv.image; import java.io.File; import java.util.ArrayList; import java.util.List; import org.opencv.core.Mat; import org.opencv.core.MatOfPo

  • jquery repeater 模仿 Google 展开页面预览子视图

    如果, 有不明白的问题, 请先阅读 30 分钟掌握无刷新 Repeater. 示例代码下载: http://zsharedcode.googlecode.com/files/JQueryElementDemo.rar 本文将详细的讲解 Repeater 控件中如何使用子视图, 目录如下: * 准备 * 定义子视图样本 * 切换子视图状态 * 定义子视图容器 示例图片: 准备 请参照 http://code.google.com/p/zsharedcode/wiki/JQueryElementRe

  • JavaScript经典效果集锦

    一 实用且必用的小脚本代码二 鼠标旁边的提示信息,类似与163登录后的页面提示效果三 如果文字过长,则将过长的部分变成省略号显示四 滚动的图片五 接收键盘指令的脚本六 让你的文本链接渐隐渐显七 类似与QQ的好友/黑名单之类的树型菜单-----推荐八 很多的脚本翻页------推荐九 DIV的透明层实现十 JSP页面自动生成html页面/或任何格式页面-----推荐 十一 超级强大的表单验证-----推荐十二 漂亮的脚本日历十三 进入,退出页面的各种效果!十四 很酷的效果,表格被选中回变颜色十五

  • Android 自定义控件详解及实例代码

    开发自定义控件的步骤: 1.了解View的工作原理 2. 编写继承自View的子类 3. 为自定义View类增加属性 4. 绘制控件 5. 响应用户消息 6 .自定义回调函数 一.View结构原理 Android系统的视图结构的设计也采用了组合模式,即View作为所有图形的基类,Viewgroup对View继承扩展为视图容器类. View定义了绘图的基本操作 基本操作由三个函数完成:measure().layout().draw(),其内部又分别包含了onMeasure().onLayout()

  • 基于angular实现模拟微信小程序swiper组件

    这段时间的主业是完成一个家政类小程序,终于是过审核发布了.不得不说微信的这个小程序生态还是颇有想法的,抛开他现有的一些问题不说,其提供的组件系统乍一看还是蛮酷的.比如其提供的一个叫swiper的视图组件,就可以在写界面的时候省不少时间和代码,轮播图片跟可滑动列表都可以用.导致现在回来写angular项目时也想整一个这样的组件出来,本文就将使用angular的组件能力和服务能力完成这么一个比较通用,耦合度较低的swiper出来. 首先要选择使用的技术,要实现的是与界面打交道的东西,自然是实现成一个

随机推荐