2011-09-30 155 views
1

我想限制OpenCV的cvLogPolar函數極座標變換的操作區域。我會考慮從頭開始重寫這個函數。我正在解開魚眼鏡頭圖像以產生全景圖,並且我想盡可能地提高它的效率。大部分的圖像的被變換後裁剪掉,在輸入圖像中給出的興趣的環狀區域:OpenCV極座標變換選擇區

fisheye lens image

這意味着大量的處理是在黑色像素浪費。

這應該很簡單吧?該函數應該爲削波範圍radius1和radius2增加兩個參數。下面是從imgwarp.cpp的cvLogPolar功能的相關POL到車部:

cvLogPolar(const CvArr* srcarr, CvArr* dstarr, 
      CvPoint2D32f center, double M, int flags) 
{ 
    cv::Ptr<CvMat> mapx, mapy; 

    CvMat srcstub, *src = cvGetMat(srcarr, &srcstub); 
    CvMat dststub, *dst = cvGetMat(dstarr, &dststub); 
    CvSize ssize, dsize; 

    if(!CV_ARE_TYPES_EQ(src, dst)) 
     CV_Error(CV_StsUnmatchedFormats, ""); 

    if(M <= 0) 
     CV_Error(CV_StsOutOfRange, "M should be >0"); 

    ssize = cvGetMatSize(src); 
    dsize = cvGetMatSize(dst); 

    mapx = cvCreateMat(dsize.height, dsize.width, CV_32F); 
    mapy = cvCreateMat(dsize.height, dsize.width, CV_32F); 

    if(!(flags & CV_WARP_INVERSE_MAP)) 
//---snip--- 
    else 
    { 
     int x, y; 
     CvMat bufx, bufy, bufp, bufa; 
     double ascale = ssize.height/(2*CV_PI); 
     cv::AutoBuffer<float> _buf(4*dsize.width); 
     float* buf = _buf; 

     bufx = cvMat(1, dsize.width, CV_32F, buf); 
     bufy = cvMat(1, dsize.width, CV_32F, buf + dsize.width); 
     bufp = cvMat(1, dsize.width, CV_32F, buf + dsize.width*2); 
     bufa = cvMat(1, dsize.width, CV_32F, buf + dsize.width*3); 

     for(x = 0; x < dsize.width; x++) 
      bufx.data.fl[x] = (float)x - center.x; 

     for(y = 0; y < dsize.height; y++) 
     { 
      float* mx = (float*)(mapx->data.ptr + y*mapx->step); 
      float* my = (float*)(mapy->data.ptr + y*mapy->step); 

      for(x = 0; x < dsize.width; x++) 
       bufy.data.fl[x] = (float)y - center.y; 

#if 1 
      cvCartToPolar(&bufx, &bufy, &bufp, &bufa); 

      for(x = 0; x < dsize.width; x++) 
       bufp.data.fl[x] += 1.f; 

      cvLog(&bufp, &bufp); 

      for(x = 0; x < dsize.width; x++) 
      { 
       double rho = bufp.data.fl[x]*M; 
       double phi = bufa.data.fl[x]*ascale; 

       mx[x] = (float)rho; 
       my[x] = (float)phi; 
      } 
#else 
//---snip--- 
#endif 
     } 
    } 
    cvRemap(src, dst, mapx, mapy, flags, cvScalarAll(0)); 
} 

由於日常工作通過目標圖像中的像素迭代,R1和R2裁剪區域將只是需要翻譯成y1和y2行區域。然後我們改變for循環:for(y = 0; y < dsize.height; y++)變成for(y = y1; y < y2; y++)。 是否正確?

約束cvRemap怎麼樣?我希望它忽略不動的像素,或者它是可以忽略不計的計算成本。

回答

2

我最終做了一個不同的優化:我將極座標變換操作的結果存儲在持久重映射矩陣中。這有助於LOT。如果您在所有時間使用相同的極座標變換映射對全動態視頻進行極座標解纏,則您不希望每隔一幀重新計算具有一百萬次正弦/餘弦操作的變換。所以這隻需要對OpenCV源代碼中的logPolar/linearPolar操作進行一些小修改,以將重映射結果保存在外部的某個位置。

+0

這是一箇舊帖子,但我真的(真的)對你的結果感興趣!你介意解釋你對lopPolar/linearPolar操作的修改,或者...哼...發佈一些代碼?非常感謝 ! –

+0

其實我試圖做的反面:笛卡爾到極座標,但我不能設法使用cartToPolar函數... –