Quantcast
Channel: Raspberry Pi Forums
Viewing all articles
Browse latest Browse all 5010

Camera board • Re: Recording video using Picamera2 while other code running

$
0
0
Here's my new code implementing threading instead of multiprocessing:

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()
Output on console:

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%
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.

Statistics: Posted by sns123 — Mon Jul 08, 2024 2:21 pm



Viewing all articles
Browse latest Browse all 5010

Trending Articles