Frage

ein Objekt auf einem einfachen weißen Hintergrund gegeben, weiß jemand, wenn OpenCV Funktionalität bietet auf einfache Weise ein Objekt aus einem erfassten Bild zu erkennen?

Ich versuche, die Ecke / Mittelpunkte eines Objekts (Rechteck) zu lokalisieren. Die Art, wie ich zur Zeit mache es, ist mit roher Gewalt (Scannen das Bild für das Objekt) und nicht korrekt. Ich frage mich, ob es Funktionalität unter der Haube ist, dass ich bin mir nicht bewusst.

Details bearbeiten : Die Größe ungefähr das gleiche wie eine kleine Getränkedose. Die Kamera ist über dem Objekt positioniert ist, ihm ein 2D / Rechteck Gefühl zu geben. Die Orientierung / Winkel von von der Kamera zufällig ist, die sich von den Eckpunkten berechnet wird.

Es ist nur ein weißer Hintergrund, mit dem Objekt auf sie (schwarz). Die Qualität der Aufnahme ist über das, was man erwarten würde von einer Logitech Webcam zu sehen.

Nachdem ich die Eckpunkte bekommen, berechne ich die Mitte. Der Mittelpunkt wird dann in Zentimeter umgewandelt.

Es ist Raffinierung nur ‚wie‘ ich jene vier Ecken ist, was ich versuche zu konzentrieren. Sie können meine Brute-Force-Methode mit diesem Bild sehen: Bild

War es hilfreich?

Lösung

Es gibt bereits ein Beispiel dafür, wie Rechteck Erkennung in OpenCV zu tun (suchen in Proben / squares.c), und es ist ganz einfach, eigentlich.

Hier ist der grobe Algorithmus sie verwenden:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

Nicht eine genaue Umschreibung dessen, was sie tun, aber es sollte Ihnen helfen.

Andere Tipps

Hope, das hilft, nutzt den Moment Methode den Schwerpunkt eines Schwarz-Weiß-Bild zu erhalten.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

OpenCV hat jede Menge Funktionen, die Sie dies erreichen können helfen. Herunterladen Emgu.CV für eine C # .NET in die Bibliothek eingewickelt, wenn Sie in dieser Sprache programmieren.

Einige Methoden zu bekommen, was Sie wollen:

  1. Die Ecken wie vor - zum Beispiel "CornerHarris" OpenCV Funktion

  2. Threshold das Bild und den Schwerpunkt berechnen - siehe http : //www.roborealm.com/help/Center%20of%20Gravity.php ... dies ist die Methode, die ich verwenden würde. Sie können sogar die Schwellwertbildung in der COG-Routine durchführen. das heißt cog_x + = * imagePtr <128? 255: 0;

  3. die Momente des Bildes findet Drehung zu geben, Schwerpunkt usw. - z.B. "Moments" OpenCV-Funktion. (Ich habe nicht verwendet)

  4. (edit) Die AForge.NET Bibliothek verfügt über Funktionen Ecke Erkennung sowie ein Beispielprojekt (BewegungsMelder) und Bibliotheken Webcams zu verbinden. Ich denke, das wäre der einfachste Weg zu gehen, Sie unter der Annahme, mit Windows und .NET.

Es ist in der Regel Blob-Analyse in anderen IBV-Bibliotheken genannt. Ich habe noch nicht verwendet opencv.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top