Python Kare Algılama

osmangnc

Üye
Katılım
10 Şub 2019
Mesajlar
14
Puanları
1
Yaş
29
Merhaba,
kameradan canlı görüntü alıp görüntü alanına kare bir cisim girdiği anda bunun fotografını çekip kayıt edecek bir program yazıyorum fakat hata alıyorum . yardım edebilir misiniz?

aşağıda yazdığım örnek kod var. kod da :
kamera sürekli tarama yapıyor eğer kare algılar ise 1 tuşuna basın diyor ve 3 adet fotograf keydediyor. sonra tekrar tarama yapıyor eğer kare algılar ise 2 tuşuna basmamızı isteyip algıladığı kareleri 2. klasöre kayıt ediyor.
Kod:
# -*- coding: utf-8 -*-

"""

Created on Thu Sep 24 13:43:19 2020



[USER=227105]@author[/USER]: Osman Genç

"""





import cv2

import numpy as np

import os





mermerSayi=0



def kaydet():

    for mermerSayi in range(3):

  

      

        cv2.imwrite(f"foto"+str({mermerSayi})+".jpg",image)

        print("fotograf kaydedildi")

        print("k degeri,",mermerSayi)

        mermerSayi=mermerSayi+1

  

  

  



#kamera=cv2.VideoCapture(0)

while 1:

  

    mermerSayi=0

   # ret,goruntu=kamera.read()

    goruntu=cv2.imread("c.png")   



    width = int(300)

    height = int(658)

    dim = (width, height)

    #resize image

    goruntu = cv2.resize(goruntu, dim, interpolation=cv2.INTER_AREA)



                  

    height, width, channel = goruntu.shape

    step = channel * width

 

    image=goruntu

  

    gray1 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    gray1 = cv2.bilateralFilter(gray1, 11, 118, 119)

    edged = cv2.Canny(gray1, 30, 200)

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

    closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)

    (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  

  

    print("Program Basliyor ....-")

    key=input(print("1. Sinif Mermerleri Koyun ve 1 tusuna basin"))

    key=int(key)

  

  

  

      

      

  

    for c in cnts:

                    # approximate the contour

        area = cv2.contourArea(c)

        peri = cv2.arcLength(c, True)

        approx = cv2.approxPolyDP(c, 0.015 * peri, True)

        print('kose bekleniyor...')

        appsayi=len(approx)

        print("bulunan kose sayisi",appsayi)

          

          

    if appsayi!=4:

       pass

      

      

    if len(approx) == 4 :

      

          

        screenCnt = approx

  

        print('Mermer Tespit Edildi')

        



      

        print('alan', area)

        area1=area*0.04285714

        cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 3)

        cv2.imshow("1",image)

        cv2.waitKey(5)

      

          

        key=input(print("1. Sinif Mermerleri Koyun ve 1 tusuna basin"))

        key=int(key)

          

        if key==1 & mermerSayi<=3:

            os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Bir")

            kaydet()

            cv2.imshow("image",image)

            cv2.waitKey(5)

      

        print("birinci sinif mermer sayisi,", mermerSayi) 

        print("1. sinif mermerlerden 3 adet cekildi")

        key=input(print("2. Sinif Mermerleri Koyun ve 2 tusuna basin"))

        key=int(key)

        os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları")

          

        if  key==2 & mermerSayi<=3:

            os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Iki")

            mermersayi=0

            kaydet()

      

        print("2. sinif mermer sayisi,", mermerSayi) 

        print("2. sinif mermerlerden 3 adet cekildi")

        key=input(print("3. Sinif Mermerleri Koyun ve 3 tusuna basin"))

        key=int(key)

        os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları")

      

        if   key==3 & mermerSayi<=3:

            os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Uc")

            mermersayi=0

            kaydet()

          

    cv2.imshow("fo",image)

    if cv2.waitKey(25) & 0xFF==ord("w") :

        break

          

          

      

      

      

      

      



        #if area1 > 5:

          

         #   print(area1)

          #  cv2.imwrite("amet.jpg",image)

 

      

    print("Resim Cekme tamlandı.")

    break

    #if cv2.waitKey(25) & 0xFF==ord("q") :

        #break





