使用OpenCV在C ++中通过单应矩阵进行图像转换(warpPerspective)

时间:2015-08-10 14:38:07

标签: c++ image opencv image-processing homography

我尝试使用单应矩阵对图像进行透视变换。

鉴于平移和旋转,我制作了单应矩阵并将其应用于透视变换:

Mat srcImg = imread("tests/image3.jp2", IMREAD_COLOR);
Mat dstImg, H;

Get_Homography(H, srcImg.size());

warpPerspective(srcImg, dstImg, H, dstImg.size());

imshow("output", dstImg);

#define FL_x 1000.0
#define FL_y 1000.0
void Get_Homography(Mat &H_out, cv::Size size)
{
static float H_uc[9], C[9], C_inv[9], H[9], C_inv_H_uc[9];
static float H33[3][3];
static float R[9];
static float T[3];
static float n[3];
static float d;
static float nTd[9];
static float phi, the, psi;

n[0] = n[1] = 0.0;
n[2] = -1.0;

T[0] = -500;
T[1] = -500;
T[2] = 0.0;

d = 100.0;

phi = 0.0*D2R;
the = 0.0*D2R;
psi = 0.0*D2R;

matMult(T, n, 3, 1, 3, nTd);
matMult(nTd, &d, 9, 1, 1, nTd);

getDCM_I2B(phi, the, psi, R);

matAdd(R, nTd, 3, 3, H_uc);

C[0] = FL_x;    C[1] = 0.0;     C[2] = size.width / 2.0;
C[3] = 0.0;     C[4] = FL_y;    C[5] = size.height / 2.0;
C[6] = 0.0;     C[7] = 0.0;     C[8] = 1.0;

matInv33(C, C_inv);

matMult(C_inv, H_uc, 3, 3, 3, C_inv_H_uc);
matMult(C_inv_H_uc, C, 3, 3, 3, H);

H33[0][0] = H[0];
H33[0][1] = H[1];
H33[0][2] = H[2];
H33[1][0] = H[3];
H33[1][1] = H[4];
H33[1][2] = H[5];
H33[2][0] = H[6];
H33[2][1] = H[7];
H33[2][2] = H[8];

H_out = Mat(3, 3, CV_32F, H33);

return;

}

z轴的旋转(" psi"的任何值)都可以正常工作。

但是当我把任何值(甚至1.0度)放到""或者" phi",结果图像很尴尬。我无法辨认它是什么。

当我将[-500,-500,0]放到T(平移)时,它会产生一个移位的图像,好像它被拍摄在不同的位置(向右移动),但我认为-500 -500太大了对于d = 1.0,结果图像只显示几个像素移位(不可识别)。

我认为构建单应矩阵的实现是正确的,但结果很尴尬。

你能就此给我一些建议吗?

谢谢。

0 个答案:

没有答案