Как определить местоположение изображения перед сшивкой с помощью OpenCV/C++

Я пытаюсь объединить/сшить 2 изображения вместе, но обнаружил, что класс сшивателя по умолчанию в OpenCV не может обрабатывать мои изображения. Так что я начал писать свой собственный... К сожалению, изображения слишком большие, чтобы прикрепить к этому сообщению (они оба имеют размер 12600x9000 пикселей).. поэтому я постараюсь объяснить как можно лучше.

2 изображения не являются снимками, сделанными камерой, а представляют собой файлы tiff, извлеченные из файла PDF. Сами изображения на самом деле были чертежами САПР, поэтому там не так много градиентов, и поэтому я думаю, что класс сшивателя по умолчанию не мог их обработать.

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

Mat WarpedImage;
cv::warpPerspective(img_2,WarpedImage,homography,cv::Size(2*img_2.cols,2*img_2.rows));
Mat half(WarpedImage,Rect(0,0,img_1.cols,img_1.rows));
img_1.copyTo(half);

Я как бы сделал его подходящим ... потому что моя проблема в том, что в моем случае 2 изображения могут быть выровнены по вертикали или по горизонтали. По умолчанию все примеры стежков в Интернете предполагают, что первое изображение является левым изображением, а второе изображение — правым изображением.

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

Во-вторых... В настоящее время я получаю правильное изображение... однако, поскольку у меня нет приличного кода для проверки идеальной ширины и высоты нового изображения, у меня много черного/пустого пространства в новом изображении. Какой был бы лучший код C++ для удаления этих черных областей? (Я вижу много сценариев Python в сети.. но нет примеров этого на C++.. и у меня нет навыков Python....)

Заранее большое спасибо за вашу помощь. Привет, Флорис.


person Floris    schedule 09.09.2013    source источник


Ответы (1)


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

person brunobg    schedule 10.09.2013
comment
Хорошо, мне удалось создать правильный холст с помощью преобразования перспективы следующим образом: - person Floris; 19.09.2013
comment
Хорошо, мне удалось создать правильный холст, используя перспективное преобразование: Затем я проверил на обоих изображениях самые большие и самые маленькие x и y. Имея их, я, конечно, мог бы рассчитать ширину и высоту. cv::warpPerspective(img_2,WarpedImage,homography,cv::Size(самый большойX-самый маленькийX,самый большойY-самый маленькийY)); Теперь это сразу создает правильный размер холста, даже если наименьшие значения X или Y из 2-го изображения являются отрицательными. Единственная проблема заключается в том, где применить сдвиг, если img_2 имеет отрицательное значение x или y. ? Любые идеи по этому поводу? - person Floris; 19.09.2013
comment
Я думаю, это то, что вам нужно: stackoverflow.com/questions/6087241/opencv-warpperspective или, возможно, это: функция в opencv 2 x "> stackoverflow.com/questions/4279008/ - person brunobg; 20.09.2013