#kamera.release()

  

 

cv2.destroyAllWindows()
 
Moderatör tarafında düzenlendi:
Hata alıyorum demişsin ama hatanın ne olduğunu belirtmemişsin.

Sonra kod örneği gönderirken kod olan bölümü seçip ... bölümünden ekle </Kod> seçeneğini seçmekte fayda var.

Python:
class Uçuş:

    def __init__ (self, kalkış, varış, süre):
        self.kalkış = kalkış
        self.varış = varış
        self.süre = süre
 
Son düzenleme:
Merhaba , Öncelikle cevap verdiğiniz için teşekkür ederim .

kodu bir tık daha düzenledim az önce fotografları kaydemiyordum fakat onu hallettim.
şimdi ise program çok sağlıklı çalışmıyor: kare gördüğünde fotograf çek diyorum fakat kare nesneleri algılamıyor. ama sadece canlı görüntüde böyle .
eğer paint te çizilmiş fotograflar kullanır isem onları algılıyor, Ama web cam da program çok işe yaramıyor; neden olduğunu çözemiyorum.
Kod:
# -*- coding: utf-8 -*-

"""

Created on Thu Sep 24 13:43:19 2020



[USER=227105]@author[/USER]: Osman Genç

"""





import cv2

import numpy as np

import os



appsayi=""





def kaydet():

    for mermerSayi in range(3):

  

      

        cv2.imwrite(f"foto"+str({mermerSayi})+".jpg",image)

        print("fotograf kaydedildi")

        print("k degeri,",mermerSayi)

        mermerSayi=mermerSayi+1

  

  

  



kamera=cv2.VideoCapture(0)

while 1:

  

    mermerSayi=0

    ret,goruntu=kamera.read()

    #goruntu=cv2.imread("e.jpeg")   



    width = int(300)

    height = int(658)

    dim = (width, height)

    #resize image

    goruntu = cv2.resize(goruntu, dim, interpolation=cv2.INTER_AREA)



                  

    height, width, channel = goruntu.shape

    step = channel * width

 

    image=goruntu

  

    gray1 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    gray1 = cv2.bilateralFilter(gray1, 11, 118, 119)

    edged = cv2.Canny(gray1, 30, 200)

    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))

    closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel)

    (cnts, _) = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

  

  

 

  

  

    for c in cnts:

                    # approximate the contour

        area = cv2.contourArea(c)

        peri = cv2.arcLength(c, True)

        approx = cv2.approxPolyDP(c, 0.015 * peri, True)

        print('for içi')

        appsayi=len(approx)

      

 

      

    if appsayi == 4:

      

        screenCnt = approx

      

        print('Mermer Tespit Edildi')

        #cv2.imwrite("mamet.jpg",image)



      

        print('alan', area)

        area1=area*0.04285714

        cv2.drawContours(image, [screenCnt], -1, (0, 255, 0), 3)

      

        print("Program Basliyor ....-")

        key=input(print("1. Sinif Mermerleri Koyun ve 1 tusuna basin"))

        key=int(key)

      

        if  area>1000 & key==1:

            os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Bir")

            kaydet()

      

        print("birinci sinif mermer sayisi,", mermerSayi) 

        print("1. sinif mermerlerden 3 adet cekildi")

        key=input(print("2. Sinif Mermerleri Koyun ve 2 tusuna basin"))

        key=int(key)

        os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları")

      

        if  key==2:

            os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Iki")

            mermersayi=0

            kaydet()

      

        print("2. sinif mermer sayisi,", mermerSayi) 

        print("2. sinif mermerlerden 3 adet cekildi")

        key=input(print("3. Sinif Mermerleri Koyun ve 3 tusuna basin"))

        key=int(key)

        os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları")

      

        if   key==3:

            os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Uc")

            mermersayi=0

            kaydet()

          

      

  

      

      

      

      

      

    else:

        continue

  

 

    cv2.imshow("final", image)

    print("Resim Cekme tamlandı.")

    break

    if cv2.waitKey(25) & 0xFF==ord("q") :

        break

  

kamera.release()

cv2.destroyAllWindows()
 
Moderatör tarafında düzenlendi:
OpenCV kütüphanesini mi kullanıyorsun ?
 
if key==2:
os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Iki")
mermersayi=0
kaydet()

Bu şekilde bir kod gönderdiğinde kimsenin zahmet edip de yanıt yazacağını tahmin etmiyorum.

Python:
if key==2:
    os.chdir("C:\\Users\\90535\\Desktop\\PRojeprogramları\\Mermer_Fotograflari\\Iki")
    mermersayi=0
    kaydet()

    ''' 1- Kod buradan mı devam ediyor '''

''' 2 - Yoksa buradan mı? '''

Örneğin senin yazdığın kodu, kod bloğu içine almadan yazsaydım programın 1.yöne mi yoksa 2. yöne mi dallandığını diğerleri nasıl anlasın.

Sonra hata iletisini yazmazsan, insanların senin hatanı tahmin ederek mi cevap yazabileceklerini düşünüyorsun.
 
evet , biraz yeni olduğum için söylediklerinizi kaçırmışım.
kodu kopyala yapıştır yaptığım için de grintiler kaybolmuş ve kod dolayısı ile doğru gözükmüyor. Aşağıya ekran görüntüsü ekliyorum.
1.png


2.png



3.png

Programdaki amaç:yürüyen bir bantta mermer leri gördüğü zaman fotografını çeksin ve kaydetsin. klasörler dolduğunda(şuan için 3 seçildi), uyarı verip faklı klasöre geçsin.
Mevcut Programdaki hata:
Mermerleri bir dikdörtgen şekil olarak düşünüp eğer 4 adet köşesi var ise "mermer tespit edildi" olarak algıla fotograf çek diye yazdım programı .
Fakat Program kare şekilleri doğru algılayamıyor. Farklı bir flitre mi kullanmam gerek , yada farklı bir yol mu izlemem gerek aslında bunu soruyorum?
Teşekkürler
 
Moderatör tarafında düzenlendi:
O şekilde ekran görüntüsü de olmaz. Kodun tamamını göndermeye de gerek yok.

Sadece takıldığın noktayı özetleyen ama çalışan ufak bir kod örneği yeterli olacaktır.

İşte örnek bir soru. Konu başlığının sorunumuzu kısaca özetlemesi yerinde olacaktır. Soru başlıklarında ACİL, Yardım, Yandım gibi ifadelerden kaçınmak gerekir. Tamamen büyük harfle yazılmaz. Bu bağırmak anlamına gelir.

Örnek soru başlığı : Python Open CV kütüphanesi ile dikdörtgen şekil okuma
Python:
import cv2

gri = cv2.imread('dikdörtgenler.png', 0)
dönen, eşik = cv2.threshold(gri, 127, 255, 1)
hatlar, h = cv2.findContours(eşik, 1, 2)

for hat in hatlar:
    tahmin = cv2. approxPolyDP(hat, 0.01 * cv2.arcLength(hat,True),True)
    if len(tahmin) == 4:
        print ("dikdörtgen")

Yukarıda OpenCV kütüphanesi kullanan uygulama dikdörtgen şekilleri algılıyor. Ama tahminimden fazla sayıda dikdörtgen algılıyor. Sizce neden olabilir. Yardımlar için şimdiden teşekkürler.

Algılatmaya çalıştığım örnek resim dosyasını ekte gönderiyorum.

dikdörtgenler.png
 

Forum istatistikleri

Konular
128,171
Mesajlar
915,626
Kullanıcılar
449,935
Son üye
mehmetenessunger

Yeni konular

Geri
Üst