Python Opencv Ayarlanabilir Renk Takibi
-
Python ile OpenCV kütüphanesini kullanarak renk takibi yapabileceğiniz bi kod örneği, ilgilenenlerin işine yarayabilir. "cv2.pyd" kullanarak yapmıştım, numpy ve opencv gerekir, bağımlılıkları ona göre halledersiniz sanırım.
#!/usr/bin/env python
# Gerekli olan modulleri cagirilmasi.
import os
import cv2
import cv2.cv as cv
from numpy import interp
import sys
import time
# Programin calistigi dosya yolunun gosterilmesi
path = os.getcwd()
colorfile = os.path.join(path,"colors.txt")
# Eger dosya yolunda colors.txt diye bi dosya yoksa, yeni bir color.txt dosyasi olusturup icine varsayilan degerlerin atilmasi
try:
colors = open(colorfile)
line = colors.readline()
red, green, blue, redm, greenm, bluem = [int(x) for x in line.split(',')]
except:
red = green = blue = 0
redm = greenm = bluem = 200
#min = (30, 150, 30)
#max = (100, 255, 255)
# Hisbirsey yapmayan fonksiyon [GEREKLI]
def nothing(*arg):
pass
# Programin pencerelerinin masauzerine getirilmesi
def create_window():
# Renk Ayar penceresinin renk degerlerinin ayarlanmasi icin ayrica olusturulmasi
cv2.namedWindow('Renk Ayar')
cv2.createTrackbar('RED MIN', 'Renk Ayar', 0, 255, nothing)
cv2.createTrackbar('GREEN MIN', 'Renk Ayar', 0, 255, nothing)
cv2.createTrackbar('BLUE MIN', 'Renk Ayar', 0, 255, nothing)
cv2.createTrackbar('RED MAX', 'Renk Ayar', 0, 255, nothing)
cv2.createTrackbar('GREEN MAX', 'Renk Ayar', 0, 255, nothing)
cv2.createTrackbar('BLUE MAX', 'Renk Ayar', 0, 255, nothing)
cv2.setTrackbarPos('RED MIN', 'Renk Ayar', red)
cv2.setTrackbarPos('GREEN MIN', 'Renk Ayar', green)
cv2.setTrackbarPos('BLUE MIN', 'Renk Ayar', blue)
cv2.setTrackbarPos('RED MAX', 'Renk Ayar', redm)
cv2.setTrackbarPos('GREEN MAX', 'Renk Ayar', greenm)
cv2.setTrackbarPos('BLUE MAX', 'Renk Ayar', bluem)
cv2.resizeWindow('Renk Ayar', 500,300)
# Renk Takip penceresinin olusturulmasi
cv2.namedWindow('Renk Takip')
# Nesneyi bulan fonksiyon
def detect_object(image):
# IMAGE olarak gelen frame'in HSV moduna cevirilmesi
hsv_img = cv.CreateImage(cv.GetSize(image),8,3)
cv.CvtColor(image, hsv_img ,cv.CV_BGR2HSV)
# HSV moduna cevrilmis olan frame'in THRESHOLD alinacak sekilde siyah beyaz hale dondurulmesi
thrs_img=cv.CreateImage(cv.GetSize(hsv_img),8,1)
# HSV modunda olan frame'in ayarlanan renk degerleri arasinda olanlarinin siyah beyaz yapilmis frame'in uzerine yazilmasi
cv.InRangeS(hsv_img, (red,green,blue), (redm,greenm,bluem), thrs_img)
# 3. derecen polygonlarin moments (ortalama yogunluk araliklarini) hesaplayip donulmesi
moments = cv.Moments(cv.GetMat(thrs_img, 0), 0)
area = cv.GetCentralMoment(moments, 0, 0)
# Eger hesaplanan yogunluk alani belirledigimiz degerden buyukse (cok kucuk seylerin taninmamasi icin)
if(area > 100000):
# Moments'in orta noktasinin X ve Y baslangic noktalarina olan uzakliklarinin hesaplanmasi
x = cv.GetSpatialMoment(moments, 1, 0)/area
y = cv.GetSpatialMoment(moments, 0, 1)/area
# Yeni bir renkli frame yaratilmasi
overlay = cv.CreateImage(cv.GetSize(image), 8, 3)
# Taninan nesne etrafina ve koselerine cizgi cizilmesi
#cv.Circle(overlay, (int(x), int(y)), 2, (255, 255, 255), 20)
cv.Line(image, (int(x)+100, int(y)+100), (int(x)+90, int(y)+100), (255,255,255), 2)
cv.Line(image, (int(x)+100, int(y)+100), (int(x)+100, int(y)+90), (255,255,255), 2)
cv.Line(image, (int(x)-100, int(y)+100), (int(x)-90, int(y)+100), (255,255,255), 2)
cv.Line(image, (int(x)-100, int(y)+100), (int(x)-100, int(y)+90), (255,255,255), 2)
cv.Line(image, (int(x)-100, int(y)-100), (int(x)-90, int(y)-100), (255,255,255), 2)
cv.Line(image, (int(x)-100, int(y)-100), (int(x)-100, int(y)-90), (255,255,255), 2)
cv.Line(image, (int(x)+100, int(y)-100), (int(x)+90, int(y)-100), (255,255,255), 2)
cv.Line(image, (int(x)+100, int(y)-100), (int(x)+100, int(y)-90), (255,255,255), 2)
# Ilk frame ile renklerin secildigi frame'in birlestirilmesi
cv.Add(image, overlay, image)
cv.Merge(thrs_img, None, None, None, image)
# Servo kontrolu icin gerekli olan pozisyon degerinin donulmesi
return x
if __name__ == "__main__":
# Pencerenin olusturulmasi ve Kamera'dan frame alinmasina baslanilmasi
create_window()
capture = cv.CaptureFromCAM(0)
# Sonsuz dongu
while True:
# Kameradan her dongude bir frame alinip image degiskenine yazilmasi
image = cv.QueryFrame(capture)
# Renk Ayar penceresinde ayarlanan renklerin degerlerinin alinip degiskenlere eslestirilmesi
red = cv2.getTrackbarPos('RED MIN', 'Renk Ayar')
green = cv2.getTrackbarPos('GREEN MIN', 'Renk Ayar')
blue = cv2.getTrackbarPos('BLUE MIN', 'Renk Ayar')
redm = cv2.getTrackbarPos('RED MAX', 'Renk Ayar')
greenm = cv2.getTrackbarPos('GREEN MAX', 'Renk Ayar')
bluem = cv2.getTrackbarPos('BLUE MAX', 'Renk Ayar')
# Nesnenin tanimlanacagi fonksiyona kameradan alinan frame'in gonderilmesi
x = detect_object(image)
# Eger pozisyon varsa, servo icin gerekli islemlerin ve hesaplamalarin yapilmasi
if x:
w,h = cv.GetSize(image)
pos = int(interp(x, [0,640],[0,180]))
try:
sys.stdout.flush()
except:
pass
# Tum pencelerin ekranda gosterilmesi ve kapatmak icin ESC tusuna basilip basilmadiginin surekli kontrolu
cv.ShowImage("Renk Takip", image)
ch = cv2.waitKey(5)
if ch == 27:
break
cv2.destroyAllWindows()
#Renklerin ayar dosyasina yazilmasi
colors = open(colorfile,'w')
line = [red, green, blue, redm, greenm, bluem]
line = ",".join([str(x) for x in line])
colors.write(line)
colors.close()
olur da nasıl çalışıyor diye merak edenler için, windows'a derlenmiş halini de koyayım :)
http://depositfiles.com/files/n95bz6w6p
-
Hemen yüksek lisans tezim olduğu için atlayım :)
Öncelikle 2.3 kullanmanızı öneririm 2.4'de apiyi baya değiştirdiler. Ek olarak aşagıda ki örnekte hsv moduna cevrilirken InRange'de 2 farklı trashold değerine göre işleyip or'larsa daha iyi sonuç alır. ;)
Son olarak python ve opencv ile ilgilenen arkadaşlar benim gibi tembelseniz simpleCV öneririm opencv'nin python frameworkü seksidir.
-
Birde cnr sana notum abi ne eğitim hayatım boyunca nede iş hayatımda o kadar python kodu yazdım bir kere bile böyle düzenli kurallara uyarak değişken atamadım commend yazmadım.Görünce insan özeniyor.
Tembelim ne yapim.
-
sandman bunu yazdı
Birde cnr sana notum abi ne eğitim hayatım boyunca nede iş hayatımda o kadar python kodu yazdım bir kere bile böyle düzenli kurallara uyarak değişken atamadım commend yazmadım.Görünce insan özeniyor.
Tembelim ne yapim.
abi her şeyi de biliyorsun.idolümsün :)
-
sandman bunu yazdı
Birde cnr sana notum abi ne eğitim hayatım boyunca nede iş hayatımda o kadar python kodu yazdım bir kere bile böyle düzenli kurallara uyarak değişken atamadım commend yazmadım.Görünce insan özeniyor.
Tembelim ne yapim.
müdür normalde ben de yazmıyordum, sonra bi baktım, yazıyom yazıyom, 3-4 ay sonra ben bu kodu nası yazmışım amk oluyom :S, o yüzden hatırlatıcı commentler koymayı iyice alışkanlık edindim :D
-
cnr437 bunu yazdısandman bunu yazdı
Birde cnr sana notum abi ne eğitim hayatım boyunca nede iş hayatımda o kadar python kodu yazdım bir kere bile böyle düzenli kurallara uyarak değişken atamadım commend yazmadım.Görünce insan özeniyor.
Tembelim ne yapim.
müdür normalde ben de yazmıyordum, sonra bi baktım, yazıyom yazıyom, 3-4 ay sonra ben bu kodu nası yazmışım amk oluyom :S, o yüzden hatırlatıcı commentler koymayı iyice alışkanlık edindim :D
Abi ben hep kendimi yeniden keşfetme taraftarıyım:P
-
derindelimavi.blogspot.com
da görmüştüm openCVyi ilk(orda c#la kullanılmış), çok merak etmiştim de şöyle bi merhaba demeye bile uğraşmamıştım. Güzelmiş, konu güzel =)