Quantcast
Channel: OpenCV Q&A Forum - Latest question feed
Viewing all articles
Browse latest Browse all 19555

Image Stitching (Java API)

$
0
0
Hi, I'm trying to stitch two images together, using the OpenCV Java API. I have been following this C++ tutorial here http://ramsrigoutham.com/2012/11/22/panorama-image-stitching-in-opencv/ However, I get the wrong output and I cannot work out the problem. FAULTY CODE public class ImageStitching { static Mat image1; static Mat image2; static FeatureDetector fd; static DescriptorExtractor fe; static DescriptorMatcher fm; public static void initialise(){ fd = FeatureDetector.create(FeatureDetector.BRISK); fe = DescriptorExtractor.create(DescriptorExtractor.SURF); fm = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE); //images image1 = Highgui.imread("room2.jpg"); image2 = Highgui.imread("room3.jpg"); //structures for the keypoints from the 2 images MatOfKeyPoint keypoints1 = new MatOfKeyPoint(); MatOfKeyPoint keypoints2 = new MatOfKeyPoint(); //structures for the computed descriptors Mat descriptors1 = new Mat(); Mat descriptors2 = new Mat(); //structure for the matches MatOfDMatch matches = new MatOfDMatch(); //getting the keypoints fd.detect(image1, keypoints1); fd.detect(image1, keypoints2); //getting the descriptors from the keypoints fe.compute(image1, keypoints1, descriptors1); fe.compute(image2,keypoints2,descriptors2); //getting the matches the 2 sets of descriptors fm.match(descriptors2,descriptors1, matches); //turn the matches to a list List matchesList = matches.toList(); Double maxDist = 0.0; //keep track of max distance from the matches Double minDist = 100.0; //keep track of min distance from the matches //calculate max & min distances between keypoints for(int i=0; imaxDist) maxDist=dist; } System.out.println("max dist: " + maxDist ); System.out.println("min dist: " + minDist); //structure for the good matches LinkedList goodMatches = new LinkedList(); //use only the good matches (i.e. whose distance is less than 3*min_dist) for(int i=0;i objList = new LinkedList(); // image1 LinkedList sceneList = new LinkedList(); //image 2 List keypoints_objectList = keypoints1.toList(); List keypoints_sceneList = keypoints2.toList(); //putting the points of the good matches into above structures for(int i = 0; i cornerList = new LinkedList(); Mat obj_corners = new Mat(4,1,CvType.CV_32FC2); Mat scene_corners = new Mat(4,1,CvType.CV_32FC2); obj_corners.put(0,0, new double[]{0,0}); obj_corners.put(0,0, new double[]{image1.cols(),0}); obj_corners.put(0,0,new double[]{image1.cols(),image1.rows()}); obj_corners.put(0,0,new double[]{0,image1.rows()}); Core.perspectiveTransform(obj_corners, scene_corners, H); //structure to hold the result of the homography matrix Mat result = new Mat(); //size of the new image - i.e. image 1 + image 2 Size s = new Size(image1.cols()+image2.cols(),image1.rows()); //using the homography matrix to warp the two images Imgproc.warpPerspective(image1, result, H, s); int i = image1.cols(); Mat m = new Mat(result,new Rect(i,0,image2.cols(), image2.rows())); image2.copyTo(m); Mat img_mat = new Mat(); Features2d.drawMatches(image1, keypoints1, image2, keypoints2, gm, img_mat, new Scalar(254,0,0),new Scalar(254,0,0) , new MatOfByte(), 2); //creating the output file boolean imageStitched = Highgui.imwrite("imageStitched.jpg",result); boolean imageMatched = Highgui.imwrite("imageMatched.jpg",img_mat); } public static void main(String args[]){ System.loadLibrary(Core.NATIVE_LIBRARY_NAME); initialise(); } } ![image description](/upfiles/13917374194103668.jpg) ![image description](/upfiles/13917374336825033.jpg) Stitched image is completely wrong. ![image description](/upfiles/13917374459085089.jpg) detected featues: ![image description](/upfiles/13917377074092844.jpg)

Viewing all articles
Browse latest Browse all 19555

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>