我嘗試爲warpPerspective()函數指定與基本(0,0)不同的原點,以便獨立於支持圖像大小應用變換。我在原始代碼中添加了CvPoint參數,但我無法找到使用這些座標的位置。我試圖在計算X0,Y0和W0時使用它們,但它不起作用,這隻會改變所得圖像中的變換圖像。任何想法?在OpenCV 2.x中指定warpPerspective()函數的原點
下面的代碼:
void warpPerspective(const Mat& src, Mat& dst, const Mat& M0, Size dsize,
int flags, int borderType, const Scalar& borderValue, CvPoint origin)
{
dst.create(dsize, src.type());
const int BLOCK_SZ = 32;
short XY[BLOCK_SZ*BLOCK_SZ*2], A[BLOCK_SZ*BLOCK_SZ];
double M[9];
Mat _M(3, 3, CV_64F, M);
int interpolation = flags & INTER_MAX;
if(interpolation == INTER_AREA)
interpolation = INTER_LINEAR;
CV_Assert((M0.type() == CV_32F || M0.type() == CV_64F) && M0.rows == 3 && M0.cols == 3);
M0.convertTo(_M, _M.type());
if(!(flags & WARP_INVERSE_MAP))
invert(_M, _M);
int x, y, x1, y1, width = dst.cols, height = dst.rows;
int bh0 = std::min(BLOCK_SZ/2, height);
int bw0 = std::min(BLOCK_SZ*BLOCK_SZ/bh0, width);
bh0 = std::min(BLOCK_SZ*BLOCK_SZ/bw0, height);
for(y = 0; y < height; y += bh0)
{
for(x = 0; x < width; x += bw0)
{
int bw = std::min(bw0, width - x);
int bh = std::min(bh0, height - y);
Mat _XY(bh, bw, CV_16SC2, XY), _A;
Mat dpart(dst, Rect(x, y, bw, bh));
for(y1 = 0; y1 < bh; y1++)
{
short* xy = XY + y1*bw*2;
double X0 = M[0]*x + M[1]*(y + y1) + M[2];
double Y0 = M[3]*x + M[4]*(y + y1) + M[5];
double W0 = M[6]*x + M[7]*(y + y1) + M[8];
if(interpolation == INTER_NEAREST)
for(x1 = 0; x1 < bw; x1++)
{
double W = W0 + M[6]*x1;
W = W ? 1./W : 0;
int X = saturate_cast<int>((X0 + M[0]*x1)*W);
int Y = saturate_cast<int>((Y0 + M[3]*x1)*W);
xy[x1*2] = (short)X;
xy[x1*2+1] = (short)Y;
}
else
{
short* alpha = A + y1*bw;
for(x1 = 0; x1 < bw; x1++)
{
double W = W0 + M[6]*x1;
W = W ? INTER_TAB_SIZE/W : 0;
int X = saturate_cast<int>((X0 + M[0]*x1)*W);
int Y = saturate_cast<int>((Y0 + M[3]*x1)*W);
xy[x1*2] = (short)(X >> INTER_BITS);
xy[x1*2+1] = (short)(Y >> INTER_BITS);
alpha[x1] = (short)((Y & (INTER_TAB_SIZE-1))*INTER_TAB_SIZE +
(X & (INTER_TAB_SIZE-1)));
}
}
}
if(interpolation == INTER_NEAREST)
remap(src, dpart, _XY, Mat(), interpolation, borderType, borderValue);
else
{
Mat _A(bh, bw, CV_16U, A);
remap(src, dpart, _XY, _A, interpolation, borderType, borderValue);
}
}
}
}
當使用你的函數時(順便說一下,非常感謝),我遇到了尺寸錯誤的問題。我相信你的行`int bw = std :: min(bw0,width - x); int bh = std :: min(bh0,height - y);`應該替換爲int bw = std :: min(bw0,width - xDest); int bh = std :: min(bh0,height - yDest);`。至少對我來說這很有用。 – XerXes 2012-02-08 17:59:01