2017-02-12 93 views
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; 

這是兩個圖像

image 01

image 02

這是我從該代碼得到

Result image

這是非常接近我的EXPE結果結果,但它也匹配錯誤的觀點。這顯示了幾點,但我需要更多的觀點。

enter image description here

+0

結果不正確的方式是什麼?你期待什麼結果?你應該提供[mcve]並澄清你的問題。 –

+0

散列表非常快速檢查兩個圖像是否相同。但是兩幅圖像必須完美匹配,而在許多情況下則不是。 – ark1974

+0

@GregKikola正如你所看到的,結果是錯誤地匹配尖銳點。你可以看到這條線彼此交叉。無論如何,我會添加一個我期待的圖像。 – Ishanka

回答

1

特徵檢測器像SIFT或SURF的設計工作,並匹配有豐富和獨特的紋理圖像。它們不是設計用於像您的示例那樣使用非常精簡的二進制輸入。

您可能想要在原始X射線上嘗試更多圖像上下文。
或者,您可以嘗試圖像之間更直接的全局對齊模型。

檢查出this link的某些選項與findTransformECC()功能對齊。

另請參閱the article here

相關問題