Как извлечь специфическую особенность в алгоритме распознавания образов при обработке изображений для обнаружения объектов?

Я хотел бы обнаружить объект (дверь самолета) с небольшого расстояния. Алгоритм должен быть очень надежным, поэтому может быть реализован на любой плоскости (с большим количеством разных рисунков, логотипов) и при любых погодных условиях (солнце, дождь, день и ночь).

Я ищу в 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?

1

Решение

если вы можете создать набор данных для многих типов объектов (двери), вы можете использовать такую ​​функцию, как вывод SIFT, для обучения SVM (в opencv вы можете найти несколько примеров).

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]