我的目标:创建一个使用相机实时检测物体的Android应用程序(我的对象是方向盘和汽车轮胎).
到目前为止,我尝试了哈尔分类器,但是训练困难,花了很多时间,无法正确地训练,所以我决定寻找另一种方式来实现我的目标.
现在我发现了特征检测器和SVM训练.我的问题是:
1:我应该使用哪种算法(SURF,ORB,FREAK等)?
2:你怎么看待HOG Bag-Of-Words?
3:你能告诉如何训练SVM或者给你一个链接? – 我没有找到关于这个的任何教程.我继续搜索,但我的时间有限,我决定问.
4:哪个算法会给出最好的结果?
5:我应该用Android NDK在本机上实现,或者与Java实现不会有太大的区别?
如果您有任何教程或参考资料,请将它们添加到您的答案或评论中.对于长期的问题抱歉,正如我说我的时间有限(这是一个学校项目),而且我认为如果人们可以在一个地方找到这些答案,这将是很好的.我会欣赏每一个答案,即使不是一个完整的答案.先谢谢你!
解决方法
您可以尝试SIFT和SURF哪些是最流行的描述符,但不是非常有效(缓慢),并且需要大量内存.
如果效率是您的目标,您可以尝试二进制描述符(例如Brief,BRISK,FREAK),这些描述符效率更高,需要更少的存储空间.看一下FAST探测器.
2:图像分类问题的一个词是一种识别对象类别的方法,给出一组包含对象类的正训练图像,以及一组不具有对象类别的负训练图像.
Bag-Of-Words将为您提供每个训练图像的向量表示.
得到这个之后,您将必须训练一个分类器来区分对应于正(方向盘和汽车轮胎)和负面训练图像的矢量.
您可以为此使用SVM分类器.
3:你在这里有一个完整的方法教程(BOW SVM)在OpenCV 2.3.您需要在代码中进行一些更改,但总体思路是:http://www.morethantechnical.com/2011/08/25/a-simple-object-classifier-with-bag-of-words-using-opencv-2-3-w-code/
另外,SVM的OpenCV教程:
http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
4:如前所述,没有完美的算法,所以我无法回答你.我认为在用(1)中的替代方法进行一些测试后,你将能够回答我们.