为什么我的OpenCV代码可以在ubuntu18.04上运行,而不能在Raspbian上的Raspberry Pi 3上运行?

2024-09-26 22:54:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我不是专业人士,但正在努力学习python编程。当一个对象出现在一个特定的行上时,我希望拍摄一个快照并创建一个日期时间戳文件夹;然后我希望把照片保存到创建的文件夹中。这段代码在ubuntu18.04中运行,但在带有raspbian的rpi3中不起作用。可能有什么问题

我已经检查了RPi输出的错误代码(事实上,我不能很好地理解这个问题),但到目前为止我还没有找到一个合适的解决办法。错误代码是:

Traceback (most recent call last): File "RPi_deneme.py", line 201, in cv2.imwrite(os.path.join(cikisklasoru, img_name), Frame) File "/home/pi/.virtualenvs/cv/lib/python3.5/posixpath.py", line >89, in join genericpath._check_arg_types('join', a, *p) File "/home/pi/.virtualenvs/cv/lib/python3.5/genericpath.py", line >143, in _check_arg_types (funcname, s.class.name)) from None TypeError: join() argument must be str or bytes, not '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”等。这些文件应保存在日期时间戳中创建的特定文件夹中


Tags: infromimportformatimgvecv2frame

热门问题