디버깅 목적으로 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);
}
}
이를 테스트하기 위해 다음 맵을 사용하여 y 축을 중심으로 이미지를 미러링했습니다.
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 로 만든지도에이 기능을 적용 해 보았습니다 . 이것은 기본적으로 OpenCV 왜곡 제거로 수행되는 작업과 동일합니다. 내 구현은 소스 이미지의 여러 픽셀이 대상 이미지의 동일한 픽셀에 매핑되는 것을 분명히 고려하지 않습니다. 그러나 더 나쁩니다. 실제로 내 소스 이미지가 대상 이미지에서 더 작은 버전으로 세 번 나타나는 것 같습니다. 그렇지 않으면 remap 명령이 완벽하게 작동합니다.
철저한 디버깅 후 저는 여러분에게 도움을 요청하기로 결정했습니다. 누구든지 내가 뭘 잘못하고 있는지 설명하거나 OpenCV에서 다시 매핑 구현에 대한 링크를 제공 할 수 있습니까?
나는 그것을 스스로 알아 냈다. 내 원래 구현에는 두 가지 근본적인 실수가 있습니다.
올바르게 수행하는 방법 :
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 <double> 대신 .at <uchar>를 사용하여 추출된다는 점을 강조하고 싶습니다. 또한지도에 대한 색인이 전환됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다