Wenn Sie mit OpenCV spielen, möchten Sie möglicherweise Objekte anhand der Farbe erkennen. Oft bei der Farberkennung mit OpenCV
--Konvertieren Sie mit cv2.cvtColor vom RGB-Farbraum in den HSV-Farbraum
Die Methode wird vorgestellt. Andererseits ist es auf die gleiche Weise möglich, Numpy zu verwenden, um die Bedingungen für jedes Pixel zu binarisieren. Hier haben wir die Geschwindigkeiten auf Xavier NX verglichen, einschließlich der Vor- und Nachteile dieser beiden Methoden und der Implementierung in Cupy.
Nach der Umstellung auf HSV haben wir die folgenden 4 Bedingungen einschließlich der Binärisierungsmethode mit inRange verglichen.
Normalerweise möchten wir bei der Farberkennung mit inRange eine Farberkennung basierend auf dem Farbton durchführen. Daher sollten wir meiner Meinung nach zuerst vom RGB-Farbraum in den HSV-Farbraum konvertieren. in diesem Fall
--InRange hat grundsätzlich einen geringen Freiheitsgrad, da nur ein Schwellenwert mit einer Konstanten parallel zu jeder Achse im Farbraum angenommen werden kann.
Infolgedessen bei Verwendung von inRange Wie Sie sehen können, ist es sehr schwierig, das schwarze Kabel unten im Bild und die weiße Wand oben im Bild von der grünen Kugel zu unterscheiden.
Filter ähnlich wie inRange in Numpy
numpy1.py
hsv = cv2.cvtColor( frame , cv2.COLOR_BGR2HSV )
h = frame[:,:,0]
s = frame[:,:,1]
v = frame[:,:,2]
mask_g = np.zeros(h.shape, dtype=np.uint8)
mask_g[ (h>20) & (h <100) & (s>200) & (s < 255) & (v>50) & (v<150 ) ] = 255
Ich denke, es kann als implementiert werden. in diesem Fall
mask_g[ (h>20) & (h <100) & (s>200) & (s < 255) & (v>50) & (v<150 ) ] = 255
Teil ist
mask_g[ ( g/r> 2.0) & (g/b>2.0) ] = 255
Nicht nur der Schwellenwert als Konstante parallel zur Achse des Farbraums, sondern auch der Schwellenwert kann basierend auf dem Verhältnis jedes Elements festgelegt werden, und es kann ein linearer oder komplizierterer Schwellenwert festgelegt werden. Im obigen Beispiel ist das Bild nach der Erkennung wie folgt, und ich denke, dass das erwartete Ergebnis leicht erhalten werden kann. Im obigen Beispiel wird erkannt, wenn das grüne Element doppelt so hell wie rot und blau ist und die schwarzen und weißen Teile wie unten gezeigt leicht ausgeschlossen werden können.
Auf der anderen Seite in Bezug auf die Geschwindigkeit
1.inRange | 2.numpy(Wie inRange) | 3.numpy(RGB-Korrelation) | 4.CUPY |
---|---|---|---|
0.009[s] | 0.047[s] | 0.055[s] | 0.021[s] |
Ich dachte nicht, dass inRange der schnellste ist. .. .. ..
inrange.py
import cv2
import numpy as np
import time
src = 'v4l2src device= /dev/video0 ! image/jpeg,width=1920,height=1080 !jpegdec !videoconvert ! appsink'
cap=cv2.VideoCapture(src)
W = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
while(cap.isOpened()):
sum=0
for i in range( 0,100 ):
ret, frame = cap.read()
start=time.time()
r = frame[:,:,0]
g = frame[:,:,1]
b = frame[:,:,2]
mask_g = np.zeros(r.shape, dtype=np.uint8)
mask_g[ ( g/r> 2.0) & (g/b>2.0) ] = 255
end = time.time()
sum+= (end- start)
cv2.imshow('ReadM',mask_g )
cv2.waitKey(1)
if i % 10 == 0 :
print( i )
print( sum/100)
cap.release()
numpy1.py
import cv2
import numpy as np
import time
src = 'v4l2src device= /dev/video0 ! image/jpeg,width=1920,height=1080 !jpegdec !videoconvert ! appsink'
cap=cv2.VideoCapture(src)
W = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
while(cap.isOpened()):
sum=0
for i in range( 0,100 ):
ret, frame = cap.read()
start=time.time()
hsv = cv2.cvtColor( frame , cv2.COLOR_BGR2HSV )
h = frame[:,:,0]
s = frame[:,:,1]
v = frame[:,:,2]
mask_g = np.zeros(h.shape, dtype=np.uint8)
mask_g[ (h>20) & (h <100) & (s>200) & (s < 255) & (v>50) & (v<150 ) ] = 255
end = time.time()
sum+= (end- start)
cv2.imshow('ReadM',mask_g )
cv2.waitKey(1)
if i % 10 == 0 :
print( i )
print( sum/100)
cap.release()
numpy2.py
import cv2
import numpy as np
import time
src = 'v4l2src device= /dev/video0 ! image/jpeg,width=1920,height=1080 !jpegdec !videoconvert ! appsink'
cap=cv2.VideoCapture(src)
W = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
while(cap.isOpened()):
sum=0
for i in range( 0,100 ):
ret, frame = cap.read()
start=time.time()
r = frame[:,:,0]
g = frame[:,:,1]
b = frame[:,:,2]
mask_g = np.zeros(r.shape, dtype=np.uint8)
mask_g[ ( g/r> 2.0) & (g/b>2.0) ] = 255
end = time.time()
sum+= (end- start)
cv2.imshow('ReadM',mask_g )
cv2.waitKey(1)
if i % 10 == 0 :
print( i )
print( sum/100)
cap.release()
cupy.py
import cv2
import cupy as cp
import time
src = 'v4l2src device= /dev/video0 ! image/jpeg,width=1920,height=1080 !jpegdec !videoconvert ! appsink'
cap=cv2.VideoCapture(src)
W = cap.get(cv2.CAP_PROP_FRAME_WIDTH)
H = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)
fps = cap.get(cv2.CAP_PROP_FPS)
while(cap.isOpened()):
sum=0
for i in range( 0,100 ):
ret, frame = cap.read()
start=time.time()
frame_cupy = cp.asarray( frame )
r = frame_cupy[:,:,0]
g = frame_cupy[:,:,1]
b = frame_cupy[:,:,2]
mask_g = cp.zeros(r.shape, dtype=cp.uint8)
mask_g[ ( g/r> 2.0) & (g/b>2.0) ] = 255
mask_gn = cp.asnumpy( mask_g )
end = time.time()
sum+= (end- start)
cv2.imshow('ReadM',mask_gn )
cv2.waitKey(1)
if i % 10 == 0 :
print( i )
print( sum/100)
cap.release()
Recommended Posts