Here's my new code implementing threading instead of multiprocessing:Output on console:This output shows that the code is able to detect faces and execute the function for recording. Along with that, it successfully records the video and converts to mp4 locally.
HOWEVER, my code just freezes as it finishes, with no more console outputs, and the camera preview being frozen. In multiprocessing, I was able to force quit my process, but I'm not sure how todo it in this case. Please help.
Code:
import timeimport cv2import numpy as npfrom picamera2 import Picamera2from picamera2.encoders import H264Encoder, Qualityimport threadingimport osimport subprocess# Initialize Picamera2picam2 = Picamera2()video_config = picam2.create_preview_configuration(main={"size": (640, 480), "format": "RGB888"})picam2.configure(video_config)picam2.start()# Load the pre-trained face detection modelface_cascade = cv2.CascadeClassifier("/home/pi/Desktop/haarcascade_frontalface_default.xml")# Initialize frame count and start time for FPS calculationframe_count = 0start_time = time.time()#encodersencoder = H264Encoder()start_thread = True#video recorddef recvid():print("in func")picam2.start_recording(encoder, "/home/pi/Desktop/output.h264", quality=Quality.HIGH)print("started recording")time.sleep(5)print("finish delay")picam2.stop_recording()print("done")subprocess.run(["ffmpeg", "-y", "-i", "/home/pi/Desktop/output.h264", "-c:v", "copy", "/home/pi/Desktop/output.mp4"])#process.terminate()thread = threading.Thread(target=recvid)print("past")while True:# Capture imageframe = picam2.capture_array()# Detect facesfaces = face_cascade.detectMultiScale(frame, scaleFactor=1.1, minNeighbors=5)# Draw rectangles around the facesfor (x, y, w, h) in faces:print("detected")cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)if thread.is_alive() == False:thread.start()cv2.imwrite("/home/pi/Desktop/test.jpg", picam2.capture_array())# Calculate and display FPSframe_count += 1elapsed_time = time.time() - start_timefps = frame_count / elapsed_timecv2.putText(frame, f"FPS: {fps:.2f}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)# Display the framecv2.imshow('Face Recognition', frame)# Break the loop if 'q' is pressedif cv2.waitKey(1) & 0xFF == ord('q'):breakcv2.imwrite("/home/pi/Desktop/test.jpg", picam2.capture_array())thread.join()# Release resourcescv2.destroyAllWindows()picam2.stop()
Code:
detectedin funcstarted recordingdetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetecteddetectedfinish delaydetecteddoneffmpeg version 5.1.5-0+rpt1+deb12u1 Copyright (c) 2000-2024 the FFmpeg developers built with gcc 12 (Debian 12.2.0-14) configuration: --prefix=/usr --extra-version=0+rpt1+deb12u1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-stripping --disable-mmal --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sand --enable-sdl2 --disable-sndio --enable-libjxl --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-pocketsphinx --enable-librsvg --enable-libdc1394 --enable-libdrm --enable-vout-drm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-librav1e --enable-shared libavutil 57. 28.100 / 57. 28.100 libavcodec 59. 37.100 / 59. 37.100 libavformat 59. 27.100 / 59. 27.100 libavdevice 59. 7.100 / 59. 7.100 libavfilter 8. 44.100 / 8. 44.100 libswscale 6. 7.100 / 6. 7.100 libswresample 4. 7.100 / 4. 7.100 libpostproc 56. 6.100 / 56. 6.100Input #0, h264, from '/home/pi/Desktop/output.h264': Duration: N/A, bitrate: N/A Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(progressive), 640x480, 30 fps, 30 tbr, 1200k tbnOutput #0, mp4, to '/home/pi/Desktop/output.mp4': Metadata: encoder : Lavf59.27.100 Stream #0:0: Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(progressive), 640x480, q=2-31, 30 fps, 30 tbr, 1200k tbnStream mapping: Stream #0:0 -> #0:0 (copy)Press [q] to stop, [?] for help[mp4 @ 0x55559878eab0] Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code to set the timestamps properlyframe= 279 fps=0.0 q=-1.0 Lsize= 4554kB time=00:00:09.26 bitrate=4026.0kbits/s speed=1.29e+03x video:4550kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.082110%
HOWEVER, my code just freezes as it finishes, with no more console outputs, and the camera preview being frozen. In multiprocessing, I was able to force quit my process, but I'm not sure how todo it in this case. Please help.
Statistics: Posted by sns123 — Mon Jul 08, 2024 2:21 pm