Verfolgen Sie Objekte mit Camshift mithilfe von OpenCV
OpenCV ist die riesige Open-Source-Bibliothek für Computer Vision, machine learning und Bildverarbeitung und spielt jetzt eine wichtige Rolle im Echtzeitbetrieb, der in heutigen Systemen sehr wichtig ist. Mit ihm kann man Bilder und Videos verarbeiten, um Objekte, Gesichter oder sogar die Handschrift eines Menschen zu identifizieren.
Camshift oder Continuously Adaptive Meanshift ist eine erweiterte Version des Meanshift-Algorithmus, die dem Modell mehr Genauigkeit und Robustheit verleiht. Mithilfe des Camshift-Algorithmus wird die Größe des Fensters ständig aktualisiert, wenn das Tracking-Fenster versucht, zu konvergieren. Die Verfolgung erfolgt anhand der Farbinformationen des Objekts. Außerdem bietet es das am besten passende Verfolgungsfenster für die Objektverfolgung. Zuerst wird die Mittelwertverschiebung angewendet und dann die Größe des Fensters wie folgt aktualisiert:
Anschließend wird die am besten passende Ellipse berechnet und die Mittelwertverschiebung erneut mit dem neu skalierten Suchfenster und dem vorherigen Fenster angewendet. Dieser Vorgang wird fortgesetzt, bis die erforderliche Genauigkeit erreicht ist.
Hinweis: Weitere Informationen zu Meanshift finden Sie unter Python OpenCV: Meanshift
Unten ist die Implementierung.
import
numpy as np
import
cv2 as cv
cap
=
cv.VideoCapture(
'sample.mp4'
)
ret, frame
=
cap.read()
x, y, width, height
=
400
,
440
,
150
,
150
track_window
=
(x, y,
width, height)
roi
=
frame[y:y
+
height,
x : x
+
width]
hsv_roi
=
cv.cvtColor(roi,
cv.COLOR_BGR2HSV)
mask
=
cv.inRange(hsv_roi,
np.array((
0.
,
60.
,
32.
)),
np.array((
180.
,
255.
,
255
)))
roi_hist
=
cv.calcHist([hsv_roi],
[
0
], mask,
[
180
],
[
0
,
180
])
cv.normalize(roi_hist, roi_hist,
0
,
255
, cv.NORM_MINMAX)
term_crit
=
( cv.TERM_CRITERIA_EPS |
cv.TERM_CRITERIA_COUNT,
15
,
2
)
while
(
1
):
ret, frame
=
cap.read()
frame
=
cv.resize(frame,
(
720
,
720
),
fx
=
0
, fy
=
0
,
interpolation
=
cv.INTER_CUBIC)
cv.imshow(
'Original'
, frame)
ret1, frame1
=
cv.threshold(frame,
180
,
155
,
cv.THRESH_TOZERO_INV)
hsv
=
cv.cvtColor(frame1,
cv.COLOR_BGR2HSV)
dst
=
cv.calcBackProject([hsv],
[
0
],
roi_hist,
[
0
,
180
],
1
)
ret2, track_window
=
cv.CamShift(dst,
track_window,
term_crit)
pts
=
cv.boxPoints(ret2)
pts
=
np.int0(pts)
Result
=
cv.polylines(frame,
[pts],
True
,
(
0
,
255
,
255
),
2
)
cv.imshow(
'Camshift'
, Result)
k
=
cv.waitKey(
30
) &
0xff
if
k
=
=
27
:
break
cap.release()
cv.destroyAllWindows()
Ausgabe: