Я хотел бы обнаружить объект (дверь самолета) с небольшого расстояния. Алгоритм должен быть очень надежным, поэтому может быть реализован на любой плоскости (с большим количеством разных рисунков, логотипов) и при любых погодных условиях (солнце, дождь, день и ночь).
Я ищу в OpenCV и реализовал некоторые алгоритмы извлечения функций, такие как SURF, SIFT и ORB, но результаты не так хороши.
Вот код с использованием ORB Feature Detector
#include "opencv2/opencv_modules.hpp"#include <stdio.h>
#ifndef HAVE_OPENCV_NONFREE
int main(int, char**)
{
printf("The sample requires nonfree module that is not available in your OpenCV distribution.\n");
return -1;
}
#else
#include "opencv2/core/core.hpp"#include "opencv2/features2d/features2d.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/nonfree/nonfree.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>
#include <stdlib.h>
using namespace cv;
using namespace std;
static void help()
{
printf("\nThis program demonstrates using features2d detector, descriptor extractor and simple matcher\n""Using the SURF desriptor:\n""\n""Usage:\n matcher_simple <image1> <image2>\n");
}
Mat src;Mat src_gray;
int thresh = 5;
int max_thresh = 600;
RNG rng(12345);
void thresh_callback(int, void* );
int main(int argc, char** argv)
{Mat img1;
Mat img2;
img1= imread("a350_1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
resize(img1, img1, Size(700,500), 0, 0, INTER_CUBIC);
img2= imread("a350_1.jpg", CV_LOAD_IMAGE_GRAYSCALE);
resize(img2, img2, Size(680,480), 0, 0, INTER_CUBIC);
Mat image;
if(! img1.data || ! img1.data)
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}// detecting keypoints
OrbFeatureDetector detector(1500);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img1, keypoints1);
detector.detect(img2, keypoints2);
// computing descriptors
OrbDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img1, keypoints1, descriptors1);
extractor.compute(img2, keypoints2, descriptors2);
// matching descriptors
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
// drawing the results
namedWindow("matches", CV_WINDOW_AUTOSIZE);
Mat img_matches;
drawMatches(img1, keypoints1, img2, keypoints2, matches, img_matches);
imshow("matches", img_matches);
waitKey(0);
return 0;
}
#endif
Я хотел бы улучшить надежность алгоритма в отношении правильного соответствия функций. Таким образом, более надежное сопоставление функций с целью распознавания и обнаружения объектов должно быть более надежным и надежным. Как, например, можно указать расстояние между окном и дверной коробкой (которое в каждой модели самолета является фиксированным), затем толщину дверной коробки и т. Д.
Я хотел бы извлечь некоторые таможенные функции, чтобы алгоритм работал на любых самолетах с любыми рисунками и логотипами. Означает, что алгоритм должен быть надежным, чтобы обнаружить дверь любым типом самолета. Особенности, такие как логотипы некоторых авиакомпаний и картины, не должны быть ключевыми точками / особенностями.
Поэтому из-за этого мне нравится извлекать такие общие черты, как расстояние между окном и дверной коробкой (так как эта функция всегда одинакова для данной модели самолета). Как, например, минимальное расстояние между дверной коробкой и ближайшим окном в Airbus A350, скажем, 1м. Поэтому я хотел бы использовать эту функцию в моем алгоритме. Любой совет, как извлечь такие функции?
Должен ли я использовать в этом случае методы распознавания образов и машинного обучения, такие как Deep Neural Networks или KNN?
если вы можете создать набор данных для многих типов объектов (двери), вы можете использовать такую функцию, как вывод SIFT, для обучения SVM (в opencv вы можете найти несколько примеров).
Других решений пока нет …