Как исправить искажение изображения без потери пикселей с помощью opencv

Как мы все знаем, мы можем использовать функцию cv::getOptimalNewCameraMatrix() с alpha = 1, чтобы получить новую CameraMatrix. Затем мы используем функцию cv::undistort() с новой CameraMatrix, которая может получить изображение после устранения искажений. Однако я обнаружил, что изображение после искажения такое же большое, как и исходное изображение, а некоторая часть изображения после искажения покрыта черным цветом. Итак, мой вопрос: означает ли это, что исходный пиксель изображения потерян? и есть ли способ избежать потери пикселей или получить изображение, размер которого больше исходного изображения с помощью opencv?

cv::Mat NewKMatrixLeft = cv::getOptimalNewCameraMatrix(KMatrixLeft,DistMatrixLeft           ,cv::Size(image.cols,image.rows),1);

cv::undistort(image, show_image, KMatrixLeft, DistMatrixLeft,NewKMatrixLeft);

Размер изображения и show_image 640*480, однако, с моей точки зрения, размер изображения после искажения должен быть больше 640*480, потому что какая-то его часть бессмысленна. Спасибо!


person Jacky    schedule 28.04.2019    source источник


Ответы (1)


Чтобы исправить искажение, вы в основном должны обратить вспять процесс, вызвавший первоначальное искажение. Это означает, что пиксели растягиваются и сжимаются в разных направлениях, чтобы исправить искажение. В некоторых случаях это приведет к смещению пикселей от края изображения. В OpenCV это обрабатывается вставкой черных пикселей. В этом подходе нет ничего плохого. Затем вы можете выбрать, как обрезать его, чтобы удалить черные пиксели по краям.

person Paul92    schedule 29.04.2019