2012-01-12 5 views
3

Так что я очень новичок в OpenCV (2.1), поэтому, пожалуйста, имейте это в виду.OpenCV cvRemap Cropping Image

Таким образом, мне удалось откалибровать мою дешевую веб-камеру, которую я использую (с привязкой), используя метод калибровки шахматной доски для получения внутренних и искажающих коэффициентов.

У меня тогда нет проблем с возвратом этих значений и созданием карт изображений, которые затем я применяю к видеопотоке для исправления входящих изображений.

Однако я столкнулся с проблемой. Я знаю, когда он искажает/исправляет изображение, он создает несколько перекошенных разделов, а затем форматирует изображение, чтобы вырезать любые черные области. Тогда мой вопрос: могу ли я просмотреть полное искаженное изображение, в том числе в некоторых регионах с черными областями? Ниже приведен пример черных регионов с перекошенными участками, которые я пытался передать, если моя терминология отключена:

Изображение, лучше передающее регионы, о которых я говорю, может быть found here! Это изображение было обнаружено в этом post.

В настоящее время: cvRemap() возвращает в основном желтую рамку в изображении, указанном выше, но я хочу видеть все изображение, так как есть соответствующие данные. Я хочу выбраться из него.

Что я пробовал: Применяя преобразование масштаба на карту изображения, чтобы соответствовать полному изображению (в том числе вытянутых частей) в раму

 CvMat *intrinsic = (CvMat*)cvLoad("Intrinsics.xml"); 
     CvMat *distortion = (CvMat*)cvLoad("Distortion.xml"); 

     cvInitUndistortMap(intrinsic, distortion, mapx, mapy); 

     cvConvertScale(mapx, mapx, 1.25, -shift_x); // Some sort of scale conversion 
     cvConvertScale(mapy, mapy, 1.25, -shift_y); // applied to the image map 

     cvRemap(distorted,undistorted,mapx,mapy); 

cvConvertScale, когда я думаю, что я выравниваюсь х/y правильно (угадать/проверить), как-то искажает карту изображения, делая корректировку бесполезной. Здесь может быть какая-то математика, я не правильно понимаю/понимаю.

Есть ли у кого-нибудь другие предложения по решению этой проблемы или что я могу делать неправильно? Я также попытался написать свой собственный код, чтобы исправить проблемы с искажениями, но позволяет просто сказать, что OpenCV уже знает, как это сделать.

ответ

4

Из памяти вам необходимо использовать InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2), из которых InitUndistortMap - упрощенная версия.

cvInitUndistortMap(intrinsic, distort, map1, map2) 

эквивалентно:

cvInitUndistortRectifyMap(intrinsic, distort, Identity matrix, intrinsic, 
          map1, map2) 

Новые параметры R и newCameraMatrix. R вид дополнительного преобразования (например, вращения) для выполнения (просто установите его на единицу).

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

Вы получаете новую матрицу камеры с GetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...). В основном вы загружаете intrinsic, distort, ваш исходный размер изображения и параметр alpha (вместе с контейнерами для хранения матрицы результатов, см. Документацию). Параметр alpha достигнет того, чего вы хотите.

Цитирую из документации:

Функция вычисляет оптимальную новую матрицу камеры на основе свободного параметра масштабирования. Изменяя этот параметр, пользователь может получить только толковых пиксели альфа = 0, сохранить все исходные пиксели изображения, если есть ценная информация, в углах альфа = 1, или получить что-то между ними. Когда альфа> 0, результат неисторжения, скорее всего, будет иметь некоторые черные пиксели, соответствующие «виртуальным» пикселям за пределами изображения, записанного с искаженным изображением . Исходная матрица камеры, искажения коэффициенты, вычисленная новая матрица камеры и newImageSize должны быть переданы в InitUndistortRectifyMap для создания карт для Remap.

Так что для крайнего примера со всеми черными битами, показывающими, что вы хотите alpha=1.

В итоге:

  • вызов cvGetOptimalNewCameraMatrix с alpha=1 для получения newCameraMatrix.
  • использование cvInitUndistortRectifymap с R будучи единичной матрицей и newCameraMatrix набора в одном вы вычисленные
  • подпитывать новые карты в cvRemap.
+1

Mathematical.coffee, я не могу вас поблагодарить. Это было именно то, что я искал, и с вашим подробным решением я смог реализовать его соответственно! Спасибо огромное! – user1145707

+0

не беспокоился :) мне потребовалось время от времени, чтобы это исправить (я считаю, что онлайн-документацию немного сложно понять, особенно, когда я использую интерфейс python). Один неоценимый ресурс (я нахожу) - это примеры, включенные в OpenCV (в «OpenCV-2.x.x/samples/pick_your_language»). –

+0

Но выпрямленное изображение все еще имеет черную область или границы. – Abc