乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      仿射變換詳解 warpAffine

       imelee 2017-08-04

      今天遇到一個(gè)問(wèn)題是關(guān)于仿射變換的,但是由于沒(méi)有將仿射變換的具體原理型明白,看別人的代碼看的很費(fèi)解,最后終于在師兄的幫助下將原理弄明白了,我覺(jué)得最重要的是理解仿射變換可以看成是幾種簡(jiǎn)單變換的復(fù)合實(shí)現(xiàn),

      具體實(shí)現(xiàn)形式即將幾種簡(jiǎn)單變換的變換矩陣M相乘,這樣就很容易理解啦


       

      定義:仿射變換的功能是從二維坐標(biāo)到二維坐標(biāo)之間的線性變換,且保持二維圖形的“平直性”和“平行性”。仿射變換可以通過(guò)一系列的原子變換的復(fù)合來(lái)實(shí)現(xiàn),包括平移,縮放,翻轉(zhuǎn),旋轉(zhuǎn)和剪切。

      這類(lèi)變換可以用一個(gè)3*3的矩陣M來(lái)表示,其最后一行為(0,0,1)。該變換矩陣將原坐標(biāo)為(x,y)變換為新坐標(biāo)(x',y'),

      opencv中相應(yīng)的函數(shù)是:

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

      Parameters:

      • src – input image.
      • dst – output image that has the size dsize and the same type as src .
      • M – transformation matrix,最重要的東東了,本文中著重講M的構(gòu)造
      • dsize – size of the output image.
      • flags – combination of interpolation methods (see resize() ) and the optional flag WARP_INVERSE_MAP that means that M is the inverse transformation ( ).
      • borderMode – pixel extrapolation method (see borderInterpolate()); when borderMode=BORDER_TRANSPARENT , it means that the pixels in the destination image corresponding to the “outliers” in the source image are not modified by the function.
      • borderValue – value used in case of a constant border; by default, it is 0.

       下面介紹一些典型的仿射變換:

      (1)平移,將每一點(diǎn)移到到(x+t , y+t),變換矩陣為

      (2)縮放變換  將每一點(diǎn)的橫坐標(biāo)放大或縮小sx倍,縱坐標(biāo)放大(縮小)到sy倍,變換矩陣為

      (3)旋轉(zhuǎn)變換原點(diǎn):目標(biāo)圖形圍繞原點(diǎn)順時(shí)針旋轉(zhuǎn)Θ 弧度,變換矩陣為

      (4) 旋轉(zhuǎn)變換  :目標(biāo)圖形以(x , y )為軸心順時(shí)針旋轉(zhuǎn)θ弧度,變換矩陣為

       

      相當(dāng)于兩次平移與一次原點(diǎn)旋轉(zhuǎn)變換的復(fù)合,即先將軸心(x,y)移到到原點(diǎn),然后做旋轉(zhuǎn)變換,最后將圖片的左上角置為圖片的原點(diǎn),即

      有的人可能會(huì)說(shuō)為什么這么復(fù)雜呢,那是因?yàn)樵趏pencv的圖像處理中,所有對(duì)圖像的處理都是從原點(diǎn)進(jìn)行的,而圖像的原點(diǎn)默認(rèn)為圖像的左上角,而我們對(duì)圖像作旋轉(zhuǎn)處理時(shí)一般以圖像的中點(diǎn)為軸心,因此就需要做如下處理

       如果你覺(jué)得這樣很麻煩,可以使用opencv中自帶的Mat getRotationMatrix2D(Point2f center, double angle, double scale)函數(shù)獲得變換矩陣M,

        center:旋轉(zhuǎn)中心

        angle:旋轉(zhuǎn)弧度,一定要將角度轉(zhuǎn)換成弧度

        scale:縮放尺度

      它得到的矩陣是:

       其中α = scale * cos( angle ) , β = scale  * sing( angle )  , ( center.x , center.y ) 表示旋轉(zhuǎn)軸心

      但是不得不說(shuō)opencv的文檔以及相關(guān)書(shū)籍中都把這個(gè)矩陣寫(xiě)錯(cuò)了,如下:

      建議大家自己通過(guò)下式驗(yàn)證一下,即首先將軸心(x,y)移到原點(diǎn),然后做旋轉(zhuǎn)平綻放變換,最后再將圖像的左上角轉(zhuǎn)換為原點(diǎn)

      沒(méi)有去研究該函數(shù)的源碼,不曉得源碼中到底怎么寫(xiě)的,但是在別人的博客中看到這個(gè)函數(shù)貌似需要修正

       


      opencv中還有一個(gè)函數(shù):Mat getAffineTransform(InputArray src, InputArray dst)?

       它通過(guò)三組點(diǎn)對(duì)就可以獲得它們之間的仿射變換,如果我們?cè)谝唤M圖像變換中知道變換后的三組點(diǎn),那么我們就可以利用該函數(shù)求得變換矩陣,然后對(duì)整張圖片進(jìn)行仿射變換

      還有一種與仿射變換經(jīng)?;煜淖儞Q為透視變換,透視變換需要四組點(diǎn)對(duì)才能確定變換矩陣,由于仿射變換保持“平直性”與“平行性”,因此只需要三組點(diǎn)對(duì),而透視變換沒(méi)有這種約束,故需要四組點(diǎn)對(duì)

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多