[Image Stitching: Applied various method based on OpenCV]
Github Code
OpenCV based Image Stitching applied various method in C++
 
1. Prerequisites
1.1 Dependencies
OpenCV 4.8.0, OpenCV Contrib 4.8.0, C++ 11 version
- If you already use OpenCV Version 3.x.x, then only change cv::SIFTtocv::xfeatures2d::SIFT!!
1.2 Ubuntu and ROS
Follow ROS Installation
- This code tested Ubuntu 64-bit 18.04 (ROS Melodic Version).
1.3. OpenCV Installation
Follow OpenCV
- Install appropriate OpenCV version: Here.
1.4 Intel RealSense ROS package and SDK
Follow realsense-ros
2. Get Custom Dataset
 
Follow KAIST-DP Dataset
- Intel Realsense D455 x3
- Xsens MTI-300 IMU
- Velodyne LiDAR VLP 16
3. Methodology to apply image stitching
- Reference Codes
    - Feature Extraction & Descriptor & Matcher & Outlier Rejection
        - Use this Github Page → Feature Matching
 
- Parallax
        - 
            Use this Github Page → Parallax
 
- 
            
 
- Feature Extraction & Descriptor & Matcher & Outlier Rejection
        
- Histogram Equalization
    - [1] Vanilla
- [2] CHALE
 
- Feature Extraction
    - [1] ORB
- [2] goodFeaturesToTrack
- [3] SIFT
 
- Feature Descriptor
    - [2] DAISY
 
- Feature Macher
    - [1] Brute-Force Matcher (BF)
 
- Matching
    - [1] knn match (KNN)
 
- Outlier Rejection
    - [1] findFundamentalMatrix (FM)
- [2] Parallax
- [3] Optical Flow
 
- Stitching Base
    - [1] Camera Parameter Setting
- [2] Image Masking
- [3] Pre-check OpenCV Errors
 
- Fast Stitching Method
    - Feature Matcher → cv::detail::BestOf2NearestMatcher
- Camera Estimator → cv::detail::HomographyBasedEstimator
- Bundle Adjustment → cv::detail::BundleAdjusterRay
- Warping → cv::SphericalWarper
- Exposure → cv::detail::GainCompensator
- Seam → cv::detail::DpSeamFinder
- Blender → cv::detail::MultiBandBlender
 
- Direct Stitching Method based Homography (in warping.h,imgproc.h)- OpenCV based stitching → cv::warpPerspective
- Not use OpenCV stitching → cv::findHomography
 
4 Changing Parameters
Parameters in “paramsetting.h”
#define SEE_MASKING
/* Visualize masking image (opencv_setting.h)
   Not see masking result -> 0 & See masking result -> 1 */
#define MASKING_REAL
/* Visualize masking in real image or white image (visualization.h)
   To see results in white image -> 0 & To see results in real image -> 1 */
#define SAVE_SYNC_IMG_WITH_TIME 
/* Visualize sync image with time (visualization.h)
   Not see sync result -> 0 & See sync result -> 1 */
#define SAVE_IMGS_WITH_FEATURES
/* Visualize image with features (visualization.h) 
   Not see image result with features -> 0 & See image result with features -> 1 */
#define SAVE_IMGS_DESCRIPTOR_MATCHING 
/* Visualize image with feature matching (visualization.h) 
   Not see image matching result -> 0 & See image matching result -> 1 */
#define RESIZE 
/* Resize result of panorama image (stitching.cpp)
   Not resize panorama image -> 0 & Resize panorama image -> 1 */
#define FLOW_BACK
/* Optical flow reverse check (parallax.h)
   Not use reverse check -> 0 & Use reverse check -> 1 */
#define HIST_EQUA 
/* Use Histogram Equalization (preprocessing.h)
   Not use histogram equalization -> 0 & Use histogram equalization -> 1 */
#define USE_CHALE 
/* Use CHALE Histogram Equalization (preprocessing.h) 
   Not use CHALE histogram equalization -> 0 & Use CHALE histogram equalization -> 1 */
#define FAST_STITCHING 
/* Use Fast Stitching (stitch.h)
   Not use fast stitching -> 0 & Use fast stitching -> 1 */
#define METHOD 
/* Debug OpenCV Error (error_filter.h)
   ORB Feature + BF Matching w/ Hamming distance -> 0
   SURF Feature + FLANN Matching w/ KNN -> 1
   SURF Features + FLANN Matching w/ KNN + Masking -> 2 */
#define MODE 
/* Stitching Mode (stitch.h)
   Vanilla -> 0
   Camera Intrinsic -> 1
   Camera Intrinsic + Masking -> 2
   Camera Intrinsic + Masking in estimateTransform function -> 3 */
5. Build Stitching_Image
Clone the repository and catkin_make:
    $ cd ~/catkin_ws/src
    $ git clone https://github.com/SungJaeShin/Image_Stitching.git
    $ cd ../
    $ catkin build
    $ source ~/catkin_ws/devel/setup.bash
6. Run two cameras
    $ roslaunch image_stitching multi_cam.launch
    $ rosrun image_stitching stitching_node
    $ (option) rviz 
7. Results
- Test Pair (EuRoC dataset)
    Img1 Img2     
- Comparing Stitching Time !!
    Method Auto Stitching Fast Stitching API Only Homography Stitching Only Homography Stitching (not use OpenCV Warp API) Time (sec) 4.00 0.90 0.02 0.37 
- Feature Matching using test pair
    SIFT features + DAISY descriptors + BF Matcher + KNN Matching   
- OpenCV Stitching using test pair
    - Original stitching (About 4.0 Sec) → Graph Cut Seam Finding Method + Block Gain Compensator Method
- Fast stitching (About 0.9 Sec) → Dynamic Programming Seam Finding Method + Gain Compensator Method
 Original Auto Stitching   Fast Stitching   
- Img warping using test pair (additionally using Interpolation method)
    Img2 warp using cv::warpPerspective Img2 not using cv::warpPerspective     
- Direct Stitching using test pair
    - OpenCV Warp API stitching (About 0.02 Sec)
- Not use OpenCV Warp API stitching (About 0.37 Sec)
 Img1 + Img2 warp using cv::warpPerspective Img1 + Img2 not using cv::warpPerspective     
- Convert Plane image to polar image using OpenCV API
    Polar Img (cv::linearPolar) Log Polar Img (cv::logPolar)     
8. Save panorama image in your PC
Change eight variables “save_match1_dir, save_match2_dir, save_orb_dir, save_sync_dir, save_img1_dir, save_img2_dir, save_img3_dir, save_pano_dir” in this package !!
9. Reference
[1] https://github.com/SungJaeShin/Feature_matching.git 
[2] https://github.com/SungJaeShin/Parallax.git 
[3] https://github.com/SungJaeShin/KAIST-DP.git 
[4] https://docs.opencv.org/3.4/dc/d6b/group__video__track.html#ga473e4b886d0bcc6b65831eb88ed93323 
[5] https://docs.opencv.org/3.2.0/da/d54/group__imgproc__transform.html#ga5bb5a1fea74ea38e1a5445ca803ff121 
[6] https://docs.opencv.org/4.x/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e 
[7] https://docs.opencv.org/4.x/d6/dc7/group__imgproc__hist.html#gad689d2607b7b3889453804f414ab1018 
[8] Y. Xiong and K. Pulli, “Fast panorama stitching for high-quality panoramic images on mobile phones,” in IEEE Transactions on Consumer Electronics, vol. 56, no. 2, pp. 298-306, May 2010, doi: 10.1109/TCE.2010.5505931.
 
      