OpenCV Geschwindigkeit Verkehrszeichenerkennung

Ich habe ein Problem beim Erkennen von Verkehrszeichen mit opencv 2.4 für Android. Ich mache folgendes:

"Einzelbild erfassen -> in HSV konvertieren -> rote Bereiche extrahieren -> Zeichen mit Ellipsenerkennung erkennen"

So weit Ellipsenerkennung funktioniert einwandfrei, solange das Bild eine gute Qualität hat. Aber wie Sie in den folgenden Bildern sehen, funktioniert diese rote Extraktion meiner Meinung nach aufgrund der schlechten Qualität der Bilderrahmen nicht in Ordnung.

Ursprüngliches Bild in HSV konvertieren:

Imgproc.cvtColor(this.source, this.source, Imgproc.COLOR_RGB2HSV, 3);

Extrahieren von roten Farben:

Core.inRange(this.source, new Scalar(this.h,this.s,this.v), new Scalar(230,180,180), this.source);

So meine Frage ist, gibt es eine andere Möglichkeit, Verkehrszeichen wie dieses zu erkennen oder rote Bereiche daraus zu extrahieren, die im Übrigen sehr schwach sein können, wie im letzten Bild?

Dies ist das Originalbild:

Dies wird in HSV konvertiert, da Sie sehen können, dass rote Bereiche die gleiche Farbe wie in der Nähe befindliche Bäume haben. So soll ich wissen, dass es rot ist, aber ich kann nicht.

Converted to HSV:

Das ist mit roten Farben extrahiert. Wenn die Farben stimmen würden, würde ich fast perfekte Kreise / Ellipsen um das Zeichen erhalten, aber es ist aufgrund falscher Farben unvollständig.

Ergebnis nach Extraktion:

Ellipse-Methode:

private void findEllipses(Mat input){
Mat thresholdOutput = new Mat();
int thresh = 150;

List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
MatOfInt4 hierarchy = new MatOfInt4();

Imgproc.threshold(source, thresholdOutput, thresh, 255, Imgproc.THRESH_BINARY);
//Imgproc.Canny(source, thresholdOutput, 50, 180);
Imgproc.findContours(source, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
RotatedRect minEllipse[] = new RotatedRect[contours.size()];

for(int i=0; i<contours.size();i++){
    MatOfPoint2f temp=new MatOfPoint2f(contours.get(i).toArray());

    if(temp.size().height > minEllipseSize && temp.size().height < maxEllipseSize){
        double a = Imgproc.fitEllipse(temp).size.height;
        double b = Imgproc.fitEllipse(temp).size.width;
        if(Math.abs(a - b) < 10)
            minEllipse[i] = Imgproc.fitEllipse(temp);
    }
}
detectedObjects.clear();
for( int i = 0; i< contours.size(); i++ ){
    Scalar color = new Scalar(180, 255, 180);
    if(minEllipse[i] != null){
        detectedObjects.add(new DetectedObject(minEllipse[i].center));
        DetectedObject detectedObj = new DetectedObject(minEllipse[i].center);
        Core.ellipse(source, minEllipse[i], color, 2, 8);
    }
}

}

Problematisches Zeichen:

Antworten auf die Frage(8)

Ihre Antwort auf die Frage