Catatan berikut ini
menberikan contoh program untuk mendeteksi objek lingkaran dengan
menggunakan python 2.7 dan library OpenCV.
Proses kerja dari
software adalah dengan mengambil gambar video dari webcam, mengubah
menjadi bentuk HSV, lalu mengatur parameter maksimal dan minimal dari
masing-masing komponen tersebut. Dari pengaturan tersebut akan
dideteksi satu buah atau beberapa warna tertentu (tergantung
pengaturan komponen H, S, danV). Pada contoh kali ini pengaturan
adalah pada warna merah.
Software akan
menampilkan 3 jendela yaitu jendela video asli, jendela video hasil
HSV, dan jendela video hasil akhir dari pengolahan. Untuk mendeteksi
bentuk lingkaran, digunakan fungsi HoughCircle dalam library OpenCV
yang telah diinstall sebelumnya.
Saat terdeteksi
bentuk lingkaran berwarna merah, video akan menggambarkan lingkaran
hijau pada object lingkaran. Tanda lingkaran hijau akan berubah
menjadi berwarna merah jika object lingkaran merah dekat dengan
kamera.
Video demo dapat
dilihat dibawah ini:
Berikut adalah kode
python yang saya gunakan:
__author__ =
'uits2015'
import cv2
import cv2.cv as cv
import numpy as np
kernel =
np.ones((5,5),np.uint8)
# Take input from
webcam
cap =
cv2.VideoCapture(-1)
# Reduce the size of
video to 320x240 so rpi can process faster
cap.set(3,320)
cap.set(4,240)
def nothing(x):
pass
# Creating a windows
for later use
cv2.namedWindow('HSVsetup')
#cv2.namedWindow('HueComp')
#cv2.namedWindow('SatComp')
#cv2.namedWindow('ValComp')
cv2.namedWindow('closing')
cv2.namedWindow('tracking')
# Creating track bar
for min and max for hue, saturation and value
# You can adjust the
defaults as you like
cv2.createTrackbar('hmin',
'HSVsetup',0,500,nothing)
cv2.createTrackbar('hmax',
'HSVsetup',6,500,nothing)
cv2.createTrackbar('smin',
'HSVsetup',88,500,nothing)
cv2.createTrackbar('smax',
'HSVsetup',254,500,nothing)
cv2.createTrackbar('vmin',
'HSVsetup',117,500,nothing)
cv2.createTrackbar('vmax',
'HSVsetup',200,500,nothing)
# My experimental
values
# hmn = 12 / 106
# hmx = 37 / 179
# smn = 145 / 87
# smx = 255 / 163
# vmn = 186 /102
# vmx = 255 /185
while(1):
buzz = 0
_, frame =
cap.read()
#converting to
HSV
hsv =
cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
hue,sat,val =
cv2.split(hsv)
# get info from
track bar and appy to result
hmn =
cv2.getTrackbarPos('hmin','HSVsetup')
hmx =
cv2.getTrackbarPos('hmax','HSVsetup')
smn =
cv2.getTrackbarPos('smin','HSVsetup')
smx =
cv2.getTrackbarPos('smax','HSVsetup')
vmn =
cv2.getTrackbarPos('vmin','HSVsetup')
vmx =
cv2.getTrackbarPos('vmax','HSVsetup')
# Apply
thresholding
hthresh =
cv2.inRange(np.array(hue),np.array(hmn),np.array(hmx))
sthresh =
cv2.inRange(np.array(sat),np.array(smn),np.array(smx))
vthresh =
cv2.inRange(np.array(val),np.array(vmn),np.array(vmx))
# AND h s and v
tracking =
cv2.bitwise_and(hthresh,cv2.bitwise_and(sthresh,vthresh))
# Some
morpholigical filtering
dilation =
cv2.dilate(tracking,kernel,iterations = 1)
closing =
cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)
closing =
cv2.GaussianBlur(closing,(5,5),0)
# Detect circles
using HoughCircles
circles =
cv2.HoughCircles(closing,cv.CV_HOUGH_GRADIENT,2,120,param1=120,param2=50,minRadius=10,maxRadius=0)
# circles =
np.uint16(np.around(circles))
#Draw Circles
if circles is
not None:
for i in
circles[0,:]:
# If
the ball is far, draw it in green
if
int(round(i[2])) < 30:
cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),int(round(i[2])),(0,255,0),5)
cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),2,(0,255,0),10)
# else draw it
in red
elif
int(round(i[2])) > 35:
cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),int(round(i[2])),(0,0,255),5)
cv2.circle(frame,(int(round(i[0])),int(round(i[1]))),2,(0,0,255),10)
buzz = 1
#
print 'round object detected!!!'
#you can use the
'buzz' variable as a trigger to switch some GPIO lines on Rpi :)
# print buzz
# if buzz:
# put your
GPIO line here
#Show the result
in frames
#
cv2.imshow('HueComp',hthresh)
#
cv2.imshow('SatComp',sthresh)
#
cv2.imshow('ValComp',vthresh)
cv2.imshow('closing',closing)
cv2.imshow('tracking',frame)
cv2.imshow('HSVsetup',hsv)
k =
cv2.waitKey(5) & 0xFF
if k == 27:
break
cap.release()
cv2.destroyAllWindows()
Catatan:
pendeteksian warna dapat dirubah dengan cara mengubah parameter Hmax, Hmin, Smax, Smin, Vmax, dan Vmin.
sebelum memprogram, pastikan library opencv sudah terintegrasi dengan software python yang dimiliki
dalam pengembangan program, saya menggunakan IDE Pycharm
Selamat Mencatat!!!
No comments:
Post a Comment