W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在本教程中,您將學(xué)習(xí)如何:
您可以看到,實(shí)質(zhì)上,仿射變換表示兩個(gè)圖像之間的關(guān)系。
考慮到我們要使用A和B來(lái)轉(zhuǎn)換2D矢量,我們可以這樣做:
點(diǎn)1,2和3(在圖像1中形成三角形)被映射到圖像2中,仍然形成三角形,但是現(xiàn)在它們已經(jīng)變得眾所周知。如果我們發(fā)現(xiàn)這3個(gè)點(diǎn)的仿射變換(你可以根據(jù)需要選擇它們),那么我們可以將這個(gè)發(fā)現(xiàn)的關(guān)系應(yīng)用于圖像中的所有像素。
Code
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;
const char* source_window = "Source image";
const char* warp_window = "Warp";
const char* warp_rotate_window = "Warp + Rotate";
int main( int, char** argv )
{
Point2f srcTri[3];
Point2f dstTri[3];
Mat rot_mat( 2, 3, CV_32FC1 );
Mat warp_mat( 2, 3, CV_32FC1 );
Mat src, warp_dst, warp_rotate_dst;
src = imread( argv[1], IMREAD_COLOR );
warp_dst = Mat::zeros( src.rows, src.cols, src.type() );
srcTri[0] = Point2f( 0,0 );
srcTri[1] = Point2f( src.cols - 1.f, 0 );
srcTri[2] = Point2f( 0, src.rows - 1.f );
dstTri[0] = Point2f( src.cols*0.0f, src.rows*0.33f );
dstTri[1] = Point2f( src.cols*0.85f, src.rows*0.25f );
dstTri[2] = Point2f( src.cols*0.15f, src.rows*0.7f );
warp_mat = getAffineTransform( srcTri, dstTri );
warpAffine( src, warp_dst, warp_mat, warp_dst.size() );
Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );
double angle = -50.0;
double scale = 0.6;
rot_mat = getRotationMatrix2D( center, angle, scale );
warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );
namedWindow( source_window, WINDOW_AUTOSIZE );
imshow( source_window, src );
namedWindow( warp_window, WINDOW_AUTOSIZE );
imshow( warp_window, warp_dst );
namedWindow( warp_rotate_window, WINDOW_AUTOSIZE );
imshow( warp_rotate_window, warp_rotate_dst );
waitKey(0);
return 0;
}
Point2f srcTri [3];
Point2f dstTri [3];
Mat rot_mat(2,3,CV_32FC1);
Mat warp_mat(2,3,CV_32FC1);
Mat src,warp_dst,warp_rotate_dst;
src = imread(argv [1],1);
warp_dst = Mat :: zeros(src.rows,src.cols,src.type());
srcTri [0] = Point2f(0,0);
srcTri [1] = Point2f(src.cols - 1,0);
srcTri [2] = Point2f(0,src.rows - 1);
dstTri [0] = Point2f(src.cols * 0.0,src.rows * 0.33);
dstTri [1] = Point2f(src.cols * 0.85,src.rows * 0.25);
dstTri [2] = Point2f(src.cols * 0.15,src.rows * 0.7);
您可能想要繪制這些要點(diǎn),以便更好地了解其變化。它們的位置與示例圖中所示的位置大致相同(在理論部分)。您可能會(huì)注意到由3點(diǎn)定義的三角形的大小和方向改變。
warp_mat = getAffineTransform(srcTri,dstTri);
我們得到一個(gè)2×3矩陣作為輸出(在這種情況下為warp_mat)
warpAffine(src,warp_dst,warp_mat,warp_dst.size());
具有以下參數(shù):
我們剛剛得到了我們的第一個(gè)轉(zhuǎn)換的形象 我們會(huì)顯示一下。在此之前,我們也想旋轉(zhuǎn)它...
我們使用以下代碼片段定義這些參數(shù):
Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );
double angle = -50.0;
double scale = 0.6;
rot_mat = getRotationMatrix2D( center, angle, scale );
warpAffine(warp_dst,warp_rotate_dst,rot_mat,warp_dst.size());
namedWindow(source_window,WINDOW_AUTOSIZE);
imshow(source_window,src);
namedWindow(warp_window,WINDOW_AUTOSIZE);
imshow(warp_window,warp_dst);
namedWindow(warp_rotate_window,WINDOW_AUTOSIZE);
imshow(warp_rotate_window,warp_rotate_dst);
waitKey(0);
在編譯上面的代碼之后,我們可以給它一個(gè)圖像的路徑作為參數(shù)。例如,對(duì)于像:
在應(yīng)用第一個(gè)仿射變換后,我們得到:
最后,在應(yīng)用負(fù)旋轉(zhuǎn)(記住負(fù)方向順時(shí)針)和比例因子后,我們得到:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: