opencv 透視變換(三)打補丁 — 替換指定區域圖像

 

 

        如圖,將一個矩形圖像投射到圖像上某一區域。這裏用到幾何圖像變換的透視變換。首先要計算出源圖像矩形(或圖像中的某一區域)與目標區域間的變換矩陣,再對源圖像中區域進行透視變換,再對兩幅圖像進行加操作。由於處理效果像對圖像加上補丁,爲形象化表達這裏稱爲打補丁。

        如果想從其他圖像的一個不規則區域這裏專指四邊形區域圖像,還可以參考本系列的“摳補丁”文章從圖像中任意四邊形區域中獲取。

        這裏參考以下資料進行學習、整理、記錄,對原代碼進行簡單改動和註釋,如用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", data->img);
		if (data->points.size() < 4)
		{
			data->points.push_back(Point2f(x, y));
		}
	}

}

int main(int argc, char** argv)
{

	// Read in the image. 圖標
	Mat img_icon = imread("outRect.jpg");

	int nrows = img_icon.rows;
	int ncols = img_icon.cols;

	Size size = img_icon.size();
	// Create a vector of points.
	vector<Point2f> src_points;
	src_points.push_back(Point2f(0, 0));
	src_points.push_back(Point2f(size.width - 1, 0));
	src_points.push_back(Point2f(size.width - 1, size.height - 1));
	src_points.push_back(Point2f(0, size.height - 1));

	// Destination image 大圖
	Mat im_dst = imread("D:/show-1.jpg");

	// Set data for mouse handler
	Mat im_temp = im_dst.clone();
	userdata data;
	data.img = im_temp;


	imshow("Image", im_temp);
	cout << "Click on four corners(start from left-top to left-bottom) of a billboard and then press ENTER" << endl;
	//set the callback function for any mouse event
	setMouseCallback("Image", mouseHandler, &data);
	waitKey(0);

	// Calculate Homography between source and destination points
	Mat h = findHomography(src_points, data.points);
	warpPerspective(img_icon, im_temp, h, im_temp.size());  //把整圖投射到全0大圖的某一區域

	// Extract four points from mouse data
	Point pts_dst[4];
	for (int i = 0; i < 4; i++)
	{
		pts_dst[i] = data.points[i];
	}

	// Black out polygonal area in destination image.
	fillConvexPoly(im_dst, pts_dst, 4, Scalar(0));	//將圖像多邊形區域置零

	// Add warped source image to destination image.
	im_dst = im_dst + im_temp;

	imshow("dst", im_dst);


	waitKey(0);

	return 0;
}

 

 

 

 

 

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