opencv 透视变换(一) — 求两幅图像上对应四个点的透视变换矩阵

opencv 通过透视变换可以将图像的整体或部分进行映射处理,实现其它的视觉效果。透视变换矩阵是核心,这里给出如何根据两幅图像对应区域计算透视变换矩阵,以实现透视变换。可以用到相机标定等处理中。

两种选点计算方式。

1、手动选点输入计算

#include<iostream>
#include<opencv2/opencv.hpp>
#include "opencv2/features2d.hpp"
using namespace cv;
using namespace std;


int main()
{
	Mat imgc = imread("D:/cal/c.jpg");
	Mat imge = imread("D:/cal/e.jpg");

	vector<Point2f> c_corners(4);
	c_corners[0] = Point2f(246, 249);
	c_corners[1] = Point2f(489, 649);
	c_corners[2] = Point2f(587, 491);
	c_corners[3] = Point2f(424, 69);

	vector<Point2f> e_corners(4);		//src点对应想放置的位置。例如旋转
	e_corners[0] = Point2f(348, 238);
	e_corners[1] = Point2f(576, 585);
	e_corners[2] = Point2f(661, 440);
	e_corners[3] = Point2f(496, 66);

	for (int i = 0; i < 4; i++) {
		circle(imgc, c_corners[i], 5, { 0,0,255 }, 5);
		circle(imge, e_corners[i], 5, { 0,255,0 }, 5);
	}
	namedWindow("imgc", WINDOW_KEEPRATIO);	imshow("imgc", imgc);//观察src.dst示意图
	namedWindow("imge", WINDOW_KEEPRATIO);	imshow("imge", imge);

	/*-----------------------------------------	获取矩阵	--------------------------------------------------------------*/
	Mat transform_M = getPerspectiveTransform(c_corners, e_corners);
	cout << transform_M << endl;

	waitKey();
	return 0;
}

 

 

2、鼠标点击取两幅图像对应点

#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);
		namedWindow("Image_window", 0); setWindowProperty("Image_window", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN); imshow("Image_window", data->img);

		if (data->points.size() < 4)
		{
			data->points.push_back(Point2f(x, y));
		}
	}
}

int main(int argc, char** argv)
{
	Mat im_c = imread("D:/cal/c.jpg");
	userdata data_c;
	data_c.img = im_c;
	namedWindow("Image_window", 0); setWindowProperty("Image_window", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN); imshow("Image_window", im_c);
	setMouseCallback("Image_window", mouseHandler, &data_c);
	waitKey(0);

	Mat im_e = imread("D:/cal/e.jpg");
	userdata data_e;
	data_e.img = im_e;
	namedWindow("Image_window", 0); setWindowProperty("Image_window", WND_PROP_FULLSCREEN, WINDOW_FULLSCREEN);  imshow("Image_window", im_e);
	setMouseCallback("Image_window", mouseHandler, &data_e);
	waitKey(0);

	Mat warpMatrix = getPerspectiveTransform(data_e.points, data_c.points);

	cout << "warpMatrix=  " << warpMatrix << endl;

	getchar();
	return 0;
}

鼠标取点会更方便一些。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章