同形投影矫正

利用opencv提供的findHomography函数获得一个变换矩阵,然后通过warpPerspective函数透视矫正变换为新的一张图,

下面例子通过透视矫正把一张摆正的广告矫正为用户指定的四边区域,然后通过图片叠加方式把广告替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// homographyreplace.cpp: 定义控制台应用程序的入口点。
//
 
#include "stdafx.h"
 
#include <opencv2/opencv.hpp>
 
using namespace cv;
using namespace std;
 
struct userdata {
    Mat im;
    vector<Point2f> points;
};
 
 
void mouseHandler(int event, int x, int y, int flags, void* data_ptr)
{
    if (event == EVENT_LBUTTONDOWN)
    {
        userdata *data = ((userdata *)data_ptr);
        circle(data->im, Point(x, y), 3, Scalar(0, 255, 255), 5, CV_AA);
        imshow("Image", data->im);
        if (data->points.size() < 4)
        {
            data->points.push_back(Point2f(x, y));
        }
    }
 
}
 
 
 
int main(int argc, char** argv)
{
 
    // 读取第一张图片
    Mat im_src = imread("first-image.jpg");
    Size size = im_src.size();
 
    // 以这张图片的四个角的顶点坐标创建四个点列表
    vector<Point2f> pts_src;
    pts_src.push_back(Point2f(0, 0));
    pts_src.push_back(Point2f(size.width - 1, 0));
    pts_src.push_back(Point2f(size.width - 1, size.height - 1));
    pts_src.push_back(Point2f(0, size.height - 1));
 
    // 需要取代的图片
    Mat im_dst = imread("times-square.jpg");
 
 
    // clone一个临时图片
    Mat im_temp = im_dst.clone();
    userdata data;
    data.im = im_temp;
 
 
    // 显示这张图片
    imshow("Image", im_temp);
 
    cout << "点击一个广告牌的四个角点然后回车" << endl;
    // 设置鼠标事件回调
    setMouseCallback("Image", mouseHandler, &data);
    waitKey(0);
 
    // 计算矩形四个点到用户点击的四个点的同形变换矩阵
    Mat h = findHomography(pts_src, data.points);
 
    // 投影矫正
    warpPerspective(im_src, im_temp, h, im_temp.size());
 
    // 抽出用户点击的四个点
    Point pts_dst[4];
    for (int i = 0; i < 4; i++)
    {
        pts_dst[i] = data.points[i];
    }
 
    // 扣出四个点区域的像素填充0
    fillConvexPoly(im_dst, pts_dst, 4, Scalar(0), CV_AA);
 
    // 图片像素叠加合成
    im_dst = im_dst + im_temp;
 
    // 显示合成的图片
    imshow("Image", im_dst);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

  

 图片资源:

https://files.cnblogs.com/files/zzatp/img.zip

在线h5版本的同形矫正,手机扫描

 

posted on   zzatp  阅读(196)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示