c++ - OpenCV SVM 分类器图像识别

标签 c++ svm opencv3.0

我正在使用 C++ 和 OpenCV 3.3.1
我尝试使用 OpenCV 训练 SVM,我的步骤是:

  1. 预处理图像
  2. 使用 SURF 进行特征提取
  3. 创建用于学习正负图像的数据集
  4. reshape 图像 1 行 1 特征
  5. 创建 labelsmat,-1 表示负值,+1 表示正值
  6. 学习支持 vector 机
  7. 预测

现在我的问题是: 可以说我的图像是 128 x 128 并且在特征提取之后我得到了一个垫子 reshape 后有 16 行和 128 列,我得到 1 行和 2048 列,现在是用这种大小的行和列训练的 SVM。当我尝试用我的支持 vector 机进行预测时,我遇到了一个问题,即支持 vector 机需要相同大小的特征垫(1 行和 2048 列),但我的预测图像与学习图像相比具有更多特征,因此用于预测的垫是一种方式根据需要变大。

使用与我用于学习的图像相同的图像进行预测效果很好,所以我猜 SVM 有效。

如何使用 SVM 处理更大的图像?

最佳答案

通过使它们成为 1X 2048 特征来使用 SURF/SIFT 描述符并不是一个好主意,原因有两个:

  1. 您正在限制每张图片的有用特征数量 (=16),如果特征数量不同于 16,则会出现错误。即使你每次都强制使用 16 个特征,你最终可能会丢失特征,因此结果会降低

  2. 您正在训练一个 2048 维的 SVM 分类器,没有利用提取的特征描述符之间的任何关系。

执行此操作的更稳健和标准的方法是使用词袋。 您使用词袋和直方图方法从 SIFT 特征中获得 K 维描述符,然后在这 K 维描述符上训练 SVM 分类器,每张图像都相同。

此链接可能对您有帮助,

https://www.codeproject.com/Articles/619039/Bag-of-Features-Descriptor-on-SIFT-Features-with-O

如果你想使用MATLAB;然后 vlfeat 实现了整个流水线。

关于c++ - OpenCV SVM 分类器图像识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55334452/

相关文章:

c++ - 访问图像像素; MatIterator_<> 和 Mat::at 运算符的比较

c++ - 我在正确的轨道上吗?收银程序C++

c# - 如何在 C++ 运行时组件内的 Windows Phone 8.1 XAML 应用程序中使用 C++ dll

c++ - priority_queue 中 ITERATOR 的问题

c++ - Box2D 实体之间的层次连接

machine-learning - SVM中的决策边界计算

scikit-learn - 将 scikit-learn SVM 模型转换为 LibSVM

machine-learning - 如何在sklearn上平衡训练集和测试集上分割数据

c++ - 如何跟踪视频中的前景并在其上绘制矩形

python-2.7 - 使用 Open CV Python 在 Microsoft Kinect 的深度图像中分割区域