2016-07-06 1 views
1

보간없이 왜곡되지 않은 이미지를 얻으려고 많은 노력을했습니다. 그러나 아래 코드를 실행하면 이상한 이미지가 나옵니다. init_ndistortRectifyMap 함수를 사용하여 mapx와 mapy에 CV_16SC2 타입의 mapy를 나중에 convertMaps 함수를 사용하여 제공합니다. mapx와 mapy를 CV_32FC1로 변환합니다. 이유는 없지만 도움이 될만한 것을 찾지 못했습니다.보간없이 왜곡되지 않은 이미지를 얻는 방법

왜곡 된 이미지 화상 (j, I) = cf1.at (mapy.at (j undistorted.at 코드 이 버전 보간없이

int main() 
{ 
Mat Cam1MatrixParam, Cam1Distortion; 
Mat cf1; 
cf1=imread("cam1.distort1.jpg", CV_LOAD_IMAGE_COLOR); 
    Size imagesize = cf1.size(); 
FileStorage fs1("cameracalibration.xml", FileStorage::READ); 
    fs1["camera_matrix"] >> Cam1MatrixParam; 
    fs1["distortion_coefficients"] >> Cam1Distortion; 
    Mat R = Mat::eye(3, 3, CV_32F) * 1; 
    int width = cf1.cols; 
int height = cf1.rows; 
Mat undistorted = Mat(height, width, CV_8UC3); 
Mat mapx = Mat(height, width, CV_32FC1); 
Mat mapy = Mat(height, width, CV_32FC1); 

initUndistortRectifyMap(Cam1MatrixParam, Cam1Distortion, Cam1MatrixParam, R, imagesize, CV_16SC2, mapx, mapy); 
convertMaps(mapx, mapy, mapx, mapy, CV_32FC1, false); 

    for (int j = 0; j < height; j++) 
    { 
     for (int i = 0; i < width; i++) 
     { 
     undistorted.at<uchar>(mapy.at<float>(j, i), mapx.at<float>(j, i)) = cf1.at<uchar>(j, i); 
     } 
    } 
    imwrite("cam1.undistortimage.png", undistorted); 

} 

화상 undistort 적용 후 , i), mapx.at (j, i)); undistort 기능 (가까운 보간 리맵)와

이미지

+0

어쩌면 당신은 이력서 :: 다시 매핑을 사용할 수 있습니다 CV_INTER_NN을 사용하여 보간 대신 가장 가까운 픽셀을 선택 하시겠습니까? – Micka

+0

예. 가장 가까운 보간법이 선형 보간법보다 두 배 빠르기 때문에 이미 해왔습니다. – Reddy2810

+0

그래서 "보간법 없음"에 대해 이야기한다면 다른 무엇을 기대합니까? – Micka

답변

0

대신 한번 더인가한다 왜곡을 취소의 같다.

mapy지도를 표시 좌표에서 사진 좌표로 매핑합니다.

undistorted.at<cv::Vec3b>(j, i) = distort.at<cv::Vec3b>(mapy.at<float>(j, i), mapx.at<float>(j, i)); 

참고로이 코드를 해석 할 수있는 각각의 디스플레이 찾을 {j, i} 좌표는 대응하는 (왜곡) 사진 좌표 다음 화소를 복사한다.

+0

아니요, 출력 이미지는 위에 게시 한 이미지와 여전히 유사합니다. 예상 출력 이미지가 아닙니다. – Reddy2810

+0

코드가 다르기 때문에 사실 일 수 없습니다. 'mapx'와'mapy'가 함수를 식별하지 않는 한. –

+0

그래서 mapx와 mapy는 identity 함수 여야합니다. i, e는 올바른 출력 이미지를 얻기 위해 동일한 값을 갖습니다. – Reddy2810

0

당신이 컬러 이미지 (CV : Vec3b)를 사용하여 너무 대신 시도됩니다 어쩌면 맥심 Egorushkin의 대답과 함께

undistorted.at<cv::Vec3b>(mapy.at<float>(j, i), mapx.at<float>(j, i)) = cf1.at<cv::Vec3b>(j, i); 

을 undistort지도가 반대 인 경우

+0

예. 당신은 내가 (cv :: Vec3b)를 고려해야 할 필요가있다. 그러나 재 작성하면 변형되지 않는다. (j, i) = cf1.at (mapy.at (j, i), mapx .at (j, i)); 그럼 난 일반적으로 선형 보간과 undistort 함수에서 얻을 비슷한 undistorted 이미지를 얻을.하지만 이미지 보간이 필요하지 않습니다. – Reddy2810

+0

버전의 결과와 cv :: undistort의 결과를 선형 보간법으로 더할 수 있습니까? – Micka

+0

위의 이미지를 확인하십시오 내가 업로드했습니다 – Reddy2810

관련 문제