如何在opencv中使用SIFT功能包?

时间:2015-06-19 00:36:48

标签: opencv sift multilabel-classification

我已经阅读了很多关于在获取图像的筛选功能后实现单词包的文章,但我仍然对下一步该做什么感到困惑。我具体做什么?

提前感谢您的指导。

这是我到目前为止的代码。

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);

1 个答案:

答案 0 :(得分:3)

训练一袋单词系统如下:

  1. 计算训练集的每个图像的功能
  2. 群集这些功能
  3. 使用在该群集中具有功能的图像标记每个群集
  4. 此时培训已完成,您可以按照以下步骤开始测试:

    1. 计算测试图像的功能
    2. 对于每个功能,找到最近的群集
    3. 为属于此群集的每个训练图像添加勾号
    4. 重复测试图像的所有功能
    5. 具有最高刻度数的图像是最佳匹配,具有第二高刻度数的图像是第二最佳匹配,依此类推
    6. 您可以注意到,使用SIFT没有任何限制。您可以尝试使用不同的特征提取器和描述符。