4

我想创建一个分类器,以便通过捕获的图像识别昆虫。第一次,我使用了 HuMomennts,但由于 HuMoments 是比例变体,以不同分辨率捕获的图像给出了不正确的结果。在互联网上进行了一些搜索后,我发现使用 SIFT 和 SURF 可以解决我的问题,因此,我试图看看使用 SIFT 时会发生什么。下面的前两张图片属于不同的昆虫种类。结果很奇怪,因为 400 个特征中的所有特征都是匹配的(见第三张图)。

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

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 文件)图像的特征,以便在分类树(即随机树)中训练它们?

4

2 回答 2

2

SIFT essential 获取训练图像并提取兴趣点。这些点被过滤掉,低对比度的点被丢弃。一些计算后的高对比度点用于描述对象或场景。即使在统一的比例、方向等发生变化时,这些本质上的 ROI 也可用于识别相似的补丁。

我们这里有几个问题。首先,您将 SIFT 用于非刚性表面配准。这意味着您尝试通过它们的共同特征对不同的错误(组内)进行分类,但实际上它从未为此目的而设计。此外,这些错误实际上完全不同,似乎几乎没有共同点。其次,您使用具有非常低质量输入源(低质量特征点)的 SIFT,这基本上只是一个二进制掩码。

如果您尝试使用不同的方法进行对象注册,那么首先使用众所周知且广泛使用的玩具数据集可能是一个好主意,因为它可以简化您的问题并允许您查看哪些方法适用于简单的情况,哪些方法不适用回到你的真实数据集。

有许多有趣的方法似乎更适合组内注册。

于 2013-05-23T22:21:55.353 回答
1

鉴于您的二值图像具有相当清晰的边界,您可能会考虑使用Shape Context 。

于 2013-09-10T20:27:59.320 回答