2016-02-12 6 views
0

для целей отладки Я попытался переопределить функцию переназначения 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?

+1

https://github.com/Itseez/opencv/blob/master/modules/imgproc/src/imgwarp.cpp – Miki

ответ

0

Я понял это сам. В моей первоначальной реализации есть две основные ошибки:

  1. Непонимание о том, как используются карты.
  2. Непонимание о том, как извлечь значения интенсивности.

Как правильно это сделать:

for(int j = 0; j < height; j++) 
{ 
    for(int i = 0; i < width; i++) 
    { 
     undistortedImage.at<uchar>(mapy.at<float>(j,i),mapx.at<float>(j,i)) = distortedImage.at<uchar>(j,i); 
    } 
} 

Я хочу подчеркнуть, что значения интенсивности из изображений теперь извлекаются с помощью .at <Uchar> вместо .at < двойной >. Кроме того, индексы для карт переключаются.