我不是专业人士,但尝试学习python编程。我期望当对象出现在特定行上时创建快照,并创建一个日期时间戳文件夹。然后我希望将图片保存到创建的文件夹中。该代码在Ubuntu 18.04中有效,但在带有raspbian的RPi 3中无效。可能是什么问题?
我已经检查了RPi输出中的错误代码。 (实际上,我无法很好地理解问题),但是到目前为止,我还没有找到合适的解决方案。错误代码为:
回溯(最近通话最近): 文件“ RPi_deneme.py”,第201行,在 cv2.imwrite(os.path.join(cikisklasoru,img_name),框架) 连接中的文件“ /home/pi/.virtualenvs/cv/lib/python3.5/posixpath.py”,行> 89 genericpath._check_arg_types('join',a,* p) _check_arg_types中的文件“ /home/pi/.virtualenvs/cv/lib/python3.5/genericpath.py”,行> 143 (功能名称,s。类。名称)) 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”等。这些文件应保存在日期时间戳中创建的特定文件夹中。