如图,将图像中四边形区域转换为矩形,并保存。
这里用到几何图像变换中的透视变换。可以把上图中的效果理解为把左图中的补丁单独拿出保存,即抠补丁。当然如果是只在原图上保存四边形区域周围置零操作并没对于后续其它图像处理意义不大,因此将该区域保存为矩形可以实现更多的图像草图。
参考以下资料进行学习,并对原代码进行必要的简单注释,用getPerspectiveTransform()函数替换findHomography()计算转换矩阵。
https://blog.csdn.net/liuphahaha/article/details/50719275
https://www.learnopencv.com/homography-examples-using-opencv-python-c/
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
struct userdata
{
Mat img;
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->img, Point(x, y), 3, Scalar(0, 255, 255), 5);
imshow("Image_window", data->img);//用同一窗口取点画点
if (data->points.size() < 4)
{
data->points.push_back(Point2f(x, y));
}
}
}
int main(int argc, char** argv)
{
//输出目标矩形,和四个顶点。
//四个顶点是按环形顺序排列的,因此在鼠标选点时也要对应环形取点
Mat outRect(360, 480, CV_8UC3);
vector<Point2f> dst_points;
dst_points.push_back(Point2f(0, 0));
dst_points.push_back(Point2f(outRect.cols, 0));
dst_points.push_back(Point2f(outRect.cols, outRect.rows));
dst_points.push_back(Point2f(0, outRect.rows));
Mat im_src = imread("D:/E/mypic/sh.jpg");
imshow("Image_window", im_src);
userdata data;
data.img = im_src.clone(); //不clone原图就被画点了
//set the callback function for any mouse event
setMouseCallback("Image_window", mouseHandler, &data);
waitKey(0);
// Mat warpMatrix = findHomography(data.points, dst_points);
Mat warpMatrix = getPerspectiveTransform(data.points, dst_points);
warpPerspective(im_src, outRect, warpMatrix, outRect.size(), INTER_LINEAR, BORDER_CONSTANT);
imwrite("outRect.jpg", outRect);//保存矩形图片
imshow("outRect", outRect);
waitKey(0);
return 0;
}