0

I am not a professional but trying to learn python programming. I was expecting to take a snapshot when an object comes on a specific line and create a date-time stamp folder; then I was hoping to save the picture into the created folder. This code is working in Ubuntu 18.04 but not in RPi 3 with raspbian. What's the problem might be?

I have already checked the error code from RPi output. (actually, I couldn't understand the problem well) But I couldn't find a proper solution so far. The error code was:

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'

the code:

# -*- 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.

I expect to save files into the created date-time stamp folders. Each file has a counter like "file 1", "file 2" etc. those files should be saved in particular folders that were created in the date-time stamp.

I expect to save files into the created date-time stamp folders. Each file has a counter like "filename 1", "filename 2" etc. those files should be saved in particular folders that were created in the date-time stamp.

Konrul
  • 3
  • 1
  • 1
    When you post a question try to use a minimal version which causes the same error... not the whole code with comments in other languages, this may help you get an answer faster. The error is telling you that you cannot pass a `PosixPath` to os.join (maybe another version of the library/python?) try to cast it to string `str(path)` – api55 May 09 '19 at 12:02
  • Thank you for your advice I will care about your points. I am new here and trying to learn how things are work. On the other hand, I couldn't understand well for your solution. How can I use string for the path? – Konrul May 09 '19 at 20:27
  • I have found a solution which is working for date-time stamp folder creation, thanks to this post: https://stackoverflow.com/a/45319148/11433222 however, now I can't save captured images into the created folders. the new code is like this: cv2.imwrite(str(os.path.join('cikisklasoru', img_name)), Frame) but this code save files in same directory with py file not the specific folder... – Konrul May 09 '19 at 22:15

0 Answers0