2
我正試圖重建解剖結構的3D模型。所以我想匹配一對X射線圖像中的關鍵點。我通過使用下面的代碼嘗試了它。但它沒有給出正確的結果。如何在C++中匹配兩個不同的圖像
Mat tmp = cv::imread("1.jpg", 1);
Mat in = cv::imread("2.jpg", 1);
cv::SiftFeatureDetector detector(0.0001, 1.0);
cv::SiftDescriptorExtractor extractor;
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);
double max_dist = 0; double min_dist = 100;
Mat img_matches;
for(int i = 0; i < descriptor1.rows; i++)
{ double dist = matches[i].distance;
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 < descriptor1.rows; i++)
{ if(matches[i].distance <= max(2*min_dist, 0.03))
{ good_matches.push_back(matches[i]); }
}
drawMatches(tmp, keypoints1, in, keypoints2,
good_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;
這是兩個圖像
這是我從該代碼得到
這是非常接近我的EXPE結果結果,但它也匹配錯誤的觀點。這顯示了幾點,但我需要更多的觀點。
結果不正確的方式是什麼?你期待什麼結果?你應該提供[mcve]並澄清你的問題。 –
散列表非常快速檢查兩個圖像是否相同。但是兩幅圖像必須完美匹配,而在許多情況下則不是。 – ark1974
@GregKikola正如你所看到的,結果是錯誤地匹配尖銳點。你可以看到這條線彼此交叉。無論如何,我會添加一個我期待的圖像。 – Ishanka