2016-01-05 3 views
1

Я пытаюсь исказить изображение в opencv. Сначала изображение, снятое камерой с отверстиями, неудивительно благодаря работе cv::undistort(raw, undist, cameraMatrix, distCoeffs);. Теперь я пытаюсь исказить undist в исходное состояние с патчем, который я нашел здесь: http://code.opencv.org/issues/1387 , но до сих пор мне не удалось заставить его работать. Вот код:Невозможно исказить обратное изображение в opencv C++

void distort(const cv::Mat& src, cv::Mat& dst, const cv::Mat& cameraMatrix, const cv::Mat& distCoeffs) 
{ 

    cv::Mat pixel_locations_src = cv::Mat(src.size(), CV_32FC2); 

    for (int i = 0; i < src.size().height; i++) { 
    for (int j = 0; j < src.size().width; j++) { 
     pixel_locations_src.at<cv::Point2f>(i,j) = cv::Point2f(j,i); 
    } 
    } 

    cv::Mat fractional_locations_dst = cv::Mat(src.size(), CV_32FC2); 

    cv::Mat pixel_locations_dst = cv::Mat(src.size(), CV_32FC2); 

    cv::undistortPoints(pixel_locations_src, pixel_locations_dst, cameraMatrix, distCoeffs); 

    const float fx = cameraMatrix.at<double>(0,0); 
    const float fy = cameraMatrix.at<double>(1,1); 
    const float cx = cameraMatrix.at<double>(0,2); 
    const float cy = cameraMatrix.at<double>(1,2); 

    // is there a faster way to do this? 
    for (int i = 0; i < fractional_locations_dst.size().height; i++) { 
    for (int j = 0; j < fractional_locations_dst.size().width; j++) { 
     const float x = fractional_locations_dst.at<cv::Point2f>(i,j).x*fx + cx; 
     const float y = fractional_locations_dst.at<cv::Point2f>(i,j).y*fy + cy; 
     pixel_locations_dst.at<cv::Point2f>(i,j) = cv::Point2f(x,y); 
    } 
    } 

    cv::remap(src, dst, pixel_locations_dst, cv::Mat(), CV_INTER_LINEAR); 
} 

Я попытался передать RGB изображение функции, но поскольку undistortPoints занимает 1 * N, 2 канала, матрицу кода будет срабатывать утверждение на undistortPoints я не понимаю, почему distort() принимает матрица 1xN в качестве входных данных.

Любой свет на эту тему будет замечательным. Благодаря

+0

в вашем образце кода undistortPoints не делает использование Src матрицы вообще, поэтому ошибка должна быть где-то в другом месте. – Micka

+0

, если вы отправили сообщение об ошибке (присвоение не выполнено: ...), мы могли бы сказать вам, что 'pixel_locations_src' должен быть 1D-матрицей (или вектором). – Micka

+0

- это 'fractional_locations_dst', заполненный значениями вообще? Эти значения используются, но imho они никогда не были установлены (только выделены)? – Micka

ответ

0

я, наконец, использовали другой подход, я только нужно искажать назад определенный набор точек, вот код:

void DistortPoints(const std::vector<cv::Point2f> & src, std::vector<cv::Point2f> & dst, const cv::Mat& cameraMatrix, const cv::Mat& distorsionMatrix) 
{ 
    double fx = cameraMatrix.at<double>(0,0); 
    double fy = cameraMatrix.at<double>(1,1); 
    double cx = cameraMatrix.at<double>(0,2); 
    double cy = cameraMatrix.at<double>(1,2); 
    std::vector<cv::Point3f> src2; 

    for (int i = 0; i < src.size(); i++) 
     src2.push_back(cv::Point3f((src[i].x - cx)/fx, (src[i].y - cy)/fy, 0)); 

    cv::Mat rVec(3, 1, cv::DataType<double>::type, cv::Scalar(0)); // Rotation vector 
    cv::Mat tVec(3, 1, cv::DataType<double>::type, cv::Scalar(0)); // Translation vector 

    std::vector<cv::Point2f> dst2; 
    cv::projectPoints(src2, rVec, tVec, cameraMatrix, distorsionMatrix, dst); 
} 
Смежные вопросы