我正在尝试训练SVM分类器来识别一组64x128图像中的行人。我已经使用HOG功能完成了这项工作,现在我需要使用SIFT和ORB实现相同的功能。对于HOG功能,我总是具有相同数量的功能(3780),因此列车的矩阵是image_number 3780.现在,使用SIFT提取器我得到不同大小的关键点。如何使用不同大小的关键点为分类器创建矩阵?
非常感谢你的帮助!
我解决了描述符的问题,将所有这些问题放在同一行。但是,我发现大多数desriptors都有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
答案 0 :(得分:5)
通常,人们对SIFT或ORB特征进行矢量量化并构建直方图(词袋模型)。这将为每个训练和测试图像提供固定大小的矢量。
答案 1 :(得分: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);
}