Я пытаюсь исказить изображение в 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 в качестве входных данных.
Любой свет на эту тему будет замечательным. Благодаря
в вашем образце кода undistortPoints не делает использование Src матрицы вообще, поэтому ошибка должна быть где-то в другом месте. – Micka
, если вы отправили сообщение об ошибке (присвоение не выполнено: ...), мы могли бы сказать вам, что 'pixel_locations_src' должен быть 1D-матрицей (или вектором). – Micka
- это 'fractional_locations_dst', заполненный значениями вообще? Эти значения используются, но imho они никогда не были установлены (только выделены)? – Micka