使用OpenCV實現透視變換

1 透視變換

透視變換(Perspective Transformation)是將成像投影到一個新的視平面(Viewing Plane),也稱作投影映射(Projective Mapping)。如下圖所示,通過透視變換ABC變換到A’B’C’。

在這裏插入圖片描述

2 使用OpenCV實現透視變換

2.1 getPerspectiveTransform

由四對點計算透射變換,返回由源圖像中矩形到目標圖像矩形變換的矩陣。

在這裏插入圖片描述

2.2 warpPerspective

使用getPerspectiveTransform得到的透視變換矩陣,對圖像進行透視變換,返回的是相同size的圖片。

在這裏插入圖片描述

3 代碼實現

3.1 C++

#include "opencv2/opencv.hpp"
#include <iostream>
 
using namespace cv;
using namespace std;
 
/// 全局變量
const char* source_window = "Source image";;
const char* warpPerspective_window = "warpPerspective";
 
/**
 * @主函數
 */
int main( )
{
	Point2f srcTri[4];
	Point2f dstTri[4];
 
	Mat warpPerspective_mat(3, 3, CV_32FC1);
	Mat src, warpPerspective_dst;
 
	/// Load the image
	src = imread("lena.bmp", IMREAD_COLOR);
 
	/// Set the dst image the same type and size as src
	warpPerspective_dst = Mat::zeros( src.rows, src.cols, src.type() );
 
	/// 設置4組點,求出變換矩陣
	srcTri[0] = Point2f( 0, 0);
	srcTri[1] = Point2f( src.cols-1, 0 );
	srcTri[2] = Point2f( 0, src.rows-1);
	srcTri[3] = Point2f(src.cols-1, src.rows - 1);
 
	dstTri[0] = Point2f( 0,src.rows*0.13 );
	dstTri[1] = Point2f( src.cols*0.9,0 );
	dstTri[2] = Point2f( src.cols*0.2,src.rows*0.7 );
	dstTri[3] = Point2f( src.cols*0.8,src.rows );
 
	//計算4個二維點對之間的仿射變換矩陣(2行x3列)
	warpPerspective_mat = getPerspectiveTransform(srcTri, dstTri);
 
	//應用仿射變換,可以恢復出原圖
	warpPerspective( src, warpPerspective_dst, warpPerspective_mat, src.size() );
 
	//顯示結果
	namedWindow( source_window, WINDOW_AUTOSIZE );
	imshow( source_window, src );
 
	namedWindow( warpPerspective_window, WINDOW_AUTOSIZE );
	imshow( warpPerspective_window, warpPerspective_dst );
    /// 等待,直到用戶退出
    waitKey(0);
    
    return 0;
}

3.2 Python

import cv2 as cv
import numpy as np
img = cv.imread("test/scene2.png",0)
w,h = img.shape
point1 = np.array([[308,230],[500,230],[308,640],[500,640]],dtype = "float32")
point2 = np.array([[308,230],[500,230],[155,30],[835,30]],dtype = "float32")
M = cv.getPerspectiveTransform(point1,point2)
out_img = cv.warpPerspective(img,M,(w,h))
cv.imshow("img",out_img)
cv.waitKey(0)

4 參考

[1] OpenCV官方文檔:

  • getPerspectiveTransform: https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform
  • warpPerspective: https://docs.opencv.org/2.4.9/modules/imgproc/doc/geometric_transformations.html#warpperspective

[2] https://www.cnblogs.com/aoru45/p/9763983.html

[3] https://blog.csdn.net/i_chaoren/article/details/78324184

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