Ответ 1
1: Нет оптимального алгоритма для всех случаев, но алгоритмы, которые удовлетворяют определенным очень конкретным случаям в зависимости от требований приложения.
Вы можете попробовать SIFT и SURF, которые являются наиболее популярными дескрипторами, но не очень эффективны (медленны) и требуют большой памяти. Если эффективность - ваша цель, вы можете попробовать двоичные дескрипторы (например, BRIEF, ORB, 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/
Кроме того, учебник OpenCV для SVM: http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html
4: Как я уже говорил, идеального алгоритма нет, поэтому я не могу ответить на него. Я думаю, что после нескольких тестов с альтернативами, которые у вас есть (1.), вы сможете ответить на него нам.:)
5. Я думаю, вы должны использовать Android NDK, но я мало знаю о разработке Android.
http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/android_dev_intro.html http://opencv.org/platforms/android.html