|
|
@ -5,6 +5,7 @@
|
|
|
|
#include "opencv2/stitching.hpp"
|
|
|
|
#include "opencv2/stitching.hpp"
|
|
|
|
#include <opencv2/xfeatures2d.hpp>
|
|
|
|
#include <opencv2/xfeatures2d.hpp>
|
|
|
|
#include <opencv2/features2d.hpp>
|
|
|
|
#include <opencv2/features2d.hpp>
|
|
|
|
|
|
|
|
#include "opencv2/calib3d/calib3d.hpp"
|
|
|
|
#include <fstream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <iostream>
|
|
|
|
#include <iostream>
|
|
|
|
#include <json/json.h>
|
|
|
|
#include <json/json.h>
|
|
|
@ -526,7 +527,7 @@ class PointBase {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::Ptr<SIFT> siftPtr = SIFT::create();
|
|
|
|
cv::Ptr<SIFT> siftPtr = SIFT::create();
|
|
|
|
std::vector<cv::KeyPoint> keypointsROI, keypointsImg;
|
|
|
|
std::vector<KeyPoint> keypointsROI, keypointsImg;
|
|
|
|
cv::Ptr<SiftDescriptorExtractor> siftExtrPtr;
|
|
|
|
cv::Ptr<SiftDescriptorExtractor> siftExtrPtr;
|
|
|
|
cv::Mat descriptorsROI, descriptorsImg;
|
|
|
|
cv::Mat descriptorsROI, descriptorsImg;
|
|
|
|
siftPtr->detect(roi, keypointsROI);
|
|
|
|
siftPtr->detect(roi, keypointsROI);
|
|
|
@ -541,16 +542,15 @@ class PointBase {
|
|
|
|
imshow("sift_result.jpg", output);
|
|
|
|
imshow("sift_result.jpg", output);
|
|
|
|
waitKey(0);*/
|
|
|
|
waitKey(0);*/
|
|
|
|
|
|
|
|
|
|
|
|
cout<<" SIZE \n"<<roi.size() <<" \n";
|
|
|
|
cout<<" SIZE \n"<<cv::typeToString(roi.type()) <<" \n";
|
|
|
|
siftPtr->compute(roi,
|
|
|
|
siftPtr->compute(roi,
|
|
|
|
keypointsROI,
|
|
|
|
keypointsROI,
|
|
|
|
descriptorsROI);
|
|
|
|
descriptorsROI);
|
|
|
|
/*siftExtrPtr->compute(imgSmall,
|
|
|
|
siftPtr->compute(imgSmall,
|
|
|
|
keypointsImg,
|
|
|
|
keypointsImg,
|
|
|
|
descriptorsImg);*/
|
|
|
|
descriptorsImg);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::FlannBasedMatcher matcher;
|
|
|
|
cv::BFMatcher matcher(cv::NORM_L2,true);
|
|
|
|
|
|
|
|
std::vector<cv::DMatch> matches;
|
|
|
|
std::vector<cv::DMatch> matches;
|
|
|
|
|
|
|
|
|
|
|
|
matcher.match(descriptorsROI,descriptorsImg,matches);
|
|
|
|
matcher.match(descriptorsROI,descriptorsImg,matches);
|
|
|
@ -561,6 +561,60 @@ class PointBase {
|
|
|
|
cv::imshow("matches",imageMatches);
|
|
|
|
cv::imshow("matches",imageMatches);
|
|
|
|
cv::waitKey(0);
|
|
|
|
cv::waitKey(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double max_dist = 0; double min_dist = 100;
|
|
|
|
|
|
|
|
cout<<"ROWS DESC:"<<descriptorsImg.rows<<"\n";
|
|
|
|
|
|
|
|
cout<<"SIZE DESC:"<<descriptorsImg.size()<<"\n";
|
|
|
|
|
|
|
|
//-- Quick calculation of max and min distances between keypoints
|
|
|
|
|
|
|
|
for( int i = 0; i < descriptorsImg.rows; i++ )
|
|
|
|
|
|
|
|
{ double dist = matches[i].distance;
|
|
|
|
|
|
|
|
cout<<"DIST:"<<dist<<"\n";
|
|
|
|
|
|
|
|
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 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::vector< DMatch > good_matches;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for( int i = 0; i < descriptorsImg.rows; i++ )
|
|
|
|
|
|
|
|
{ if( matches[i].distance < 3*min_dist )
|
|
|
|
|
|
|
|
{ good_matches.push_back( matches[i]); }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
std::vector< Point2d > obj;
|
|
|
|
|
|
|
|
std::vector< Point2d > scene;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for( int i = 0; i < good_matches.size(); i++ )
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
//-- Get the keypoints from the good matches
|
|
|
|
|
|
|
|
obj.push_back( static_cast<cv::Point2i>( keypointsImg[ good_matches[i].queryIdx ].pt ));
|
|
|
|
|
|
|
|
scene.push_back( static_cast<cv::Point2i>(keypointsROI[ good_matches[i].trainIdx ].pt ));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*cv::Mat imageMatches2;
|
|
|
|
|
|
|
|
drawMatches(roi,keypointsROI,imgSmall,keypointsImg,good_matches,imageMatches2);
|
|
|
|
|
|
|
|
cv::namedWindow("good_matches");
|
|
|
|
|
|
|
|
cv::imshow("good_matches",imageMatches2);
|
|
|
|
|
|
|
|
cv::waitKey(0);*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Mat H = findHomography( Mat(obj), Mat(scene), RANSAC );
|
|
|
|
|
|
|
|
Mat H = estimateAffinePartial2D( Mat(obj), Mat(scene), noArray(),RANSAC );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
cv::Mat result;
|
|
|
|
|
|
|
|
//warpPerspective(imgSmall,roi,H,cv::Size(roi.cols,roi.rows));
|
|
|
|
|
|
|
|
warpAffine(imgSmall,result,H,cv::Size(roi.cols,roi.rows));
|
|
|
|
|
|
|
|
/*cv::Mat half(result,cv::Rect(0,0,imgSmall.cols,imgSmall.rows));
|
|
|
|
|
|
|
|
result.copyTo(roi);*/
|
|
|
|
|
|
|
|
imshow("imgSmall", imgSmall);
|
|
|
|
|
|
|
|
imshow( "Result", result );
|
|
|
|
|
|
|
|
imshow("roi", roi);
|
|
|
|
|
|
|
|
cv::waitKey(0);
|
|
|
|
|
|
|
|
|
|
|
|
//cout<<CV_VERSION;
|
|
|
|
//cout<<CV_VERSION;
|
|
|
|
}
|
|
|
|
}
|
|
|
|