folder Tahribat.com Forumları
linefolder Python
linefolder Python Opencv Ayarlanabilir Renk Takibi



Python Opencv Ayarlanabilir Renk Takibi

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cnr437
    cnr437's avatar
    Banlanmış Üye
    Kayıt Tarihi: 03/Nisan/2007
    Erkek

    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


    Bizim olduğumuz her yerde herşey bizim yüzümüzden olmuştur. Ben benim amk bana bişey olmasın!
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    All hail to Tux
    sandman
    sandman's avatar
    Kayıt Tarihi: 01/Eylül/2005
    Erkek

    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.


    Mühendis kahveyi projeye dönüştüren bir insan evladıdır.
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    All hail to Tux
    sandman
    sandman's avatar
    Kayıt Tarihi: 01/Eylül/2005
    Erkek

    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ühendis kahveyi projeye dönüştüren bir insan evladıdır.
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    SUPERBICO
    SUPERBICO's avatar
    Kayıt Tarihi: 13/Haziran/2008
    Erkek
    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 :)

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cnr437
    cnr437's avatar
    Banlanmış Üye
    Kayıt Tarihi: 03/Nisan/2007
    Erkek
    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


    Bizim olduğumuz her yerde herşey bizim yüzümüzden olmuştur. Ben benim amk bana bişey olmasın!
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    All hail to Tux
    sandman
    sandman's avatar
    Kayıt Tarihi: 01/Eylül/2005
    Erkek
    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


    Mühendis kahveyi projeye dönüştüren bir insan evladıdır.
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    wasd
    wasd's avatar
    Kayıt Tarihi: 14/Haziran/2006
    Erkek

    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 =)


    :)
Toplam Hit: 2111 Toplam Mesaj: 7