getAffineTransform函数
getAffineTransform函數(shù)
函數(shù)作用:
主要用于生成仿射變換矩陣
一個(gè)任意的仿射變換都能表示為?乘以一個(gè)矩陣?(線性變換) 接著再?加上一個(gè)向量?(平移).
綜上所述, 我們能夠用仿射變換來(lái)表示:
你現(xiàn)在可以知道, 事實(shí)上, 仿射變換代表的是兩幅圖之間的?關(guān)系?.
我們通常使用??矩陣來(lái)表示仿射變換.
考慮到我們要使用矩陣??和??對(duì)二維向量??做變換, 所以也能表示為下列形式:
?or?
怎樣才能求得一個(gè)仿射變換?
好問(wèn)題. 我們?cè)谏衔挠刑岬竭^(guò)仿射變換基本表示的就是兩幅圖片之間的?聯(lián)系?. 關(guān)于這種聯(lián)系的信息大致可從以下兩種場(chǎng)景獲得:
讓我們形象地說(shuō)明一下. 因?yàn)榫仃??聯(lián)系著兩幅圖片, 我們以其表示兩圖中各三點(diǎn)直接的聯(lián)系為例. 見(jiàn)下圖:
點(diǎn)1, 2 和 3 (在圖一中形成一個(gè)三角形) 與圖二中三個(gè)點(diǎn)一一映射, 仍然形成三角形, 但形狀已經(jīng)大大改變. 如果我們能通過(guò)這樣兩組三點(diǎn)求出仿射變換 (你能選擇自己喜歡的點(diǎn)), 接下來(lái)我們就能把仿射變換應(yīng)用到圖像中所有的點(diǎn).
函數(shù)的調(diào)用形式:
C++:?Mat?getAffineTransform(InputArray?src, InputArray?dst)
參數(shù)詳解:
InputArray?src:表示輸入的三個(gè)點(diǎn)
InputArray?dstL:表示輸出的三個(gè)點(diǎn)
獲取變換矩陣
opencv代碼:
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h>using namespace cv; using namespace std;/// 全局變量 char* source_window = "Source image"; char* warp_window = "Warp"; char* warp_rotate_window = "Warp + Rotate";/** @function main */int main( int argc, 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], 1 );/// 設(shè)置目標(biāo)圖像的大小和類型與源圖像一致warp_dst = Mat::zeros( src.rows, src.cols, src.type() );/// 設(shè)置源圖像和目標(biāo)圖像上的三組點(diǎn)以計(jì)算仿射變換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 );/// 求得仿射變換warp_mat = getAffineTransform( srcTri, dstTri );/// 對(duì)源圖像應(yīng)用上面求得的仿射變換warpAffine( src, warp_dst, warp_mat, warp_dst.size() );/** 對(duì)圖像扭曲后再旋轉(zhuǎn) *//// 計(jì)算繞圖像中點(diǎn)順時(shí)針旋轉(zhuǎn)50度縮放因子為0.6的旋轉(zhuǎn)矩陣Point center = Point( warp_dst.cols/2, warp_dst.rows/2 );double angle = -50.0;double scale = 0.6;/// 通過(guò)上面的旋轉(zhuǎn)細(xì)節(jié)信息求得旋轉(zhuǎn)矩陣rot_mat = getRotationMatrix2D( center, angle, scale );/// 旋轉(zhuǎn)已扭曲圖像warpAffine( warp_dst, warp_rotate_dst, rot_mat, warp_dst.size() );/// 顯示結(jié)果namedWindow( source_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );namedWindow( warp_window, CV_WINDOW_AUTOSIZE );imshow( warp_window, warp_dst );namedWindow( warp_rotate_window, CV_WINDOW_AUTOSIZE );imshow( warp_rotate_window, warp_rotate_dst );/// 等待用戶按任意按鍵退出程序waitKey(0);return 0;}
總結(jié)
以上是生活随笔為你收集整理的getAffineTransform函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: getRectSubPix函数
- 下一篇: getPerspectiveTransf