透视变换是3D转换,透视变换的本质是将图像投影到一个新的视平面;
据此,我们可以使用透视变化来实现鸟瞰图和图形贴图的效果;
一、鸟瞰图
实现前:

实现效果:

1.准备一个空的mat对象 用于保存转换后的图
Mat image=imread("road.jpg");
imshow("image",image);
Mat result=Mat::zeros(500,600,CV_8UC1);
//存储转换后的图像坐标 按顺时针 左上、右上、右下、左下(可自己定顺序)
vector<Point2f> obj;
obj.push_back(Point2f(0,0));
obj.push_back(Point2f(600,0));
obj.push_back(Point2f(600,500));
obj.push_back(Point2f(0,500));
2.在原图窗口里做鼠标操作,通过setMouseCallback鼠标回调函数,获取原图四个坐标
在原图中点击四个点获取四个坐标,顺序与上述1中设置的坐标对应,如果1中是顺时针,按选择坐标时也应该按顺时针操作,并且按照左上、右上、右下、左下顺序;
//2.在原图窗口里做鼠标操作,通过鼠标回调函数,获取原图四个坐标
struct imagedata data;
data.img=image;//将原图传入
setMouseCallback("image",mouseHundle,&data);//鼠标回调函数
waitKey(0);//键盘输入 向下执行
//点击按键之后结束鼠标操作,得到原图四个坐标和转换后的坐标
//用到的结构体和鼠标处理函数
struct imagedata
{
Mat img;
vector<Point2f>points;
//该points是test1原图需要做转换的坐标
//在test2中是原图转换后的坐标
};
void mouseHundle(int event,int x,int y,

本文详细介绍了如何利用OpenCV库在C++中实现图像的透视变换,包括创建鸟瞰图和图形贴图。通过设置四个控制点,计算坐标映射矩阵并应用warpPerspective函数,实现了从普通图像到鸟瞰图的转换。同时,展示了如何将一张图像贴到另一张图像上,通过选择目标位置并填充黑色避免颜色冲突。整个过程结合了鼠标回调函数,使用户能够交互式地选择变换点。
最低0.47元/天 解锁文章
5762

被折叠的 条评论
为什么被折叠?



