【從零學習OpenCV 4】極坐標變換

  • 2019 年 12 月 13 日
  • 筆記

經過幾個月的努力,小白終於完成了市面上第一本OpenCV 4入門書籍《從零學習OpenCV 4》。為了更讓小夥伴更早的了解最新版的OpenCV 4,小白與出版社溝通,提前在公眾號上連載部分內容,請持續關注小白。

極坐標變換就是將圖像在直角坐標系與極坐標系中互相變換,形式如圖3-26所示,它可以將一圓形圖像變換成一個矩形圖像,常用於處理鐘錶、圓盤等圖像。圓形圖案邊緣上的文字經過及坐標變換後可以垂直的排列在新圖像的邊緣,便於對文字的識別和檢測。

圖3-26 極坐標變換示意圖

OpenCV 4中提供了warpPolar()函數用於實現圖像的極坐標變換,該函數的函數原型在代碼清單3-38中給出。

代碼清單3-38 warpPolar()函數原型  1.  void cv::warpPolar(InputArray src,  2.                         OutputArray dst,  3.                         Size dsize,  4.                         Point2f center,  5.                         double  maxRadius,  6.                         int  flags  7.                         )
  • src:原圖像,可以是灰度圖像或者彩色圖像。
  • dst:極坐標變換後輸出圖像,與原圖像具有相同的數據類型和通道數。
  • dsize:目標圖像大小。
  • center:極坐標變換時極坐標的原點坐標。
  • maxRadius:變換時邊界圓的半徑,它也決定了逆變換時的比例參數。
  • flags: 插值方法與極坐標映射方法標誌,插值方法在表3-3中給出,極坐標映射方法在表3-7給出,兩個方法之間通過「+」或者「|」號進行連接。

該函數實現了圖像極坐標變換和半對數極坐標變換。函數第一個參數是需要進行極坐標變換的原始圖像,該圖像可以是灰度圖像也可以是彩色圖像。第二個參數是變換後的輸出圖像,與輸入圖像具有相同的數據類型和通道數。第三個參數是變換後圖像的大小。第四個參數是極坐標變換時極坐標原點在原圖像中的位置,該參數同樣適用於逆變換中。第五個參數是變換時邊界圓的半徑,它也決定了逆變換時的比例參數。最後一個參數是變換方法的選擇標誌,插值方法在表3-3中給出,極坐標映射方法在表3-7給出,兩個方法之間通過「+」或者「|」號進行連接。

表3-7 warpPolar()函數極坐標映射方法標誌

標誌參數

作用

WARP_POLAR_LINEAR

極坐標變換

WARP_POLAR_LOG

半對數極坐標變換

WARP_INVERSE_MAP

逆變換

該函數可以對圖像進行極坐標正變換也可以進行逆變換,關鍵在於最後一個參數如何選擇。為了了解圖像極坐標變換的功能以及相關函數的使用,在代碼清單3-39給出了對錶盤圖像進行極坐標正變換和逆變換的示例程序。程序中選取錶盤的中心作為極坐標的原點,變換的結果在圖3-27給出。

代碼清單3-39 mywarpPolar.cpp圖像極坐標變換  1.  #include <opencv2opencv.hpp>  2.  #include <iostream>  3.  4.  using namespace std;  5.  using namespace cv;  6.  7.  int main()  8. {  9.    Mat img = imread("dial.png");  10.    if (!img.data)  11.    {  12.      cout << "請檢查圖像文件名稱是否正確" << endl;  13.      return -1;  14.    }  15.  16.    Mat img1, img2;  17.    Point2f center = Point2f(img.cols / 2, img.rows/2); //極坐標在圖像中的原點  18.    //正極坐標變換  19.    warpPolar(img, img1, Size(300,600), center, center.x,  20.                               INTER_LINEAR + WARP_POLAR_LINEAR);  21.    //逆極坐標變換  22.    warpPolar(img1, img2, Size(img.rows,img.cols), center, center.x,  23.                          INTER_LINEAR + WARP_POLAR_LINEAR + WARP_INVERSE_MAP);  24.  25.    imshow("原錶盤圖", img);  26.    imshow("錶盤極坐標變換結果", img1);  27.    imshow("逆變換結果", img2);  28.    waitKey(0);  29.    return 0;  30.  }

圖3-27 mywarpPolar.cpp程序中極坐標正變換和逆變換的結果