imgproc模塊—仿射變換

1.目的
(1)使用OpenCV函數 warpAffine 來實現一些簡單的重映射.
(2)使用OpenCV函數 getRotationMatrix2D 來獲得一個 2×3 旋轉矩陣
(3)使用OpenCV函數getAffineTransform獲取仿射變換矩陣

2.原理
[1]仿射變換
使用仿射變換可以實現: 旋轉 (線性變換) ,平移 (向量加) ,縮放操作 (線性變換) 。通常使用 2×3 矩陣來表示仿射變換.
仿射變換

考慮到我們要使用矩陣 A 和 B 對二維向量 X 做變換, 所以也能表示爲下列形式:
這裏寫圖片描述

我們能通過兩組三點求出仿射變換 (你能選擇自己喜歡的點), 接下來我們就能把仿射變換應用到圖像中所有的點。
這裏寫圖片描述

3.部分代碼解釋
(1)getAffineTransform

    /*
    getAffineTransform參數解釋
    srcTri:三個不共線的點
    dstTri:變換後的三個點
    warp_mat:2×3的仿射變換矩陣
    */
    warp_mat = getAffineTransform(srcTri, dstTri);

(2)getRotationMatrix2D

    /*
    getRotationMatrix2D參數解釋
    center:旋轉中心
    angle:旋轉角度50 degrees,負數爲順時針,正數爲逆時針
    */
    warp_rotation_mat = getRotationMatrix2D(center, angle, scale);

(3)warpAffine

    /*
    warpAffine參數解釋
    src:輸入圖像
    warp_dst:變換後圖像
    warp_mat:仿射變換矩陣
    src.size():輸出圖像大小
    */
    warpAffine(src, warp_dst, warp_mat, src.size());

4.完整代碼
(1)CommonInclude.h

#ifndef COMMON_INCLUDE
#define COMMON_INCLUDE
#include<iostream>
using namespace std;
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
#endif

(2)Affine.cpp

#include "CommonInclude.h"

int main(int argc, char** argv){
    if(argc<2){
        cout << "more parameters are required!!!" << endl;
        return(-1);
    }
    //創建圖像矩陣
    Mat src;
    Mat warp_dst;
    Mat warp_rotation_dst;
    Mat warp_mat, warp_rotation_mat;
    //窗口名稱
    char origin_win[] = "Origin";
    char warpAffine_win[] = "Affine";
    char warpAffineRotation_win[] = "Affine Rotation";
    //圖像讀取
    src = imread(argv[1]);
    if(!src.data){
        cout << "error to read image!!!" << endl;
        return(-1);
    }
    imshow(origin_win, src);

    Point2f srcTri[3];
    Point2f dstTri[3];
    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 );     
    //獲取仿射變換矩陣
    /*
    getAffineTransform參數解釋
    srcTri:三個不共線的點
    dstTri:變換後的三個點
    warp_mat:2×3的仿射變換矩陣
    */
    warp_mat = getAffineTransform(srcTri, dstTri);
    cout << warp_mat << endl;
    //仿射變換
    /*
    warpAffine參數解釋
    src:輸入圖像
    warp_dst:變換後圖像
    warp_mat:仿射變換矩陣
    src.size():輸出圖像大小
    */
    warpAffine(src, warp_dst, warp_mat, src.size());
    imshow(warpAffine_win, warp_dst);
    //仿射旋轉變換
    Point2f center = Point2f(src.cols/2.0, src.rows/2.0);
    double angle = 45;
    double scale = 0.6;
    //獲取旋轉矩陣
    /*
    getRotationMatrix2D參數解釋
    center:旋轉中心
    angle:旋轉角度50 degrees,負數爲順時針,正數爲逆時針
    */
    warp_rotation_mat = getRotationMatrix2D(center, angle, scale);
    warpAffine(src, warp_rotation_dst, warp_rotation_mat, src.size());
    imshow(warpAffineRotation_win, warp_rotation_dst);
    waitKey(0);
    return(0);
}

參考文獻
1.http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html

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