для целей отладки Я попытался переопределить функцию переназначения OpenCV. Без учета интерполяции, это должно выглядеть примерно так:Как работает функция переназначения в OpenCV для неискаженных изображений?
for(int j = 0; j < height; j++)
{
for(int i = 0; i < width; i++)
{
undistortedImage.at<double>(mapy.at<float>(j,i),mapx.at<float>(j,i)) = distortedImage.at<double>(j,i);
}
}
Чтобы проверить это, я использовал следующие карты, чтобы отразить изображение вокруг оси у:
int width = distortedImage.cols;
int height = distortedImage.rows;
cv::Mat mapx = Mat(height, width, CV_32FC1);
cv::Mat mapy = Mat(height, width, CV_32FC1);
for(int j = 0; j < height; j++)
{
for(int i = 0; i < width; i++)
{
mapx.at<float>(j,i) = width - i - 1;
mapy.at<float>(j,i) = j;
}
}
Но интерполяция работает точно так же, как
cv::remap(distortedImage, undistortedImage, mapx, mapy, CV_INTER_LINEAR);
Теперь я пытался применить эту функцию на картах, созданных OCamCalib Toolbox для undistorting изображений. Это, в основном, то же самое, что и OpenSV undistortion. Моя реализация теперь, очевидно, не учитывает, что несколько пикселей из исходного изображения сопоставляются с одним и тем же пикселем в целевом изображении. Но это хуже. На самом деле, похоже, что исходное изображение появляется три раза в меньших версиях целевого изображения. В противном случае команда переназначения отлично работает.
После исчерпывающей отладки я решил попросить вас, ребята, за помощью. Может ли кто-нибудь объяснить мне, что я делаю неправильно, или предоставить ссылку на реализацию переназначения в OpenCV?
https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/imgwarp.cpp – Miki