Hier ist die Sache - Wenn wir ein kontinuierliches Video mit openCV Mat-Objekt streamen, zeigt es ein Bild nach dem anderen, damit die Informationen des n-ten Frames verloren gehen, wenn der (n + 1) -te Frame empfangen wird.
Was Sie brauchen, sind 2 Mat Objekte - eins, um die Kamera zu streamen (sagen Mat_cam), und das andere, um die Lasertrajektorie (Mat_traj) zu zeichnen. Mat_cam wird verwendet, um die Laserposition Bild für Bild zu verfolgen, unter Verwendung eines beliebigen Standard-Farbschwellenalgorithmus. Sogar das Video sagt, dass der Laser hell sein sollte, was bedeutet, dass jimez86 möglicherweise eine weiße Farbschwelle verwendet, gefolgt von der größten Flecklokalisierung.
Wenn eine neue Laserposition im n-ten Rahmen empfangen wird, zeichnen Sie einen entsprechenden Kreis auf Mat_traj. Wenn das nächste Frame empfangen wird, wird Mat_cam aktualisiert und es wird eine neue Laserposition haben, aber Mat_traj wird dasselbe sein, da es nicht mit jeder 'for' Schleifeniteration gelöscht/aufgefrischt wird, daher wird es das Ganze enthalten Flugbahn. Das Hinzufügen von Mat_traj und Mat_cam mit Gewichtetem Zusatz gibt Ihnen das gewünschte Ergebnis. Folgen Sie dem folgenden Algo:
Mat Mat_traj(640,480,CV_8UC1,Scalar(0)),Mat_cam,Mat_res;
VideoCapture cam(0);
for(;;)
{
cam>>Mat_cam;
Point laserCentre=getLaserCentre(Mat_cam);//you'll be defining this function;
drawCircle(Mat_traj,laserCentre);
addWeighted(Mat_cam,Mat_traj,other_params,Mat_res);
imshow("out",Mat_res);
waitKey(10);
}
Was für eine brillante Antwort. Vielen Dank! – WheelPot