我想限制OpenCV的cvLogPolar函數極座標變換的操作區域。我會考慮從頭開始重寫這個函數。我正在解開魚眼鏡頭圖像以產生全景圖,並且我想盡可能地提高它的效率。大部分的圖像的被變換後裁剪掉,在輸入圖像中給出的興趣的環狀區域:OpenCV極座標變換選擇區
這意味着大量的處理是在黑色像素浪費。
這應該很簡單吧?該函數應該爲削波範圍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怎麼樣?我希望它忽略不動的像素,或者它是可以忽略不計的計算成本。
這是一箇舊帖子,但我真的(真的)對你的結果感興趣!你介意解釋你對lopPolar/linearPolar操作的修改,或者...哼...發佈一些代碼?非常感謝 ! –
其實我試圖做的反面:笛卡爾到極座標,但我不能設法使用cartToPolar函數... –