2017-04-04 2 views
0

Ich benutze C++ mit OpenCV 3.0, um eine grundlegende Form von SimulCam zu erstellen.Wie finde ich heraus, ob der Objektball, den ich aufspüre, eine von mir gezeichnete Linie kreuzt?

Ich bin derzeit auf der Suche nach einer Möglichkeit zu überprüfen, wenn der Objektball mit einer Linie, die ich auf das Ausgabefenster gezeichnet haben gekreuzt/geschnitten wurde.

Der Ball wird verfolgt mit Konturen, und ich möchte schließlich die genaue Frame-Nummer, die dieser Schnittpunkt passiert.

Aber zuerst würde ich gerne verstehen, wie man den Check durchführt, um zu sehen, wann der Objektball die gezeichnete Linie überquert hat.

Scene with ball moving towards line

Ich habe die Konturen für das Objekt, würde ich verstehen, wie die Prüfung einer Kreuzung durchzuführen.

-Code für Konturen zu finden und Objektverfolgung:

findContours(resizedThresh, contourVector, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0)); 

contourVector.resize(contourVector.size()); 

line(resizedF_Fast, Point(300, 0), Point(300, 360), Scalar(255), 2, 8); 
for (size_t i = 0; i < contourVector.size(); i++) { 

    approxPolyDP(Mat(contourVector[i]), contourVector[i], 0.01*arcLength(contourVector[i], true), true); 
    double area = contourArea(contourVector[i]); 

    if (contourVector[i].size() > 5 && (area > 200)) { 
     ++circlesC; 
     drawContours(resizedF_Fast, contourVector, i, Scalar(255, 255, 255), 2, CV_AA, hierarchy, abs(1)); 
     searchForMovement(resizedThresh, resizedF_Fast); 
    } 
} 

Ich habe einige andere Forschung getan, und ich habe mich in mit lineIterator, aber ich bin nicht ganz sicher.

Entschuldigung für den möglichen rohen Code, Anfänger hier. Jede Hilfe würde sehr geschätzt werden.

+0

Wie ist Ihre Linie definiert? Ist es immer vertikal oder kann es alles sein? – Sunreef

+0

In diesem Fall ist die Linie immer vertikal. Weiter unten auf der Linie würde es sich ändern, um ein extrahiertes Merkmal von einem Rahmen zu sein, d. H. Eine Start-Ziellinie in der Szenerie usw. – AnthonyGR1

Antwort

0

Ich habe endlich durchgearbeitet, ich werde die allgemeine Idee hier posten.

Berechnen Sie für jeden Rahmen die Objektkonturen.

  • jede Kontur wird ein x und y haben

LineIterator (z.B. LineIt), um durch alle Werte von einer Zeile verwendet gespeichert koordinieren.

if (xpos_contour < lineIt.pos().x) { 
    // Object is on the left of the line 
} 
else if (xpos_contour > lineIt.pos().x) { 
    // Object is to the right of the line 
} 

Denken Sie an das Eingangsvideo, das von oben nach unten gefilmt wurde, also war nur die x-Koordinate wichtig.

0

Meine erste Annäherung wäre, einen Kreis in Ihre Konturpunkte einzupassen und dann den Abstand zwischen der Linie und Ihrem Kreismittelpunkt mit dem Punktprodukt zu berechnen. Vielleicht so (hat es nicht ausprobiert):

Point Pc; // circle center 
Point L0(300,0); 
Point L1(300,360); 

double v[] = {L1.x-L0.x,L1.y-L0.y}; 
double w[] = {Pc.x-L0.x,Pc.y-L0.y}; 

Mat v(1,2,CV_32F,v); 
Mat w(1,2,CV_32F,w); 

double c1 = w.dot(v); 
double c2 = v.dot(v); 
double b = c1/c2; 

Mat Pb = L0 + b * v; 
double distance = norm(Pc,Pb); 

Dann überprüfen Sie, ob Ihr Abstand minus Ihrem Kreisradius weniger gleich Null ist.

Aber aufgrund der perspektivischen Transformation Ihrer Kamera wird der Ball zu einer Ellipse und meine Annahme wird weniger genau.

Wenn Sie eine genauere Lösung benötigen, müssen Sie jeden Konturpunkt überprüfen und den Mindestabstand einhalten.

This link zeigt einige Code und weitere Erklärungen.

0

Überprüfen Sie this Tutorial. Er zeigt es an, um zu prüfen, ob ein Objekt (in seinem Fall Autos) eine Linie kreuzt.

Verwandte Themen