欧美日韩在线第一页-欧美日韩在线观看精品-欧美日韩在线观看一区二区-欧美日韩在线免费看-欧美日韩在线视频不卡一区二区三区

圖像處理
新聞詳情

仿射變換與透視變換

發(fā)布時間:2020-12-04 10:18:40 瀏覽次數(shù):2320

仿射變換和透視變換更直觀的叫法可以叫做「平面變換」和「空間變換」或者「二維坐標變換」和「三維坐標變換」。一個是二維坐標(x,y),一個是三維坐標(x,y,z)。也就是: 

仿射變換: 

圖 1.1  

1.2

 

透視變換:

1.3



1.4
1.5

 

1.6

 

??從另一個角度也能說明三維變換和二維變換的意思,仿射變換的方程組有6個未知數(shù),所以要求解就需要找到3組映射點,三個點剛好確定一個平面。透視變換的方程組有8個未知數(shù),所以要求解就需要找到4組映射點,四個點就剛好確定了一個三維空間。 
  ??仿射變換和透視變換的數(shù)學原理也不需要深究,其計算方法為坐標向量和變換矩陣的乘積,換言之就是矩陣運算。在應用層面,放射變換是圖像基于3個固定頂點的變換,如圖1.1所示: 

圖1.1 基于三個點的仿射變換.png

??圖中紅點即為固定頂點,在變換先后固定頂點的像素值不變,圖像整體則根據(jù)變換規(guī)則進行變換同理,透視變換是圖像基于4個固定頂點的變換,如圖1.2所示: 

圖1.2 基于四個點的透視變換

??在OpenCV中,放射變換和透視變換均有封裝好的函數(shù),分別為:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

??兩種變換函數(shù)形式完全相同,因此以仿射變換為例:

void warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
參數(shù)InputArray src:輸入變換前的圖像;
參數(shù)OutputArray dst:輸出變換后圖像,需要初始化一個空矩陣用來保存結(jié)果,不用設定矩陣尺寸;
參數(shù)Size dsize:設置輸出圖像大小;
參數(shù)int flags=INTER_LINEAR:設置插值方式,默認方式為線性插值;
后兩個參數(shù)不常用,在此不贅述。

關于生成變換矩陣InputArray M的函數(shù)getAffineTransform():

Mat getAffineTransform(const Point2f* src, const Point2f* dst)
參數(shù)const Point2f* src:原圖的三個固定頂點
參數(shù)const Point2f* dst:目標圖像的三個固定頂點
返回值:Mat型變換矩陣,可直接用于warpAffine()函數(shù)
注意,頂點數(shù)組長度超過3個,則會自動以前3個為變換頂點;數(shù)組可用Point2f[]或Point2f*表示

??示例代碼如下:

//讀取原圖
    Mat I = imread("..//img.jpg");
    //設置空矩陣用于保存目標圖像
    Mat dst;
    //設置原圖變換頂點
    Point2f AffinePoints0[3] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50) };
    //設置目標圖像變換頂點
    Point2f AffinePoints1[3] = { Point2f(200, 100), Point2f(200, 330), Point2f(500, 50) };
    //計算變換矩陣
    Mat Trans = getAffineTransform(AffinePoints0, AffinePoints1);
    //矩陣仿射變換
    warpAffine(I, dst, Trans, Size(I.cols, I.rows));
    //分別顯示變換先后圖像進行對比
    imshow("src", I);
    imshow("dst", dst);
    waitKey();

??同理,透視變換與仿射變換函數(shù)類似:

void warpPerspective(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

??生成變換矩陣函數(shù)為:

Mat getPerspectiveTransform(const Point2f* src, const Point2f* dst)

??注意透視變換頂點為4個。

??兩種變換完整代碼及結(jié)果比較:

#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;

Mat AffineTrans(Mat src, Point2f* scrPoints, Point2f* dstPoints)
{
    Mat dst;
    Mat Trans = getAffineTransform(scrPoints, dstPoints);
    warpAffine(src, dst, Trans, Size(src.cols, src.rows), CV_INTER_CUBIC);
    return dst;
}

Mat PerspectiveTrans(Mat src, Point2f* scrPoints, Point2f* dstPoints)
{
    Mat dst;
    Mat Trans = getPerspectiveTransform(scrPoints, dstPoints);
    warpPerspective(src, dst, Trans, Size(src.cols, src.rows), CV_INTER_CUBIC);
    return dst;
}

void main()
{
    Mat I = imread("..//img.jpg");  //700*438
    Point2f AffinePoints0[4] = { Point2f(100, 50), Point2f(100, 390), Point2f(600, 50), Point2f(600, 390) };
    Point2f AffinePoints1[4] = { Point2f(200, 100), Point2f(200, 330), Point2f(500, 50), Point2f(600, 390) };
    Mat dst_affine = AffineTrans(I, AffinePoints0, AffinePoints1);
    Mat dst_perspective = PerspectiveTrans(I, AffinePoints0, AffinePoints1);
    for (int i = 0; i < 4; i++)
    {
        circle(I, AffinePoints0[i], 2, Scalar(0, 0, 255), 2);
        circle(dst_affine, AffinePoints1[i], 2, Scalar(0, 0, 255), 2);
        circle(dst_perspective, AffinePoints1[i], 2, Scalar(0, 0, 255), 2);
    }

    imshow("origin", I);
    imshow("affine", dst_affine);
    imshow("perspective", dst_perspective);
    waitKey();
}

1.3 程序運行結(jié)果
??可以看出,仿射變換以3個點為基準點,即使數(shù)組長度為4也僅取前3個點作為基準點;透視變換以4個點為基準點,兩種變換結(jié)果不相同。應根據(jù)實際情況判斷使用哪種變換方式更佳。

在線客服 雙翌客服
客服電話
  • 0755-23712116
  • 13310869691
主站蜘蛛池模板: 欧美成人精品福利在线视频| 色婷婷在线视频| 黄色一毛片| 国产免费网址| 色天天天综合色天天碰| 91视频免费播放| 日本aaa大片| 亚洲成人免费网址| 免费在线看黄色片| 国产一级片观看| 香蕉tv亚洲专区在线观看| 超级成人97碰碰碰免费| 劲爆欧美色欧美| 欧美曰韩一区二区三区| 亚洲嗯啊| 91久久精品青青草原伊人| 久久久网| 日韩欧美区| 亚洲国产一区二区三区| 色久在线| 欧美日本一区亚洲欧美一区| 国产成综合| 国产精品久久久久一区二区| 黄色片在线免费播放| 成人福利短视频| 国产精品亚洲欧美云霸高清| 久久国内精品自在自线400部o| 日日摸夜夜夜夜夜添| 亚洲精品高清久久| 在线亚洲日产一区二区| aaa国产一级毛片| 一级黄色片在线播放| 久久青草18免费观看网站| 日本精品一区| 日韩视频91| 日韩精品一区在线观看| 毛片在线观看地址| 亚洲国产成人超福利久久精品 | 国产免费爽爽视频免费可以看| 久久青青视频| 久久美女精品|