Правильное использование initUndistortRectifyMap и переназначение из OpenCV

Я хочу не искажать изображение с камеры. Неискаженная функция OpenCV слишком медленная, поэтому я хочу разделить ее, как указано в документации, на 2 вызова: initUndistortRectifyMap (как этап инициализации) и remap (в цикле рендеринга).
Сначала я попробовал тестовую программу с основным подходом:

//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. Код компилируется и запускается, но в результате получается неправильное изображение:
введите описание изображения здесь

Есть идеи, что не так с моим кодом?

0

Решение

Это работает, да. Если честно, я точно не помню, в чем проблема. Я поменял ширину и высоту или что-то подобное.

Это мой бегущий код:

//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);
2

Другие решения


По вопросам рекламы [email protected]