1

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?

+0

Ja, hier fügen Sie den Code mit ORB Feature Detector hinzu. – user3035413

Antwort

0

Wenn Sie einen Datensatz für viele Arten von Objekten (Tür) erstellen können, können Sie Funktionen wie SIFT-Ausgang zum Training von SVM verwenden (in opencv finden Sie mehrere Beispiele).

+0

Ja kann ich den Datensatz erstellen, aber ich verwende gerne Funktionen wie Entfernung zwischen Fenster und Tür. Wie erkennt man dieses Feature und integriert es in SVM? – user3035413