Почему мой код OpenCV работает на Ubuntu 18.04, но не работает в Raspberry Pi 3 на Raspbian? - PullRequest
0 голосов
/ 09 мая 2019

Я не профессионал, но пытаюсь научиться программировать на Python.Я ожидал сделать снимок, когда объект попадает в определенную строку, и создать папку с отметкой даты и времени;тогда я надеялся сохранить картинку в созданную папку.Этот код работает в Ubuntu 18.04, но не в RPi 3 с raspbian.В чем может быть проблема?

Я уже проверил код ошибки с выхода RPi.(на самом деле, я не мог хорошо понять проблему) Но я пока не смог найти правильного решения.Код ошибки:

Traceback (последний вызов был последним): файл "RPi_deneme.py", строка 201, в cv2.imwrite (os.path.join (cikisklasoru, img_name), Frame)Файл "/home/pi/.virtualenvs/cv/lib/python3.5/posixpath.py", строка> 89, в файле объединения genericpath._check_arg_types (файл 'join', a, * p) "/ home / pi /.virtualenvs / cv / lib / python3.5 / genericpath.py ", строка> 143, в _check_arg_types (funcname, s. class . name )) из None TypeError: join ()аргумент должен быть str или байтами, а не 'PosixPath'

код:

# -*- coding: utf-8 -*-
from imutils.video import VideoStream
from datetime import datetime
import errno
import math
import cv2
import numpy as np
import argparse
import imutils
from imutils.video import VideoStream
from picamera.array import PiRGBArray
from picamera import PiCamera
import time
from shutil import make_archive
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
import os
from pathlib import Path
import locale
    locale.setlocale(locale.LC_ALL, '')

    p1 = Path('/home/pi/Desktop/sayac/resim/giris')
    p1.mkdir(exist_ok=True)
    p2 = Path('/home/pi/Desktop/sayac/resim/cikis')
    p2.mkdir(exist_ok=True)





    # global degiskenler
    today = datetime.now()
    width = 0
    height = 0
    GirisSayisi = 0
    CikisSayisi = 0
    Zaman = datetime.now().strftime("%d %m %Y - %A")
    Saat = datetime.now().strftime("%I:%M:%S%p")
    bildiri1 = ' Sayım Saati:'
    bildiri2 = ' Sayım Saati:'
    img_counter = 0
    mincontur = 100  # Change these values according to your needs.
    binarizearalik = 90  # Change these values according to your needs.
    refaralikayar = 60  # Change these values according to your needs.


    # timeout = time.time() + 60*1  # şu andan itibaren 1 dakika sonra program kendini kapatır, test amaçlıdır.


    # Gözlenen yere objenin girişi kontrol ediliyor
    def GirisHattiTestEt(y, koorygiris, koorycikis):
        Absuzaklik = abs(y - koorygiris)

        if ((Absuzaklik <= 2) and (y < koorycikis)):
            return 1
        else:
            return 0


    # Gözlenen yerden objenin çıkışı kontrol ediliyor
    def CikisHattiTestEt(y, koorygiris, koorycikis):
        Absuzaklik = abs(y - koorycikis)

        if ((Absuzaklik <= 2) and (y > koorygiris)):
            return 1
        else:
            return 0


    #kamera tercihi, teknik duruma göre belirlenir

    # ap = argparse.ArgumentParser()
    # ap.add_argument("-p", "--picamera", type=int, default=-1,
    #        help="--picamera 1 eklemeyi unutmayin")
    # args = vars(ap.parse_args())


    # camera = VideoStream(usePiCamera=args["picamera"] > 0).start()
    camera = cv2.VideoCapture(0)
    time.sleep(2.0)

    # 640x480 çözünürlük ayarlanır
    camera.set(3, 640)
    camera.set(4, 480)

    ReferansFrame = None

    #doğru bir ölçüm için kamerayı biraz ısıtıp, çevre ışığına adapte etmek gerekir.
    # Yoksa çevrenin ışığı yüzünden farklı tanımlamalar gerçkleşebilir

    for i in range(0, 20):
        (grabbed, Frame) = camera.read()


    while True:


        # İlk Frame yakalanır ve büyüklük belirlenir.
        (grabbed, Frame) = camera.read()
        height = np.size(Frame, 0)
        width = np.size(Frame, 1)

        # Grey scale ve blur effect ile şekil kenarları alınır.
        FrameGray = cv2.cvtColor(Frame, cv2.COLOR_BGR2GRAY)
        FrameGray = cv2.GaussianBlur(FrameGray, (21, 21), 0)

        # iki imaj arasında karşılaştırma yapılır, eğer ilk imaj boş ise başlar.
        if ReferansFrame is None:
            ReferansFrame = FrameGray
            continue

        # başlangıç frame ile şu an ki imajın tam farkı alınır. (Background Subtraction)
        # Temizlenen arkaplan için binarizasyon yapılır.
        FrameDelta = cv2.absdiff(ReferansFrame, FrameGray)
        CerceveEsigi = cv2.threshold(FrameDelta, binarizearalik, 255, cv2.THRESH_BINARY)[1]

        # Bulunan şekillerdeki delikleri, beyaz bölgeleri ortadan kaldırmak için ikili çerçevenin açılmasını sağlar.,
        # Bu sayede tespit edilen nesneler siyah bir kütle olarak kabul edilir, ayrıca dilatasyondan sonra şekilleri bulur..
        CerceveEsigi = cv2.dilate(CerceveEsigi, None, iterations=2)
        _, cnts, _ = cv2.findContours(CerceveEsigi.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        kontursayisi = 0

        # Referans hatlar çizilir
        koorygiris = (height / 2) - refaralikayar
        koorycikis = (height / 2) + refaralikayar
        cv2.line(Frame, (0, int(koorygiris)), (width, int(koorygiris)), (255, 0, 0), 2)
        cv2.line(Frame, (0, int(koorycikis)), (width, int(koorycikis)), (0, 0, 255), 2)

        # Bulunan şekiller silinir
        for c in cnts:
            # Küçük objeler silinir.
            if cv2.contourArea(c) < mincontur:
                continue
        # Hata ayıklama amacıyla bulunan şekillerin sayısını sayar.
        kontursayisi = kontursayisi + 1

        # Şekil koordinatlarını (nesneyi içeren bir dikdörtgen), şeklini vurgulayarak alır.
        (x, y, w, h) = cv2.boundingRect(c)  # x e y: sol üst köşenin koordinatları
        # w ve h: dikdörtgenin sırasıyla genişlik ve yüksekliği

        cv2.rectangle(Frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

        # Şeklin merkez noktasını belirler ve daire içine alır.
        KoordinatXMerkezYuva = (x + x + w) / 2
        KoordinatYMerkezYuva = (y + y + h) / 2
        ObjeMerkezNokta = (int(KoordinatXMerkezYuva), int(KoordinatYMerkezYuva))
        cv2.circle(Frame, ObjeMerkezNokta, 1, (0, 0, 0), 5)

        # Girişler kontrol edilir, ve işlemler başlar.
        # Çizgiyi aşan obje sayıma girer
        if (GirisHattiTestEt(KoordinatYMerkezYuva, koorygiris, koorycikis)):
            GirisSayisi += 1
            cv2.putText(Frame, "Girisler: {}".format(str(GirisSayisi)), (10, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (250, 0, 1), 2)
            cv2.putText(Frame, datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
                (10, Frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 205, 0), 1)
            cv2.putText(Frame, "Cikislar: {}".format(str(CikisSayisi)), (10, 70),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            cv2.putText(Frame, ("Toplam obje: " + str(kontursayisi)), (450, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            total = (GirisSayisi) + (CikisSayisi)
            ###############################################################################################################
            # klasor olusturulma hatti
            girisklasoru = Path ('/home/pi/Desktop/sayac/resim/giris/' +Zaman)
            girisklasoru.mkdir(exist_ok=True)

            # klasorler olusur
            ###############################################################################################################
            print(total)
            img_counter += 1
            img_name = "İşlem Sayisi {}.png".format(str(img_counter)+bildiri1)
            cv2.imwrite(os.path.join(girisklasoru, img_name), Frame)
            print("{} ve (Saat) Basariyla Yazildi!".format(girisklasoru, img_name))
        #Çıkışlar kontrol edilir ve işlemler başlar
        if (CikisHattiTestEt(KoordinatYMerkezYuva, koorygiris, koorycikis)):
            CikisSayisi += 1
            cv2.putText(Frame, "Girisler: {}".format(str(GirisSayisi)), (10, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (250, 0, 1), 2)
            cv2.putText(Frame, datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
                (10, Frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 205, 0), 1)
            cv2.putText(Frame, "Cikislar: {}".format(str(CikisSayisi)), (10, 70),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            cv2.putText(Frame, ("Toplam obje: " + str(kontursayisi)), (450, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
            total = (GirisSayisi) + (CikisSayisi)

            ###############################################################################################################
            # klasor olusturulma hatti
            cikisklasoru = Path ('/home/pi/Desktop/sayac/resim/cikis/' +Zaman)
            cikisklasoru.mkdir(exist_ok=True)
            # klasorler olusur
            ###############################################################################################################
            print(total)
            img_counter += 1
            img_name = "İşlem Sayisi {}.png".format(str(img_counter)+bildiri2)
            CikisAdi = "Cikis {}".format(today.strftime('%d_%m_%Y'))
            cv2.imwrite(os.path.join(cikisklasoru, img_name), Frame)
            print("{} Basariyla Yazildi!".format(cikisklasoru, img_name))

        # GEREKTIGINDE TEST ICIN YENI PENCERE ACILIR.
        # cv2.imshow("Binarize Cerceve", CerceveEsigi)
        # cv2.waitKey(1);
        # cv2.imshow("Arkaplansiz Cerceve", FrameDelta)
        # cv2.waitKey(1);

        print("Gorulen Toplam Obje: " + str(kontursayisi))

        #Belirtilen alanda meydana gelen olaylar ekrana yazılır.
        cv2.putText(Frame, "Girisler: {}".format(str(GirisSayisi)), (10, 50),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (250, 0, 1), 2)
        cv2.putText(Frame, datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
            (10, Frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 205, 0), 1)
        cv2.putText(Frame, "Cikislar: {}".format(str(CikisSayisi)), (10, 70),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        cv2.putText(Frame, ("Toplam obje: " + str(kontursayisi)), (450, 50),
            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 255), 2)
        total = (GirisSayisi) + (CikisSayisi)
            cv2.imshow("Sayim Ekrani", Frame)
    key = cv2.waitKey(1) & 0xFF

    # Burada "Q" tuşu ile quit komutu verilir ve program kapanır.
    if key == ord("q"):
         break

    # Sahneyi boşalt, kamerayı temizle, pncereleri kapat.

Я ожидаю сохранения файлов в созданных папках отметок времени и даты.Каждый файл имеет счетчик, такой как «файл 1», «файл 2» и т. Д. Эти файлы должны быть сохранены в определенных папках, созданных в метке даты и времени.

Я ожидаю сохранить файлы в дату созданияпапок времениКаждый файл имеет счетчик, такой как «имя файла 1», «имя файла 2» и т. Д. Эти файлы должны быть сохранены в определенных папках, созданных в метке даты и времени.

...