实验4:几何变换与变形
实验4.1:图像透视变换
将一幅输入图像变换为任意一个指定的四边形形状(给定四边形4个顶点)。
提示:根据4个顶点的对应估计一个透视变换H,再用H对原图像进行形变(OpenCV相关函数:getPerspectiveTransform, warpPerspective等)
设计一个交互程序,可以编辑四边形顶点,并且顶点位置改变时图像形变的结果可以实时更新。
设计的交互程序如下:
程序共包含两个窗口,主窗口加载原始图像,并通过Qt界面库实现了在原始图像上绘制矩形的功能,拖拽矩形的四个顶点可以自由改变矩形的大小。第二个窗口用于展示变换之后的透视图像,可以在拖动顶点的过程中实时展示变换后的结果。
程序对图像进行变换的代码如下:
void DraggableRect::update_image(){std::vector<cv::Point2f> v;for(auto i:vertices) v.push_back(cv::Point2f(i.x(),i.y()));std::sort(v.begin(),v.end(),[](const cv::Point2f &a,const cv::Point2f &b){return a.x<b.x;});cv::Point2f lt,lb,rt,rb; //左上角,左下角,右上角,右下角if(v[0].y>v[1].y) lb=v[0],lt=v[1];else lb=v[1],lt=v[0];if(v[2].y>v[3].y) rb=v[2],rt=v[3];else rb=v[3],rt=v[2];//std::cout<<lt<<" "<<rt<<" "<<lb<<" "<<rb<<std::endl;//getPerspectiveTransform()需要接受顶点数组,下面将构造顶点数组cv::Point2f s_point[4],t_point[4];s_point[0]={0,0}; s_point[1]=cv::Point2f(Src.cols,0);s_point[2]=cv::Point2f(Src.cols,Src.rows); s_point[3]=cv::Point2f(0,Src.rows);t_point[0]=lt; t_point[1]=rt; t_point[2]=rb; t_point[3]=lb;cv::Mat trans_mat=cv::getPerspectiveTransform(s_point,t_point);cv::warpPerspective(Src,Dst,trans_mat,cv::Size(Dst.cols,Dst.rows));cv::imshow("output",Dst);
}
其中,Src
和Dst
是cv::Mat
类型的全局变量,分别保存原始图片和变换后的图片。
程序的运行结果如下图所示: