使用warpPerspective来模拟虚拟相机问题

时间:2018-04-22 20:56:56

标签: opencv computer-vision unreal-engine4 homography

道歉,如果这看似微不足道 - 对openCV来说相对较新。

基本上,我试图创建一个功能,可以接收相机的图像,该图像的已知世界坐标,以及其他一些点2的世界坐标,然后转换相机& #39;如果相机处于第2点,它将会是什么样子。根据我的理解,解决这个问题的最佳方法是使用warpPerspective工具进行单应变换。

实验正在虚幻游戏模拟引擎中完成。现在,我基本上从相机中读取数据,并为图像添加一组变换。然而,我似乎做错了,因为图像看起来像这样(原始图像首先是扭曲的图像):

原始图片 enter image description here

图片扭曲 enter image description here

这是我目前的代码。基本上,它从虚幻引擎中读取纹理,然后获取单个像素值并将它们放入openCV Mat中。然后我尝试应用我的warpPerspective转换。有趣的是,如果我只是尝试一个简单的warpAffine转换(旋转),它可以正常工作。我已经看到了这个问题:Opencv virtually camera rotating/translating for bird's eye view,但是我无法弄清楚我在做什么,而不是他们的解决方案。我真的很感谢你们的任何帮助或指导。提前谢谢!

    ROSCamTextureRenderTargetRes->ReadPixels(ImageData);


cv::Mat image_data_matrix(TexHeight, TexWidth, CV_8UC3);
cv::Mat warp_dst, warp_rotate_dst;

int currCol = 0;
int currRow = 0;
cv::Vec3b* pixel_left = image_data_matrix.ptr<cv::Vec3b>(currRow);
for (auto color : ImageData)
{
    pixel_left[currCol][2] = color.R;
    pixel_left[currCol][1] = color.G;
    pixel_left[currCol][0] = color.B;
    currCol++;
    if (currCol == TexWidth)
    {
        currRow++;
        currCol = 0;
        pixel_left = image_data_matrix.ptr<cv::Vec3b>(currRow);
    }
}

warp_dst = cv::Mat(image_data_matrix.rows, image_data_matrix.cols, image_data_matrix.type());

double rotX = (45 - 90)*PI / 180;
double rotY = (90 - 90)*PI / 180;
double rotZ = (90 - 90)*PI / 180;


cv::Mat A1 = (cv::Mat_<float>(4, 3) <<
    1, 0, (-1)*TexWidth / 2,
    0, 1, (-1)*TexHeight / 2,
    0, 0, 0,
    0, 0, 1);


// Rotation matrices Rx, Ry, Rz

cv::Mat RX = (cv::Mat_<float>(4, 4) <<
    1, 0, 0, 0,
    0, cos(rotX), (-1)*sin(rotX), 0,
    0, sin(rotX), cos(rotX), 0,
    0, 0, 0, 1);

cv::Mat RY = (cv::Mat_<float>(4, 4) <<
    cos(rotY), 0, (-1)*sin(rotY), 0,
    0, 1, 0, 0,
    sin(rotY), 0, cos(rotY), 0,
    0, 0, 0, 1);

cv::Mat RZ = (cv::Mat_<float>(4, 4) <<
    cos(rotZ), (-1)*sin(rotZ), 0, 0,
    sin(rotZ), cos(rotZ), 0, 0,
    0, 0, 1, 0,
    0, 0, 0, 1);


// R - rotation matrix
cv::Mat R = RX * RY * RZ;

// T - translation matrix
cv::Mat T = (cv::Mat_<float>(4, 4) <<
    1, 0, 0, 0,
    0, 1, 0, 0,
    0, 0, 1, dist,
    0, 0, 0, 1);


// K - intrinsic matrix 
cv::Mat K = (cv::Mat_<float>(3, 4) <<
    12.5, 0, TexHeight / 2, 0,
    0, 12.5, TexWidth / 2, 0,
    0, 0, 1, 0
    );


cv::Mat warp_mat = K * (T * (R * A1));


//warp_mat = cv::getRotationMatrix2D(srcTri[0], 43.0, 1);
//cv::warpAffine(image_data_matrix, warp_dst, warp_mat, warp_dst.size());


cv::warpPerspective(image_data_matrix, warp_dst, warp_mat, image_data_matrix.size(), CV_INTER_CUBIC | CV_WARP_INVERSE_MAP);

cv::imshow("distort", warp_dst);
cv::imshow("imaage", image_data_matrix)

0 个答案:

没有答案