opencv多摄像头配准_Opencv探索之路(二十):制作一个简易手动图像配准工具

本文介绍了如何使用OpenCV实现一个简易的手动图像配准工具,解决不同分辨率和时间差异导致的图像匹配问题。通过在两幅图像上手动选择控制点,计算仿射变换矩阵并进行图像变换。文章提供了代码示例,包括创建交互界面、存储匹配点坐标、计算变换矩阵及应用变换。此外,还讨论了针对大图的配准,通过多线程实现浏览大图功能,提高配准的精度和便捷性。
摘要由CSDN通过智能技术生成

近日在做基于sift特征点的图像配准时遇到匹配失败的情况,失败的原因在于两幅图像分辨率相差有点大,而且这两幅图是不同时间段的同一场景的图片,所以基于sift点的匹配已经找不到匹配点了。然后老师叫我尝试手动选择控制点来支持仿射变换。

很可惜opencv里没有这类似的库,查了下资料,看看有没有现成的手动配准软件,找到了arcgis这款软件可以做手动配准,不过这软件也都太大了吧我要的只是一个简单的功能而已!然后想了想,还是自己写个手动配准工具吧。

首先简单通俗说一下什么是图像配准。先观察一下下面两张图片。

这是两张从不同角度拍的场景,他们有大部分的重合,如果我们需要把这两张图拼接成一幅更大的图,我们需要做第一件事就是对他们进行配准,即对图二进行变换,令图二的物体转换到图一的坐标系,使得像素一一对应,这就是图像配准。

现在图像的配准方法有很多,比如基于特征点的配准,也有基于互信息的配准,都有广泛应用。现在我们使用特征点来配准,关键就在于找出两幅图像尽可能多对应的特征点,来求出变换矩阵,然后将待配准图进行变换。

现在实现一个简易的手动选择控制点的配准工具第一个版本,步骤有:

搭建交互界面,可以对两幅图自由选点,并把点坐标存储起来

求出变换矩阵

利用变换矩阵对待配准图进行仿射变换

根据以上思路,有以下代码

#include "opencv2/highgui/highgui.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include

#include

#include

#include

using namespace std;

using namespace cv;

vector imagePoints1, imagePoints2;

Mat ref_win, src_win;

int pcount = 0;

void on_mouse1(int event, int x, int y, int flags, void *ustc) //event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号

{

if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处打点

{

Point p = Point(x, y);

circle(ref_win, p, 1, Scalar(0, 0, 255), -1);

imshow("基准图", ref_win);

imagePoints1.push_back(p); //将选中的点存起来

cout << "基准图: " << p << endl;

pcount++;

cout << "ponit num:" << pcount << endl;

}

}

void on_mouse2(int event, int x, int y, int flags, void *ustc) //event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号

{

if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处打点

{

Point p = Point(x, y);

circle(src_win, p, 1, Scalar(0, 0, 255), -1);

imshow("待配准图", src_win);

imagePoints2.push_back(p); //将选中的点存起来

cout << "待配准图: " << p << endl;

}

}

int main()

{

Mat ref = imread("ref.png"); //基准图

Mat src = imread("src.png"); //待配准图

ref_win = ref.clone();

src_win = src.clone();

namedWindow("待配准图");

namedWindow("基准图");

imshow("待配准图", src_win);

imshow("基准图", ref_win);

setMouseCallback("待配准图", on_mouse2);

setMouseCallback("基准图", on_mouse1);

waitKey();

string str;

printf("往下执行?\n");

cin >> str;

//求变换矩阵

Mat homo = findHomography(imagePoints2, imagePoints1, CV_RANSAC

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值