Ask Your Question

Revision history [back]

Is that impossible to use if condition in opencv with float variable?

I want to match two images using opencv. but I just found some mismatches and I tried to eliminate those by checking the slope between two matching points. But it does not working with if statement.the condition in the if statement is not checking. Plz help me out with an solution.

the code is here....


include "opencv2\opencv.hpp"

include <stdio.h>

include <opencv2 legacy="" legacy.hpp="">

include <opencv2 objdetect="" objdetect.hpp="">

include <opencv2 nonfree="" nonfree.hpp="">

include <opencv2 nonfree="" features2d.hpp="">

using namespace std; using namespace cv; // int main( ) { Mat tmp = cv::imread( "1.jpg", 1 ); Mat in = cv::imread( "2.jpg", 1 ); cv::SiftFeatureDetector detector( 0.5, 1.0 ); cv::SiftDescriptorExtractor extractor; /cv::SurfFeatureDetector detector(400, 1.0); cv::SurfDescriptorExtractor extractor(0.01);/ vector<keypoint> keypoints1, keypoints2; detector.detect( tmp, keypoints1 ); detector.detect( in, keypoints2 ); Mat feat1,feat2; drawKeypoints(tmp,keypoints1,feat1,Scalar(255, 255, 255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS); drawKeypoints(in,keypoints2,feat2,Scalar(255, 255, 255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS); imwrite( "feat1.bmp", feat1 ); imwrite( "feat2.bmp", feat2 ); int key1 = keypoints1.size(); int key2 = keypoints2.size(); printf("Keypoint1=%d \nKeypoint2=%d", key1, key2); Mat descriptor1,descriptor2; extractor.compute( tmp, keypoints1, descriptor1 ); extractor.compute( in, keypoints2, descriptor2 ); BruteForceMatcher<l2<float> > matcher; std::vector< DMatch > matches; matcher.match( descriptor1, descriptor2, matches ); std::vector< DMatch > good_matches; std::vector< DMatch > fnl_matches; Mat img_matches; int cnt=0; for( int i = 0; i < (int)matches.size(); i++ ) { float x=keypoints1[matches[i].queryIdx].pt.x; float y=keypoints1[matches[i].queryIdx].pt.y; float x2=keypoints2[matches[i].trainIdx].pt.x; float y2=keypoints2[matches[i].trainIdx].pt.y; float slope=(y2-y)/(x2-x); if( slope = 0 ) { good_matches.push_back( matches[i]); cnt=cnt+1; } } for( int i = 0; i < (int)matches.size(); i++ ) { printf( "-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d count %d \n", i, matches[i].queryIdx, matches[i].trainIdx,cnt ); } drawMatches( tmp, keypoints1, in, keypoints2, matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS ); namedWindow("SIFT", CV_WINDOW_AUTOSIZE ); imshow("SIFT", img_matches); imwrite("sift_1.jpg",img_matches); waitKey(0); return 0; }**

Is that impossible to use if condition in opencv with float variable?

I want to match two images using opencv. but I just found some mismatches and I tried to eliminate those by checking the slope between two matching points. But it does not working with if statement.the condition in the if statement is not checking. Plz help me out with an solution.

the code is here....


include "opencv2\opencv.hpp"

include <stdio.h>

include <opencv2 legacy="" legacy.hpp="">

include <opencv2 objdetect="" objdetect.hpp="">

include <opencv2 nonfree="" nonfree.hpp="">

include <opencv2 nonfree="" features2d.hpp="">

#include "opencv2\opencv.hpp"
#include <stdio.h>
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/nonfree/features2d.hpp>
using namespace std;
using namespace cv;
//
int main( )
{
Mat tmp = cv::imread( "1.jpg", 1 );
Mat in = cv::imread( "2.jpg", 1 );
cv::SiftFeatureDetector detector( 0.5, 1.0 );
cv::SiftDescriptorExtractor extractor;
/cv::SurfFeatureDetector /*cv::SurfFeatureDetector detector(400, 1.0);
cv::SurfDescriptorExtractor extractor(0.01);/
vector<keypoint> extractor(0.01);*/
vector<KeyPoint> keypoints1, keypoints2;
detector.detect( tmp, keypoints1 );
detector.detect( in, keypoints2 );
Mat feat1,feat2;
drawKeypoints(tmp,keypoints1,feat1,Scalar(255, 255, 255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
drawKeypoints(in,keypoints2,feat2,Scalar(255, 255, 255),DrawMatchesFlags::DRAW_RICH_KEYPOINTS);
imwrite( "feat1.bmp", feat1 );
imwrite( "feat2.bmp", feat2 );
int key1 = keypoints1.size();
int key2 = keypoints2.size();
printf("Keypoint1=%d \nKeypoint2=%d", key1, key2);
Mat descriptor1,descriptor2;
extractor.compute( tmp, keypoints1, descriptor1 );
extractor.compute( in, keypoints2, descriptor2 );
BruteForceMatcher<l2<float> BruteForceMatcher<L2<float> > matcher;
std::vector< DMatch > matches;
matcher.match( descriptor1, descriptor2, matches );
std::vector< DMatch > good_matches;
std::vector< DMatch > fnl_matches;
Mat img_matches;
int cnt=0;
for( int i = 0; i < (int)matches.size(); i++ )
{
float x=keypoints1[matches[i].queryIdx].pt.x;
float y=keypoints1[matches[i].queryIdx].pt.y;
float x2=keypoints2[matches[i].trainIdx].pt.x;
float y2=keypoints2[matches[i].trainIdx].pt.y;
float slope=(y2-y)/(x2-x);
if( slope = 0 )
{
good_matches.push_back( matches[i]);
cnt=cnt+1;
}
}
for( int i = 0; i < (int)matches.size(); i++ )
{ printf( "-- Good Match [%d] Keypoint 1: %d -- Keypoint 2: %d count %d \n", i, matches[i].queryIdx, matches[i].trainIdx,cnt ); }
drawMatches( tmp, keypoints1, in, keypoints2,
matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );
namedWindow("SIFT", CV_WINDOW_AUTOSIZE );
imshow("SIFT", img_matches);
imwrite("sift_1.jpg",img_matches);
waitKey(0);
return 0;
}**

}**