Сшивание изображений OpenCV с разрешением изображения более 1080 * 1080

Я работал с OpenCV, чтобы сшить два изображения вместе на Raspberry Pi и на ПК с ОС Windows.

#include <stdio.h>
#include <iostream>
#include "opencv2/opencv.hpp"#include "opencv2/core/core.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/nonfree/nonfree.hpp"#include "opencv2/calib3d/calib3d.hpp"#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;

int main (int argc, char** argv) {

Mat image_1 = imread (argv[1]);
Mat image_2 = imread (argv[2]);
Mat gray_image_1;
Mat gray_image_2;

cvtColor (image_1, gray_image_1, CV_RGB2GRAY);
cvtColor (image_2, gray_image_2, CV_RGB2GRAY);

// Check if image files can be read
if (!gray_image_1.data) {
std::cout << "Error Reading Image 1" << std::endl;
return 0;
}
if (!gray_image_2.data) {
std::cout << "Error Reading Image 2" << std::endl;
return 0;
}

// Detect the keypoints using SURF Detector
// Based from Anna Huaman's 'Features2D + Homography to find a known    object' Tutorial
int minHessian = 50;
SurfFeatureDetector detector (minHessian);
std::vector <KeyPoint> keypoints_object, keypoints_scene;
detector.detect (gray_image_2, keypoints_object);
detector.detect (gray_image_1, keypoints_scene);

// Calculate Feature Vectors (descriptors)
// Based from  Anna Huaman's 'Features2D + Homography to find a known object' Tutorial
SurfDescriptorExtractor extractor;
Mat descriptors_object, descriptors_scene;
extractor.compute (gray_image_2, keypoints_object, descriptors_object);
extractor.compute (gray_image_1, keypoints_scene, descriptors_scene);

// Matching descriptor vectors using FLANN matcher
// Based from  Anna Huaman's 'Features2D + Homography to find a known object' Tutorial
FlannBasedMatcher matcher;
std::vector <DMatch> matches;
matcher.match (descriptors_object, descriptors_scene, matches);

double max_dist = 0;
double min_dist = 100;

// Quick calculation of max and min distances between keypoints
// Based from  Anna Huaman's 'Features2D + Homography to find a known object' Tutorial
for (int i = 0; i < descriptors_object.rows; i++) {

double dist = matches[i].distance;

if (dist < min_dist) {
min_dist = dist;
}
}

// Use matches that have a distance that is less than 3 * min_dist
std::vector <DMatch> good_matches;

for (int i = 0; i < descriptors_object.rows; i++){
if (matches[i].distance < 3 * min_dist) {
good_matches.push_back (matches[i]);
}
}

std::vector <Point2f> obj;
std::vector <Point2f> scene;

for (int i = 0; i < good_matches.size(); i++) {
// Get the keypoints from the good matches
obj.push_back (keypoints_object[good_matches[i].queryIdx].pt);
scene.push_back (keypoints_scene[good_matches[i].trainIdx].pt);
}

// Find the Homography Matrix
Mat H = findHomography (obj, scene, CV_RANSAC);
// Use the Homography Matrix to warp the images
cv::Mat result;
warpPerspective (image_2, result, H, cv::Size (image_2.cols +   image_1.cols, image_2.rows));
cv::Mat half (result, cv::Rect (0, 0, image_1.cols, image_1.rows));
image_1.copyTo (half);

// Write image
imwrite("Update.jpg", result);

waitKey (0);
return 0;
}

Два изображения, которые я использую в качестве входных данных, приводят к успеху. Но только тогда, когда эти два изображения имеют разрешение <= 1080 * 1080 пикселей.

Для разрешений 1440 * 1440 и 1944 * 1944 я обнаружил, что findHomography не может работать, потому что у меня больше не было более 3 хороших совпадений. Находить гомографию нужно как минимум 4 хороших совпадения.

Я пытался…

cv :: resize (входные изображения) — приводит к тому, что изображения без разрешения имеют достаточно хорошее совпадение для findHomography.

мин Гессиан увеличился или уменьшился — без изменений

минимальное расстояние увеличено или уменьшено — без изменений

Примечание. Оба изображения перекрываются и имеют одинаковые размеры.


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

Ниже я приведу два изображения с высоким разрешением для всех, кто хочет помочь.

colour_1_1440

colour_2_1440

Я использовал OpenCV 2.4.13, а не новый OpenCV 3.1.0.

1

Решение

Основано на комментарии Мартина Матиллы:

«Вы уверены, что не отбрасываете хорошие совпадения в разделе фильтра расстояний? if (соответствует [i] .distance < 3 * min_dist) «- Мартин Матилла 53 минуты назад

Решение лежало на 3 * min_dist. Я изменил значение «3» на «4», чтобы можно было обрабатывать изображения с высоким разрешением.

Примечание: Первоначально я изменил «3» на «30» и обнаружил, что 2-е входное изображение было искажено, как и ожидалось. <- Просто чтобы кто-нибудь знал 🙂

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]