OpenCV中的仿射变换
OpenCV中的仿射變換
仿射變換:一個任意的仿射變換都能表示為 乘以一個矩陣 (線性變換) 接著再 加上一個向量 (平移).
通常一個圖像有三種變換:
1、旋轉
2、平移
3、縮放
通常用2X3的矩陣來表示一個仿射變換:
變換矩陣A=[a11a12a21a22]變換矩陣A=\begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix}變換矩陣A=[a11?a21??a12?a22??]
平移變化M=[txty]平移變化M=\begin{bmatrix} t_x\\t_y \end{bmatrix}平移變化M=[tx?ty??]
通常將兩個變換合為一個:仿射變換矩陣T=[a11a12txa21a22ty]仿射變換矩陣T=\begin{bmatrix}a_{11}&a_{12}&t_x\\a_{21}&a_{22}&{t_y} \end{bmatrix}仿射變換矩陣T=[a11?a21??a12?a22??tx?ty??]
假設原坐標為(x原,y原)(x_原,y_原)(x原?,y原?)經過仿射變換:
[x新y新]=[a11a12a21a22]?[x原y原]+[txty]\begin{bmatrix}x_新\\y_新 \end{bmatrix}=\begin{bmatrix} a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix}*\begin{bmatrix}x_原\\y_原 \end{bmatrix}+\begin{bmatrix}t_x\\t_y \end{bmatrix}[x新?y新??]=[a11?a21??a12?a22??]?[x原?y原??]+[tx?ty??]
以上為仿射變換的分步。
直接使用仿射變換矩陣T:
[x新y新]=[a11a12txa21a22ty]?[x原y原1]\begin{bmatrix} x_新\\y_新\end{bmatrix}=\begin{bmatrix}a_{11}&a_{12}&t_x\\a_{21}&a_{22}&{t_y} \end{bmatrix}*\begin{bmatrix}x_原\\y_原\\1\end{bmatrix}[x新?y新??]=[a11?a21??a12?a22??tx?ty??]????x原?y原?1????
下面是幾個函數的API:
利用變換前的點和變換后的點求出仿射變換矩陣:
利用旋轉角度和縮放比例來求出仿射變換矩陣:
getRotationMatrix2D(中心點,旋轉角度,縮放比例 );最后根據仿射變換矩陣對圖像進行操作:
warpAffine(輸入圖像,輸出圖像,仿射變換矩陣,原圖像.size() ); #include "opencv2/opencv.hpp" #include <iostream>using namespace std; using namespace cv;int main() {Mat test = Mat::zeros(500,500,CV_8UC3);imshow("test",test);Point2f p[3];Point2f q[3];p[0] = Point2f(200,300);p[1] = Point2f(400,100);p[2] = Point2f(70,80);line(test,p[0],p[1],Scalar(255,255,255),3,8);line(test,p[0],p[2],Scalar(255,255,255),3,8);line(test,p[2],p[1],Scalar(255,255,255),3,8);q[0] = Point2f(300,300);q[1] = Point2f(500,100);q[2] = Point2f(170,80);line(test,q[0],q[1],Scalar(255,255,255),3,8);line(test,q[0],q[2],Scalar(255,255,255),3,8);line(test,q[2],q[1],Scalar(255,255,255),3,8);Mat tr = getAffineTransform(p,q);cout << tr << endl;imshow("test",test);Mat src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/map.png");Mat dst;Point center = Point(src.cols/2,src.rows/2);double angle = -50.0;double scale = 0.6;tr = getRotationMatrix2D(center,angle,scale);warpAffine(src,dst,tr,src.size());imshow("dst",dst);waitKey(0);return 0; }總結
以上是生活随笔為你收集整理的OpenCV中的仿射变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CamshiftDemo详解
- 下一篇: 嵌入式开发