2011-09-30 150 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函数... –