Normalde kod hata vermezken terminalden boot ile açılan python py dosyası hata kodu veriyor

Normalde ide’de py dosyasını çalıstırdığımda herhangi bir hata vermiyor python. Sorunsuz çalısıyor.
cron ile boot yapıp açılısta py dosyasını açmasını istediğimde hem opencv cascade arızası,hemde pygame mixer’de okunamayan ses dosyası var diyor çalısmıyor dediği ses dosyası çalısıyor.
Sorunu nasıl düzeltirim?

Asağıdaki linkten baktığıma göre belkilde girince dosya yolunu bulamıyor olabilir. Eğer bundansa kod içindeki tüm dosya path nasıl tanımlarım ?

https://answers.opencv.org/question/52340/opencv-error-assertion-failed-empty-in-detectmultiscale/

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/home/pi/robot/boot.py", line 487, in cam
    minSize=(int(minW), int(minH)),
cv2.error: OpenCV(4.1.1) /home/pi/opencv-python/opencv/modules/objdetect/src/cascadedetect.cpp:1689: error: (-215:Assertion failed) !empty() in function 'detectMultiScale'


Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python3.5/threading.py", line 914, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.5/threading.py", line 862, in run
    self._target(*self._args, **self._kwargs)
  File "/home/pi/robot/boot.py", line 437, in dinle
    pygame.mixer.music.load('beeplow.mp3')
pygame.error: Couldn't open 'beeplow.mp3'

minimum energy threshold 300
Set minimum energy threshold to 500
Dinliyorum...

Normal ide’de hata vermiyor hiç. hata sayfasını txt olarak belirledim görüntülemek için. raspberry boot olarak terminal’den otomatik çalıştırınca opencv’nin cascade yolunu görmediği görünüyor hatada.
faceCascade = cv2.CascadeClassifier(“haarcascade_frontalface_default.xml”)
bu kısım ve mixer.music.load(‘beeplow.mp3’) bu kısımdaki dosya yollarını bulamadığını söylüyor hatada.

Benim dosya yolum /home/pi/robot/ bu yolu hepsine tek tek eklesem olur mu ne dersiniz?

Yada tüm bu mp3, cascade xml vb. dosyalara kodun en başında dosyanın yolunu gösterme felan gibi kolay bir yol varsa çok iyi olur.

hata verince de hiç bir boot yönteminde devam etmiyor program.

https://www.tutorialspoint.com/python/os_chdir.htm

import os
 os.path.abspath(" /home/pi/robot/")

Bilmiyorum ama bu os kodu ve yukarıdaki bulma yolunu başa eklesem düzelir mi?

video_capture = cv2.VideoCapture(0)
video_capture.set(3,300)
video_capture.set(4,300)
minW = 0.1*video_capture.get(3)
minH = 0.1*video_capture.get(4)
font = cv2.FONT_HERSHEY_SIMPLEX
faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")

panServo = 305
tiltServo = 205
pwm.set_pwm(pan, 0, panServo)
def cam(panServo,tiltServo):
    while True:
        ret, img = video_capture.read()
        img = cv2.flip(img, +1)
        cv2.imwrite('sonyeniyuz.jpg', img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break   
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        faces = faceCascade.detectMultiScale(
            img,
            scaleFactor=1.1,
            minNeighbors=30,
            minSize=(10, 30)
            )
        for (x, y, w, h) in faces:
            cv2.rectangle(img, (x, y), (x+w, y+h), (225, 0, 0), 1)
            if x>=1 and x<=71:
                if tiltServo!=220:
                    panServo=panServo-1
                    pwm.set_pwm(pan, 0, panServo)
            elif x>=200 and x<=350:
                if tiltServo!=320:
                    panServo=panServo+1
                    pwm.set_pwm(pan, 0, panServo)
            if y>=1 and y<=80:
                if tiltServo!=255:
                    tiltServo = tiltServo+1
                    pwm.set_pwm(tilt, 0, tiltServo)
            elif y>=120 and y<=350:
                if tiltServo!=150:
                    tiltServo = tiltServo-1
                    pwm.set_pwm(tilt, 0, tiltServo)                    
        cv2.imshow('frame',img)
def dinle(sorgu):
    r = sr.Recognizer()
    r.energy_threshold = 1000
    r.pause_threshold = 1
    m = sr.Microphone(sample_rate = 16000,chunk_size = 19000)
    with m as source:
        r.adjust_for_ambient_noise(source, duration = 1)
        print("Dinliyorum...")
        if (sorgu =="komut"):
            mixer.music.load('beeplow.mp3')
            mixer.music.play()
        audio = r.listen(source)  
    try:
        response = str(r.recognize_google(audio, language="tr"))
        print("Sen dedin ki : '" + response + "'")
        if sorgu =="komut":
            komut(response)
        elif sorgu =="kaydet":
            rsx = sqlite3.connect('hafiza.db')
            rsx_cursorekle = rsx.cursor()
            rsx_sorgu = rsx_cursorekle.execute('SELECT id FROM taninankisiler ORDER BY id desc')
            veri = rsx_cursorekle.fetchall()
            for rsx in veri[0]:
                sonid = int(rsx)+1
                resimyoluson= str(sonid)
                db = sqlite3.connect("hafiza.db")
                cs = db.cursor()
                cs.execute("INSERT INTO taninankisiler(taninankisiadi,resimyolu) VALUES (?,?)",(response,resimyoluson))
                db.commit()
                facecrop("yeniyuz.jpg")          
    except sr.UnknownValueError:
        print("Seni duyamadım")
        if sorgu =="komut":
            dinle("komut")
        elif sorgu =="kaydet":
            response="Duyamadım, ismini tekrar söylermisin"
            return konus(response,"1")
    except sr.RequestError as e:
           response="İnternet bağlantımı kontrol et"
           konus(response)


if __name__ == "__main__": 
    t1 = multiprocessing.Process(target=cam(panServo,tiltServo))
    t2 = multiprocessing.Process(target=dinle("komut"))
    t1.start() 
    t2.start()

/ ile baslamayan path’ler CWD (current working directory)'ye goreceli olarak algilanir.

IDE’de calisirkenki CWD’ni gormek icin os.getcwd() kullanabilirsin. Buradan sonra “/home/pi/robot” oldugunu varsayiyorum.

Cozum 3 tane:

Dosya isimlerini absolute path olarak ver, i.e.: music.load('/home/pi/robot/beeplow.mp3')

Programin icinde CWD’yi degistir: os.chdir('/home/pi/robot')

Programi calistirmadan/calistirirken CWD’yi degistir. cron'un boyle bir mekanizmasi var miydi hatirlamiyorum ama yoksa env yardimci programini kullanabilirsin:
env -C /home/pi/robot -- <python bilmemne.py? komutun tamami>

1 Beğeni

Bilmem yardımı dokunur ama size bir şey göstermek belki işinize yarar.

>>> test = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
>>> test.load("haarcascade_frontalface_default.xml")
False
>>> test.load("/home/tanberk/.local/lib/python3.7/site-packages/cv2/data/haarcascade_frontalface_default.xml")
True

Benim merak ettiğim, acaba bir de böyle deneseniz sonuç ne olacak? Yani haarcascade_frontalface_default.xml dosyasının yolunu bu şekilde belirtince sorun tekrar oluşacak mı merak ediyorum.

1 Beğeni

Teşekkür ederim bunlardan biri olacaktır.

Yani bendeki tam uzun yolu bilmiyorum. Olur herhalde bir denerim. Teşekkür ederim.