4

我正在尝试训练一个 SVM 分类器来识别一组 64x128 图像中的行人。我已经使用 HOG 功能完成了这项工作,现在我需要使用 SIFT 和 ORB 来实现相同的功能。对于 HOG 特征,我始终拥有相同数量的特征 (3780),因此火车的矩阵是 image_number 乘以 3780。现在,使用 SIFT 提取器,我得到了不同大小的关键点。如何使用这些不同大小的关键点为分类器创建矩阵?

非常感谢您的帮助!

我解决了描述符的问题,将它们全部放在同一行。但是,我发现大多数描述符的值为 0,因此分类器无法正常工作。你知道我该如何解决这个问题吗?

这是一段代码:

DenseFeatureDetector detector;
SiftDescriptorExtractor descriptor;
vector<KeyPoint> keypoints;


//for every image I compute te SIFT
detector.detect(image, keypoints);
Mat desc;
descriptor.compute(image,keypoints, desc);
Mat v(1,30976,CV_32FC1);
    for (int j = 0; j<desc.rows; j++){
        for(int k = 0; k<desc.cols; k++){
            v.at<float>(0,128*j+k) = desc.at<float>(j,k);

        }
    } //now in vector v there are all the descriptors (the problem is that most of them have 0 value)

descriptormat.push_back(v);  //descriptormat is the cv::Mat that I use to train the SVM
4

2 回答 2

5

通常,人们对 SIFT 或 ORB 特征进行矢量量化并构建直方图(词袋模型)。这将为每个训练和测试图像提供一个固定大小的向量。

于 2012-10-04T03:16:05.460 回答
1

您可以创建一个大矩阵并 push_back 为每个图像计算的描述符。示例(未选中)

int main(int argc, char**argv)
{
    cv::SIFT sift;
    cv::Mat dataMatrix(0, 128, CV_32F); // 0 rows, 128 cols is SIFT dimension, I think there is a method that gives you the descriptor dimension exactly. type is 32F if I remember well, must check
    for (int i = 1; i < argc; ++i) {
      cv::Mat img = cv::imread(argv[i]);
      std::vector<cv::KeyPoints> kp;
      cv::Mat desc;
      sift(img, cv::noArray(), keypoints, desc);
      dataMatrix.push_back(desc);
    }

    // Now train SVM with dataMatrix
    assert(dataMatrix.rows > 0);
}
于 2012-09-26T15:55:54.570 回答