Ich möchte das Objekt (Flugzeugtür) aus kurzer Entfernung erkennen. Der Algorithmus sollte sehr robust sein und kann von jedem Flugzeug (mit vielen verschiedenen Gemälden, Logos) und von jedem Wetter (Sonne, Regen, Tag und Nacht) umgesetzt werden.Wie kann man bestimmte Merkmale im Mustererkennungsalgorithmus in der Bildverarbeitung für die Objekterkennung extrahieren?
Ich suche in OpenCV und implementiert einige von ihnen Feature Extrahieren Algorithmen wie SURF, SIFT und ORB, aber die Ergebnisse sind nicht so gut.
Hier den Code ORB Eigenschaft 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
Ich mag würde der Algorithmus Robustheit in Bezug auf die richtige Anpassung von Funktionen zu verbessern. Daher ist eine zuverlässigere Merkmalskombination für den Zweck der Objekterkennung und -detektion robuster und zuverlässiger. Wie zum Beispiel, kann der Abstand zwischen dem Fenster und Türrahmen (die in jedem Flugzeugmodell ist fest), dann die Dicke der Türrahmen usw.
Ich möchte einige Zoll-Features extrahieren, so dass der Algorithmus funktioniert für irgendwelche Flugzeuge mit irgendwelchen Gemälden und Logos. Bedeutet, dass der Algorithmus robust sein sollte, um die Tür mit jeder Art von Flugzeug zu erkennen. Eigenschaften wie Logos einiger Fluggesellschaften und Gemälde sollten keine Schlüsselpunkte/Merkmale sein.
Deshalb möchte ich Features extrahieren, die allgemein wie Abstand zwischen dem Fenster und dem Türrahmen sein können (wie diese Eigenschaft für das gegebene Flugzeugmodell immer das selbe ist). Wie zum Beispiel der minimale Abstand zwischen dem Türrahmen und dem nächsten Fenster in Airbus A350 ist sagen wir 1m. Daher möchte ich diese Funktion in meinem Algorithmus verwenden. Irgendein Rat, wie man solche Eigenschaften extrahiert?
Sollte ich in diesem Fall Mustererkennung und maschinelles Lernen Techniken wie Deep Neural Networks oder KNN verwenden?
Ja, hier fügen Sie den Code mit ORB Feature Detector hinzu. – user3035413