Showing posts with label opencv. Show all posts
Showing posts with label opencv. Show all posts

Wednesday, November 4, 2015

Deteksi objek lingkaran berwarna merah dengan menggunakan OpenCV dan Python 2.7

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!!!

Tuesday, November 3, 2015

Mendeteksi garis akhir (edge) dari object dengan menggunakan python dan opencv

Catatan kali ini berisi tentang program untuk mendeteksi garis akhir alias edge (entah apa namanya kalo di translate bahasa Indonesia) dari sebuah object. Software ini menggunakan python dan opencv package untuk image processingnya.

Kodenya adalah sebagai berikut:

import cv2
import sys

if __name__ == '__main__':
print __doc__

try: fn = sys.argv[1]
except: fn = 0

def nothing(*arg):
pass

#buat window
cv2.namedWindow('edge')
#buat trackbar
cv2.createTrackbar('thrs1', 'edge', 2000, 5000, nothing)
cv2.createTrackbar('thrs2', 'edge', 4000, 5000, nothing)

#face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
#eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

#ambil data video
cap = cv2.VideoCapture(-1)
while True:
flag, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
thrs1 = cv2.getTrackbarPos('thrs1', 'edge')
thrs2 = cv2.getTrackbarPos('thrs2', 'edge')
edge = cv2.Canny(gray, thrs1, thrs2, apertureSize=5)
vis = img.copy()
vis /= 2
vis[edge != 0] =(0, 255, 255)
#tampilkan jendela gray dan edge
cv2.imshow('gray',gray)
cv2.imshow('edge', vis)
ch = cv2.waitKey(5)
if ch == 27:
break
cv2.destroyAllWindows()


Compile dan jalankan, maka akan muncul jendela tampilan seperti dibawah ini:



















catatan:

Tentunya ada beberapa hal yang harus dipersiapkan, diantaranya adalah webcam, dan software python itu sendiri. Karena saya menggunakan ubuntu 14.04, software python sudah disediakan oleh OS ubuntu. Saya hanya perlu webcam yang linux friendly dan menginstal package opencv ke python yang saya miliki.

Satu hal lagi, saya menggunakan pycharm sebagai IDE programing python.


 Selamat mencatat!!