正确使用initUndistortRectifyMap并从OpenCV重新映射 [英] Right use of initUndistortRectifyMap and remap from OpenCV

查看:5531
本文介绍了正确使用initUndistortRectifyMap并从OpenCV重新映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使摄像机图像不失真. OpenCV的undistort函数太慢,因此我想像文档中提到的那样将其拆分为initUndistortRectifyMap(作为初始化步骤)和remap(在渲染循环中)的2个调用. 首先,我尝试了一种采用主要方法的测试程序:

I want to undistort a camera image. The undistort function of OpenCV is too slow, so I want to split it like mentioned in the documentation into the 2 calls of initUndistortRectifyMap (as init step) and remap (in the render loop).
At first, I tried a test program with the principal approach:

//create source matrix
cv::Mat srcImg(res.first, res.second, cvFormat, const_cast<char*>(pImg));

//fill matrices
cv::Mat cam(3, 3, cv::DataType<float>::type);
cam.at<float>(0, 0) = 528.53618582196384f;
cam.at<float>(0, 1) = 0.0f;
cam.at<float>(0, 2) = 314.01736116032430f;

cam.at<float>(1, 0) = 0.0f;
cam.at<float>(1, 1) = 532.01912214324500f;
cam.at<float>(1, 2) = 231.43930864205211f;

cam.at<float>(2, 0) = 0.0f;
cam.at<float>(2, 1) = 0.0f;
cam.at<float>(2, 2) = 1.0f;

cv::Mat dist(5, 1, cv::DataType<float>::type);  
dist.at<float>(0, 0) = -0.11839989180635836f;
dist.at<float>(1, 0) = 0.25425420873955445f;
dist.at<float>(2, 0) = 0.0013269901775205413f;
dist.at<float>(3, 0) = 0.0015787467748277866f;
dist.at<float>(4, 0) = -0.11567938093172066f;

cv::Mat map1, map2;
cv::initUndistortRectifyMap(cam, dist, cv::Mat(), cam, cv::Size(res.second, res.first), CV_32FC1, map1, map2);

cv::remap(srcImg, *m_undistImg, map1, map2, cv::INTER_CUBIC);

我的相机图像的格式是BGRA.代码会编译并启动,但是生成的图像是错误的:

The format of my camera image is BGRA. The code compiles and starts, but the resulting image is wrong:

任何想法,我的代码有什么问题?

Any ideas, what's wrong with my code?

推荐答案

可以,是的.老实说,我不记得确切是什么问题.我互换了宽度和高度或类似的想法.

It works, yes. To be honest, I don't remember exactly what the problem was. I interchanged width and height or somethink like that.

这是我的运行代码:

//create source matrix
cv::Mat srcImg(resolution.second, resolution.first, cvFormat, const_cast<unsigned char*>(pSrcImg));

//look if an update of the maps is necessary
if ((resolution.first != m_width) || (m_height != resolution.second))
{
    m_width  = resolution.first;
    m_height = resolution.second;

    cv::initUndistortRectifyMap(*m_camData, *m_distData, cv::Mat(), *m_camData, cv::Size(resolution.first, resolution.second), CV_32FC1, *m_undistMap1, *m_undistMap2);
}

//create undistorted image
cv::remap(srcImg, *m_undistortedImg, *m_undistMap1, *m_undistMap2, cv::INTER_LINEAR);

return reinterpret_cast<unsigned char*>(m_undistortedImg->data);

这篇关于正确使用initUndistortRectifyMap并从OpenCV重新映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