เป็นปัญหาที่ทราบแล้วกับสตรีม RTSP และอัลกอริธึมที่ใช้เวลานาน เช่น เฟรมเวิร์กการเรียนรู้เชิงลึก คุณจะไม่ซิงค์กันหากแต่ละเฟรมใช้เวลานานกว่าอัตราเฟรมของสตรีมในการประมวลผล มีความล่าช้าเพิ่มขึ้นระหว่างความเป็นจริงกับภาพที่ถ่าย
มีวิธีแก้ไขปัญหานี้สองวิธีที่เป็นไปได้
รหัสพูดเพื่อตัวเอง คุณสามารถใช้ GStreamer ของ FFmpeg เพื่อเปิดสตรีมได้
ไม่จำกัดจำนวนกล้องที่เชื่อมต่อ อาจจะเป็นกล้องตัวเดียวก็ได้
อย่างไรก็ตาม ยิ่งมีกล้องมากเท่าไร ก็ยิ่งต้องใช้เวลา CPU มากขึ้นในการเยี่ยมชมเธรดที่แยกจากกันทั้งหมด
ในการเรียกใช้แอปพลิเคชัน คุณต้อง:
สร้างเส้นทางการ build และสร้างโปรเจ็กต์ด้วย cmake ดังนี้:
rm -rf build && mkdir -p build && cd build
cmake .. && make
หรือคุณสามารถสร้างโปรเจ็กต์โดยใช้ Code::Blocks ที่คุณต้องการติดตั้ง ( $ sudo apt-get install codeblocks
)
ใช้เฉพาะการเชื่อมต่ออีเทอร์เน็ต แบบมีสาย สำหรับสตรีม RTSP ของคุณ Wi-Fi อาจไม่เสถียร
เนื่องจากโปรโตคอล RTSP ไวต่อเฟรมที่ขาดหายไปแม้แต่เฟรมเดียว สตรีมจึงอาจเสียหายได้ง่าย
หากคุณกำลังใช้สตรีมในแอปการเรียนรู้เชิงลึก ให้ปรับความละเอียดและอัตราเฟรมของคุณตามความต้องการของโมเดลการเรียนรู้เชิงลึก
ไม่ใช่ความคิดที่ดีที่จะส่งสตรีม 1280x960 ที่ 30 FPS หากโมเดลของคุณมีอินพุต 416x416 และใช้เวลา 200 mSec ในการประมวลผลเฟรมเดียว มีค่าใช้จ่ายเพียงหน่วยความจำเพิ่มเติมและพลังการประมวลผลเท่านั้น
ตรวจสอบให้แน่ใจว่ากล้องทุกตัวมีความละเอียดเท่ากัน ในตัวอย่าง อัลกอริธึมการต่อ OpenCV จะไวต่อความละเอียดที่แตกต่างกัน มันจะส่งข้อยกเว้นเมื่อเผชิญกับความกว้างหรือความสูงที่แตกต่างกัน
โปรดทราบว่ากล้องจะไม่ซิงโครไนซ์กันตามเธรด อาจมีความล่าช้าต่างกันเล็กน้อย
หากคุณต้องการสตรีม UDP หรือ TCP ตรวจสอบให้แน่ใจว่าสตรีมใช้งานได้กับพรอมต์บรรทัดคำสั่งล่วงหน้า ถ้าไม่เช่นนั้น สิ่งเหล่านี้จะไม่ทำงานใน OpenCV อย่างแน่นอน ข้อผิดพลาดมักเกิดจากการเข้ารหัสในไปป์ไลน์ ที่อยู่ หรือโมดูลที่ขาดหายไป หากคุณต้องการติดตั้งโมดูล GStreamer เพิ่มเติม คุณจะต้องสร้าง OpenCV ของคุณใหม่ด้วย! สำหรับข้อมูลเพิ่มเติม โปรดดูที่เว็บไซต์ของเรา
หากต้องการเรียกใช้แอปพลิเคชันให้โหลดไฟล์โครงการ MultiThread.cbp ใน Code::Blocks
หากคุณใช้ Jetson Nano คุณต้องเปลี่ยนตำแหน่งที่ OpenCV เก็บไฟล์ส่วนหัวเป็น /usr/include/opencv4
ที่บรรทัดที่ 23 ใน main.cpp สตรีมถูกกำหนดไว้
Grb1->Init("rtsp://192.168.178.129:8554/test/");
Grb1->Init("udpsrc port=5200 ! application/x-rtp, media=video, clock-rate=90000, payload=96 ! rtpjpegdepay ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
ผู้ส่ง: RaspiCam พร้อม Raspberry Pi Buster OS
gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=192.168.178.84 port=5200
ผู้ส่ง: RaspiCam พร้อม Raspberry Pi Bullseye OS
gst-launch-1.0 -v libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! jpegenc ! rtpjpegpay ! udpsink host=192.168.178.84 port=5200
หมายเหตุ host=192.168.178.84
เป็นที่อยู่ IP ของผู้รับ
Grb1->Init("tcpclientsrc host=192.168.178.129 port=5000 ! jpegdec ! videoconvert ! appsink", cv::CAP_GSTREAMER);
ผู้ส่ง: RaspiCam พร้อม Raspberry Pi Buster OS
gst-launch-1.0 -v v4l2src device=/dev/video0 num-buffers=-1 ! video/x-raw,width=640,height=480, framerate=30/1 ! videoconvert ! jpegenc ! tcpserversink host=192.168.178.32 port=5000
ผู้ส่ง: RaspiCam พร้อม Raspberry Pi Bullseye OS
gst-launch-1.0 -v libcamerasrc ! video/x-raw,width=640,height=480, framerate=30/1 ! videoconvert ! jpegenc ! tcpserversink host=192.168.178.32 port=5000
หมายเหตุ host=192.168.178.32
เป็นที่อยู่ IP ของผู้ส่ง
Grb1->Init("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
Grb1->Init("v4l2src device=/dev/video0 ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
Grb1->Init(0);
Grb1->Init(0); //if RaspiCam is not connected
Grb2->Init(1); //if RaspiCam is connected