如何 运行 两个 python3 文件使用相同的 Raspberry Pi 相机
How to run two python3 file with both file using the same Raspberry Pi Camera
我有两个python3文件
#1 口罩识别(深度学习)
#2 二维码扫描仪(机器学习)
我正在使用 Raspberry Pi 3 B+ 和 8 MP 单 Pi Cam
这两个程序没有任何联系,但是我需要同时运行这两个程序来检测是否有人掩饰并扫描用户的二维码
问题是我在 pi camera 上发现了冲突,因为我只为两个不同的程序使用了一个 pi camera。另外,面罩使用视频流,而 QR 扫描使用视频捕获。
希望有人能帮助我解决 pi 相机与使用它的两个 python3 文件冲突的问题。
下面是我的代码:
#1 基于Github
的口罩识别
#2 二维码扫描仪
import cv2
import re
from time import time
import datetime
import board
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
def sw1Pressed():
global sw1Press
sw1Press = True
sw1.when_pressed = sw1Pressed
sw1Press = False
print("Press SW1 to scan.")
while True:
if sw1Press == True:
led.toggle()
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
if bbox is not None:
for i in range(len(bbox)):
cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
0, 0), thickness=2)
cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 0), 2)
if data:
sw1Press = False
data = data.split(",")
print("ID: " + data[0])
print("NAME: " + data[1])
print()
userScanned = False
with open('XXX.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
if row["ID"] == data[0]:
buzzer.beep(0.1, 0.1, 1)
userScanned = True
if userScanned == False:
buzzer.beep(0.1, 0.1, 2)
with open('XXX.csv', 'a') as csvfile:
fieldNames = ['ID', 'NAME']
writer = csv.DictWriter(csvfile, fieldnames=fieldNames)
writer.writerow({'ID': data[0], 'NAME': data[1]})
currentTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("Date & Time: {}".format(currentTime))
print()
data = {
'ID' : data[0],
'NAME' : data[1],
'TIME' : currentTime,
}
cv2.imshow("code detector", img)
else:
cap.read()
cv2.destroyAllWindows()
if cv2.waitKey(1) == ord("q"):
break
led.off()
cap.release()
cv2.destroyAllWindows()
运行 一个程序(或线程)连续读取相机并将图片存储在两个客户端(面具和 QR)可以读取的地方。
实际上可以是:
- 一个程序有 3 个线程,一个线程从相机读取到共享的 Numpy 数组,两个线程从共享数组读取,或者
- 三个程序,一个将图像读取到 Python v3.8 multiprocessing shared memory 中,两个程序附加到该共享内存以读取帧
- 三个程序,可能在不同的机器上,一个从摄像头读取帧并丢进Redis,另外两个从Redis[=21读取帧=]
我有两个python3文件
#1 口罩识别(深度学习)
#2 二维码扫描仪(机器学习)
我正在使用 Raspberry Pi 3 B+ 和 8 MP 单 Pi Cam
这两个程序没有任何联系,但是我需要同时运行这两个程序来检测是否有人掩饰并扫描用户的二维码
问题是我在 pi camera 上发现了冲突,因为我只为两个不同的程序使用了一个 pi camera。另外,面罩使用视频流,而 QR 扫描使用视频捕获。
希望有人能帮助我解决 pi 相机与使用它的两个 python3 文件冲突的问题。
下面是我的代码:
#1 基于Github
的口罩识别#2 二维码扫描仪
import cv2
import re
from time import time
import datetime
import board
cap = cv2.VideoCapture(0)
detector = cv2.QRCodeDetector()
def sw1Pressed():
global sw1Press
sw1Press = True
sw1.when_pressed = sw1Pressed
sw1Press = False
print("Press SW1 to scan.")
while True:
if sw1Press == True:
led.toggle()
_, img = cap.read()
data, bbox, _ = detector.detectAndDecode(img)
if bbox is not None:
for i in range(len(bbox)):
cv2.line(img, tuple(bbox[i][0]), tuple(bbox[(i+1) % len(bbox)][0]), color=(255,
0, 0), thickness=2)
cv2.putText(img, data, (int(bbox[0][0][0]), int(bbox[0][0][1]) - 10), cv2.FONT_HERSHEY_SIMPLEX,
0.5, (0, 255, 0), 2)
if data:
sw1Press = False
data = data.split(",")
print("ID: " + data[0])
print("NAME: " + data[1])
print()
userScanned = False
with open('XXX.csv') as csvfile:
reader = csv.DictReader(csvfile)
for row in reader:
if row["ID"] == data[0]:
buzzer.beep(0.1, 0.1, 1)
userScanned = True
if userScanned == False:
buzzer.beep(0.1, 0.1, 2)
with open('XXX.csv', 'a') as csvfile:
fieldNames = ['ID', 'NAME']
writer = csv.DictWriter(csvfile, fieldnames=fieldNames)
writer.writerow({'ID': data[0], 'NAME': data[1]})
currentTime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
print("Date & Time: {}".format(currentTime))
print()
data = {
'ID' : data[0],
'NAME' : data[1],
'TIME' : currentTime,
}
cv2.imshow("code detector", img)
else:
cap.read()
cv2.destroyAllWindows()
if cv2.waitKey(1) == ord("q"):
break
led.off()
cap.release()
cv2.destroyAllWindows()
运行 一个程序(或线程)连续读取相机并将图片存储在两个客户端(面具和 QR)可以读取的地方。
实际上可以是:
- 一个程序有 3 个线程,一个线程从相机读取到共享的 Numpy 数组,两个线程从共享数组读取,或者
- 三个程序,一个将图像读取到 Python v3.8 multiprocessing shared memory 中,两个程序附加到该共享内存以读取帧
- 三个程序,可能在不同的机器上,一个从摄像头读取帧并丢进Redis,另外两个从Redis[=21读取帧=]