OpenCV,SIFT:2种不同昆虫的所有特征都匹配。

4
我想创建一个分类器,通过捕获的昆虫图像来识别昆虫。起初,我使用了HuMoments,但是由于HuMoments具有尺度变化性,所以以不同分辨率捕获的图像给出了错误的结果。在网上搜索后,我发现使用SIFT和SURF可以解决我的问题,因此我尝试了一下使用SIFT时会发生什么。下面的前两张图片属于不同种类的昆虫。结果很奇怪,因为所有400个特征都匹配(请参见第3张图片)。
int main()
{
Mat src = imread(firstInsect);
Mat src2 = imread("secondInsect");

if(src.empty() || src2.empty())
{
    printf("Can not read one of the image\n");
    return -1;
}

//Detect key point in the image
SiftFeatureDetector detector(400);
vector<KeyPoint> keypoints;
detector.detect(src, keypoints);

//cout << keypoints.size() << " of keypoints are found" << endl;

cv::FileStorage fs(firstInsectXML, FileStorage::WRITE);
detector.write(fs);
fs.release();


SiftFeatureDetector detector2(400);
vector<KeyPoint> keypoints2;
detector.detect(src2, keypoints2);

cv::FileStorage fs2(secondInsectXML,  FileStorage::WRITE);
detector.write(fs2);
fs2.release();


//Compute the SIFT feature descriptors for the keypoints
//Multiple features can be extracted from a single keypoint, so the result is a
//matrix where row "i" is the list of features for keypoint "i"

SiftDescriptorExtractor extractor;
Mat descriptors;
extractor.compute(src, keypoints, descriptors);

SiftDescriptorExtractor extractor2;
Mat descriptors2;
extractor.compute(src2, keypoints2, descriptors2);


//Print some statistics on the matrices returned
//Size size = descriptors.size();
//cout<<"Query descriptors height: "<<size.height<< " width: "<<size.width<< " area: "<<size.area() << " non-zero: "<<countNonZero(descriptors)<<endl;



//saveKeypoints(keypoints, detector);


Mat output;
drawKeypoints(src, keypoints, output, Scalar(0, 0, 255), DrawMatchesFlags::DEFAULT);
imwrite(firstInsectPicture, output);

Mat output2;
drawKeypoints(src2, keypoints2, output2, Scalar(0, 0, 255), DrawMatchesFlags::DEFAULT);
imwrite(secondInsectPicture, output2); 


//Corresponded points
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(descriptors, descriptors2, matches);

cout<< "Number of matches: "<<matches.size()<<endl;

Mat img_matches;
drawMatches(src, keypoints, src2, keypoints2, matches, img_matches);
imwrite(resultPicture, img_matches); 

system("PAUSE");
waitKey(10000);

return 0;}

问题1:为什么这两张图片中的所有特征都匹配?

问题2:如何以一种方式存储图像的特征(例如XML文件),以便可以按顺序将它们存储在分类树(例如随机树)中进行训练?

2个回答

2
SIFT基本上需要一个训练图像并提取感兴趣的点。这些点被过滤,低对比度的点被丢弃。经过一些计算后,高对比度的点被用来描述对象或场景。这些本质上是感兴趣区域(ROI),即使统一的比例、方向等变化,也可以用于识别相似的补丁。
我们在这里有几个问题。首先,您使用SIFT进行非刚性表面配准目的。这意味着您尝试通过它们的共同特征对不同的虫子(内部群体)进行分类,但实际上它从未被设计用于此目的。此外,这些虫子实际上相当不同,似乎没有太多共同之处。其次,您将SIFT与非常低质量的输入源(低质量的特征点)结合使用,这实质上只是一个二进制掩码。
如果您尝试不同的物体配准方法,最好先使用广为人知和广泛使用的玩具数据集,因为它简化了您的问题,并允许您看到易于处理的情况以及哪些情况不适用,然后再回到您的真实数据集。
有许多有趣的方法似乎更适合内部群体配准。

1

考虑到您具有较清晰的二元图像边界,您可以考虑使用形状上下文


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接