【问题标题】:how to use SIFT features for bag of words in opencv?如何在opencv中对词袋使用SIFT特征?
【发布时间】:2015-06-19 09:44:26
【问题描述】:

我已经阅读了很多关于在对图像进行筛选特征后实现词袋的文章,但我仍然对下一步该做什么感到困惑。我具体做什么?

非常感谢您的指导。

这是我目前的代码。

cv::Mat mat_img = cropped.clone();
Mat grayForML;
cvtColor(mat_img, grayForML, CV_BGR2GRAY);
IplImage grayImageForML = grayForML.operator IplImage();


//create another copy of iplGray
IplImage *input = cvCloneImage(&grayImageForML);
Mat matInput = cvarrToMat(input);
//  Mat matInput = copy_gray.clone();
cv::SiftFeatureDetector detector;
std::vector<cv::KeyPoint> keyPoints;
detector.detect(input, keyPoints);
//add results to image and save.
cv::Mat output;
cv::drawKeypoints(input, keyPoints, output);    //SIFT OUTPUT RESULT


//resize and display
cv::Mat output_reduced;
cv::resize(output, output_reduced, cv::Size2i(output.cols / 2, output.rows / 2));


imshow("SIFT result", output_reduced);

【问题讨论】:

    标签: opencv sift multilabel-classification


    【解决方案1】:

    训练词袋系统如下:

    1. 计算训练集每张图像的特征
    2. 对这些特征进行聚类
    3. 用在该集群中具有特征的图像标记每个集群

    此时训练完成,您可以开始测试,如下所示:

    1. 计算测试图像的特征
    2. 对于每个特征,找到最近的聚类
    3. 为属于该集群的每个训练图像添加一个刻度
    4. 重复测试图像的所有特征
    5. 刻度数最多的图像是最佳匹配,刻度数第二高的图像是次佳匹配,依此类推

    如您所见,使用 SIFT 没有任何限制。您可以尝试不同的特征提取器和描述符。

    【讨论】:

    • 对于第 1 步,我能够从图像计数中获得的 SIFT 关键点吗?
    • @lionking 是的,您可以使用 SIFT .. 我的建议是您构建整个管道,然后尝试不同的特征提取器
    • 对于#2,您可以使用 k-means 聚类等算法来形成训练特征的聚类
    • 我明白了。谢谢你的建议。我将开始尝试 SIFT。请原谅我的婴儿谈话,我对图像分类真的很陌生。通过#2,我可以通过将它们放在单独的 yml 中来对它们进行聚类?例如,banana.xml 将包含香蕉的所有特征,而 rice.xml 包含所有水稻特征?
    • 我愿意相信我已经完成了 60%。我找到了这个教程,它也很有帮助! codeproject.com/Articles/619039/… 我调整了一些部分以适合我的项目,并且能够成功计算图像的描述符。根据本教程,该描述符可用于将图像分类为多个类别。您可以使用 SVM 或任何其他分类器来检查此描述符的判别力和鲁棒性。
    猜你喜欢
    • 2011-10-08
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2016-12-22
    • 2016-01-12
    • 2017-06-17
    相关资源
    最近更新 更多