我使用ubuntu进行工作,Code是使用opencv的C++。 我测试了一下以检测图片的某些部分。它工作得很好,但现在我想在我的大局中找到位置。这里是代码:C++ Opencv sift Positiondetection
#include...
using namespace cv;
int main(int argc, char** argv) {
Mat img = imread("/home/ubuntu/workspace2/sift/src/inputklein.jpg",CV_LOAD_IMAGE_GRAYSCALE);
while(1){
Mat img2 =imread("/home/ubuntu/workspace2/sift/src/input.jpeg",CV_LOAD_IMAGE_GRAYSCALE); //frame
//initialize SIFT
// Create smart pointer for SIFT feature detector.
SIFT sift;
vector<KeyPoint> key_points;
vector<KeyPoint> key_points2;
//-- Step 1: Detect the keypoints using SURF Detector
int minHessian = 100;
SurfFeatureDetector detector(minHessian);
detector.detect(img, key_points);
detector.detect(img2, key_points2);
//-- Step 2: Calculate descriptors (feature vectors)
SurfDescriptorExtractor extractor;
Mat descriptors1;
Mat descriptors2;
extractor.compute(img, key_points, descriptors1);
extractor.compute(img2, key_points2, descriptors2);
//-- Step 3: Matching descriptor vectors using FLANN matcher
FlannBasedMatcher matcher;
std::vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
double max_dist = 20; double min_dist = 10;
//-- Quick calculation of max and min distances between keypoints
for(int i = 0; i < descriptors1.rows; i++)
{ double dist = matches[i].distance;
if(dist < min_dist) min_dist = dist;
if(dist > max_dist) max_dist = dist;
}
//std::cout<<"Max dist :"<< max_dist ;
//std::cout<<"Min dist :"<< min_dist ;
//-- Draw only "good" matches (i.e. whose distance is less than 2*min_dist,
//-- or a small arbitary value (0.02) in the event that min_dist is very
//-- small)
//-- PS.- radiusMatch can also be used here.
std::vector<DMatch> good_matches;
for(int i = 0; i < descriptors1.rows; i++)
{ if(matches[i].distance <= max(2*min_dist, 0.02))
{ good_matches.push_back(matches[i]); }
}
//-- Draw only "good" matches
Mat img_matches;
drawMatches(img, key_points, img2, key_points2,
good_matches, img_matches, Scalar::all(-1), Scalar::all(-1),
vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
//std::cout<<key_points[1].pt.x<<"\n";
//std::cout<<key_points2[1].pt.y<<"\n";
//-- 3. Apply the classifier to the frame
cv::imshow("test", img_matches); //img_matches
waitKey(30);
}
return 0;
}
好吧,但我怎么能得到的位置矿最关键的地方。有人能给我一个提示,我该如何理解它? 我看到我可以使用像这样的东西: “key_points [1] .pt.x”或与y,但我不必检查它到每个x,y地点吗? 接下来会是: good_matches [1] .queryIdx但这里是同样的问题。我如何找到它的位置?
对我来说一个很大的问题,为什么只有一个循环而已? 它不应该在行和列?在我的目的地它应该像在一个数组(x,y)中工作,我检查每个位置,如果它是相同的...(有没有简单的数据类型的问题...)
哪里可以找到/或drawMatches的代码的位置(例如)。 正常的方式,我会尝试“公开声明”(使用Eclipse,C++),但我只看到头,而不是真正的功能。 我需要的代码,并希望我能够改变这一切,而不OpenCV的,也许我可以做环......所以我必须明白,我怎么能阅读和使用矢量DMatch ...
THX您的帮助。 最好的问候,
我不知道我是否理解你的代码。 Sry说我在2天后回答,但我认为我不太清楚筛选作品是如何筛选的,我想先阅读。但它没有帮助。你是什么意思与参数pointsInFirstAreaRight ...你的代码中的问题是,我不能使用一些功能,如.push_back。我想在fpga中给出代码,并且我的理解如何,它不喜欢函数库。所以我需要一个非常简单的代码... – knowless
参数pointsInFirstArea是因为我认为你想要分类器的关键点取决于它们的位置,所以这个参数是关键点的矢量来保存(20×20)区域中的关键点。 –
关于我的push_back功能,它运行良好,我不知道为什么你可以使用它。在这种情况下,该功能将点2f中的关键点复制。看到我放在我的激光器中的sift代码。 –