Live-Webcam-Zeichnung mit OpenCV
Lassen Sie uns sehen, wie Sie die Bewegung von Objekten zeichnen, die von der Webcam mit OpenCV erfasst wurden. Unser Programm nimmt die Videoeingabe von der Webcam und verfolgt die Objekte, die wir bewegen. Nach dem Identifizieren der Objekte werden Konturen präzise erstellt. Danach wird Ihre gesamte Zeichnung auf dem Ausgabebildschirm gedruckt.
import
cv2
import
numpy as np
frameWidth
=
640
frameHeight
=
480
cap
=
cv2.VideoCapture(
0
)
cap.
set
(
3
, frameWidth)
cap.
set
(
4
, frameHeight)
cap.
set
(
10
,
150
)
myColors
=
[[
5
,
107
,
0
,
19
,
255
,
255
],
[
133
,
56
,
0
,
159
,
156
,
255
],
[
57
,
76
,
0
,
100
,
255
,
255
],
[
90
,
48
,
0
,
118
,
255
,
255
]]
myColorValues
=
[[
51
,
153
,
255
],
[
255
,
0
,
255
],
[
0
,
255
,
0
],
[
255
,
0
,
0
]]
myPoints
=
[]
def
findColor(img, myColors, myColorValues):
imgHSV
=
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
count
=
0
newPoints
=
[]
for
color
in
myColors:
lower
=
np.array(color[
0
:
3
])
upper
=
np.array(color[
3
:
6
])
mask
=
cv2.inRange(imgHSV,lower,upper)
x, y
=
getContours(mask)
cv2.circle(imgResult, (x,y),
15
,
myColorValues[count], cv2.FILLED)
if
x !
=
0
and
y !
=
0
:
newPoints.append([x,y,count])
count
+
=
1
return
newPoints
def
getContours(img):
_, contours, hierarchy
=
cv2.findContours(img, cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
x, y, w, h
=
0
,
0
,
0
,
0
for
cnt
in
contours:
area
=
cv2.contourArea(cnt)
if
area >
500
:
peri
=
cv2.arcLength(cnt,
True
)
approx
=
cv2.approxPolyDP(cnt,
0.02
*
peri,
True
)
x, y, w, h
=
cv2.boundingRect(approx)
return
x
+
w
/
/
2
, y
def
drawOnCanvas(myPoints, myColorValues):
for
point
in
myPoints:
cv2.circle(imgResult, (point[
0
], point[
1
]),
10
, myColorValues[point[
2
]], cv2.FILLED)
while
True
:
success, img
=
cap.read()
imgResult
=
img.copy()
newPoints
=
findColor(img, myColors, myColorValues)
if
len
(newPoints)!
=
0
:
for
newP
in
newPoints:
myPoints.append(newP)
if
len
(myPoints)!
=
0
:
drawOnCanvas(myPoints, myColorValues)
cv2.imshow(
"Result"
, imgResult)
if
cv2.waitKey(
1
)
and
0xFF
=
=
ord
(
'q'
):
break