# ====================================================================
# DISCLAIMER:
# This code is provided as-is for educational and experimental
# purposes only. The author makes no representations or warranties of
# any kind concerning the safety, suitability, or accuracy of this
# code. Use at your own risk. The author assumes no liability for any
# damages, system failures, security breaches, or network issues
# resulting from the use or implementation of this script.
# ====================================================================
import cv2
import time
from picamera2 import Picamera2
import threading
from queue import Queue
from fusion_hat.stt import STT
stt = STT('en-us')
commandQ = Queue()
mainCam = 'camera one'
W=1280
H=720
tStart = time.time()
fps = 0
RES = (W,H)
piCam1 = Picamera2(0)
piCam1.preview_configuration.main.size = RES
piCam1.preview_configuration.main.format = "RGB888"
piCam1.preview_configuration.controls.FrameRate=60
piCam1.preview_configuration.align()
piCam1.configure("preview")
piCam1.start()
piCam2 = Picamera2(1)
piCam2.preview_configuration.main.size = RES
piCam2.preview_configuration.main.format = "RGB888"
piCam2.preview_configuration.controls.FrameRate=60
piCam2.preview_configuration.align()
piCam2.configure("preview")
piCam2.start()
usbCam1 = cv2.VideoCapture(16)
usbCam1.set(cv2.CAP_PROP_FRAME_WIDTH,W)
usbCam1.set(cv2.CAP_PROP_FRAME_HEIGHT,H)
usbCam1.set(cv2.CAP_PROP_FPS, 30)
usbCam2 = cv2.VideoCapture(18)
usbCam2.set(cv2.CAP_PROP_FRAME_WIDTH,W)
usbCam2.set(cv2.CAP_PROP_FRAME_HEIGHT,H)
usbCam2.set(cv2.CAP_PROP_FPS, 30)
textLowerLeft = (int(W*.01),int(H*.05))
fontFace = cv2.FONT_HERSHEY_SIMPLEX
fontThickness = int(W/425)
fontScale = H*.0015
fontColor = (0,0,255)
running = True
def getCamera():
print('Voice Thread Started')
global running
while running:
myCamera = stt.listen(stream = False)
myCamera = myCamera.strip()
print(myCamera)
if myCamera == 'quit':
print('Security Camera Offline')
running = False
break
commandQ.put(myCamera)
print('Thread Terminated')
cameraThread = threading.Thread(target = getCamera,daemon=True)
cameraThread.start()
cv2.namedWindow('Main Camera',cv2.WINDOW_GUI_NORMAL)
cv2.moveWindow('Main Camera',0,65)
cv2.resizeWindow('Main Camera',W,H)
cv2.namedWindow('Camera1',cv2.WINDOW_GUI_NORMAL)
cv2.moveWindow('Camera1',0,H)
cv2.resizeWindow('Camera1',int(W/4),int(H/4))
cv2.namedWindow('Camera2',cv2.WINDOW_GUI_NORMAL)
cv2.moveWindow('Camera2',int(W/4),H)
cv2.resizeWindow('Camera2',int(W/4),int(H/4))
cv2.namedWindow('Camera3',cv2.WINDOW_GUI_NORMAL)
cv2.moveWindow('Camera3',2*int(W/4),H)
cv2.resizeWindow('Camera3',int(W/4),int(H/4))
cv2.namedWindow('Camera4',cv2.WINDOW_GUI_NORMAL)
cv2.moveWindow('Camera4',3*int(W/4),H)
cv2.resizeWindow('Camera4',int(W/4),int(H/4))
while running:
deltaT = time.time() - tStart
tStart=time.time()
fps = fps*.95 + (1/deltaT)*.05
frame1= piCam1.capture_array()
#frame1=cv2.flip(frame1,-1)
frame2= piCam2.capture_array()
frame2=cv2.flip(frame2,-1)
_ , frame3 = usbCam1.read()
_ , frame4 = usbCam2.read()
mainFrame = frame1
if commandQ.empty() == False:
mainCam = commandQ.get()
if mainCam == 'camera one':
mainFrame = frame1
if mainCam == 'camera two' or mainCam == 'camera to' or mainCam == 'camera too':
mainFrame = frame2
if mainCam == 'camera three':
mainFrame = frame3
if mainCam == 'camera four' or mainCam == 'camera for':
mainFrame = frame4
myText = "FPS: "+str(round(fps,1))
cv2.putText(frame1,myText,textLowerLeft,fontFace,fontScale,fontColor,fontThickness)
cv2.imshow("Main Camera", mainFrame)
cv2.imshow("Camera1", frame1)
cv2.imshow("Camera2", frame2)
cv2.imshow("Camera3", frame3)
cv2.imshow("Camera4", frame4)
if cv2.waitKey(1)==ord('q'):
break
cv2.destroyAllWindows()
print('Program Terminated')