Last active
October 12, 2018 11:26
-
-
Save jjhesk/f553e034f5d657533a7d73d8c16a234e to your computer and use it in GitHub Desktop.
Panorama – Image Stitching in OpenCV
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <stdio.h> | |
| #include <iostream> | |
| #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; | |
| void readme(); | |
| /** @function main */ | |
| int main( int argc, char** argv ) | |
| { | |
| if( argc != 3 ) | |
| { readme(); return -1; } | |
| // Load the images | |
| Mat image1= imread( argv[2] ); | |
| Mat image2= imread( argv[1] ); | |
| Mat gray_image1; | |
| Mat gray_image2; | |
| // Convert to Grayscale | |
| cvtColor( image1, gray_image1, CV_RGB2GRAY ); | |
| cvtColor( image2, gray_image2, CV_RGB2GRAY ); | |
| imshow("first image",image2); | |
| imshow("second image",image1); | |
| if( !gray_image1.data || !gray_image2.data ) | |
| { std::cout<< " --(!) Error reading images " << std::endl; return -1; } | |
| //-- Step 1: Detect the keypoints using SURF Detector | |
| int minHessian = 400; | |
| SurfFeatureDetector detector( minHessian ); | |
| std::vector< KeyPoint > keypoints_object, keypoints_scene; | |
| detector.detect( gray_image1, keypoints_object ); | |
| detector.detect( gray_image2, keypoints_scene ); | |
| //-- Step 2: Calculate descriptors (feature vectors) | |
| SurfDescriptorExtractor extractor; | |
| Mat descriptors_object, descriptors_scene; | |
| extractor.compute( gray_image1, keypoints_object, descriptors_object ); | |
| extractor.compute( gray_image2, keypoints_scene, descriptors_scene ); | |
| //-- Step 3: Matching descriptor vectors using FLANN matcher | |
| 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 | |
| for( int i = 0; i < descriptors_object.rows; i++ ) | |
| { double dist = matches[i].distance; | |
| if( dist < min_dist ) min_dist = dist; | |
| if( dist > max_dist ) max_dist = dist; | |
| } | |
| printf("-- Max dist : %f \n", max_dist ); | |
| printf("-- Min dist : %f \n", min_dist ); | |
| //-- Use only "good" matches (i.e. whose distance 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(image1,result,H,cv::Size(image1.cols+image2.cols,image1.rows)); | |
| cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows)); | |
| image2.copyTo(half); | |
| imshow( "Result", result ); | |
| waitKey(0); | |
| return 0; | |
| } | |
| /** @function readme */ | |
| void readme() | |
| { std::cout << " Usage: Panorama < img1 > < img2 >" << std::endl; } |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Does the openCV have this possiblity to make a mosaic images ?
some research info;
http://docs.opencv.org/2.4/doc/tutorials/features2d/feature_homography/feature_homography.html
http://stackoverflow.com/questions/10256802/how-to-merge-two-images-in-opencv
https://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/
sntitching
http://docs.opencv.org/2.4/modules/stitching/doc/stitching.html
experiment 0
https://cg2010studio.com/2012/05/19/opencv-%E5%BD%B1%E5%83%8F%E6%8B%BC%E6%8E%A5-%E5%AF%AC%E6%99%AF%E5%92%8C%E7%92%B0%E6%99%AF-image-stitching-wide-view-and-round-view/
experiment 1
https://cg2010studio.com/2012/04/25/opencv-%E5%BD%B1%E5%83%8F%E6%8B%BC%E6%8E%A5%E5%AF%A6%E9%A9%972-image-stitching-experiment/
google camera stitching source:
https://android.googlesource.com/platform/packages/apps/Camera/+/android-4.4.2_r2/jni/feature_mos/src/mosaic/
process flow:

multiple files comparison.
