2017-02-12 97 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

相关问题