เป็นปัญหาที่ทราบแล้วกับสตรีม RTSP และอัลกอริธึมที่ใช้เวลานาน เช่น เฟรมเวิร์กการเรียนรู้เชิงลึก คุณจะไม่ซิงค์กันหากแต่ละเฟรมใช้เวลานานกว่าอัตราเฟรมของสตรีมในการประมวลผล มีความล่าช้าเพิ่มขึ้นระหว่างความเป็นจริงกับภาพที่ถ่าย
มีวิธีแก้ไขปัญหานี้สองวิธีที่เป็นไปได้
รหัสพูดเพื่อตัวเอง
คุณสามารถใช้ GStreamer หรือ FFmpeg เพื่อเปิดสตรีมได้
สตรีม RTSP มักจะถูกบีบอัดด้วย H264 ดังนั้นการบีบอัดข้อมูลของคุณจึงมีความอ่อนไหวต่อปัญหาด้านเวลา เช่น เธรดหยุดทำงานเป็นระยะเวลาหนึ่ง
ในการเรียกใช้แอปพลิเคชัน คุณต้อง:
$ sudo apt-get install codeblocks
) ใช้เฉพาะการเชื่อมต่ออีเทอร์เน็ต แบบมีสาย สำหรับสตรีม RTSP ของคุณ Wi-Fi อาจไม่เสถียร
เนื่องจากโปรโตคอล RTSP ไวต่อเฟรมที่ขาดหายไปแม้แต่เฟรมเดียว สตรีมจึงอาจเสียหายได้ง่าย
หากคุณกำลังใช้สตรีมในแอปการเรียนรู้เชิงลึก ให้ปรับความละเอียดและอัตราเฟรมของคุณตามความต้องการของโมเดลการเรียนรู้เชิงลึก
ไม่ใช่ความคิดที่ดีที่จะส่งสตรีม 1280x960 ที่ 30 FPS หากโมเดลของคุณมีอินพุต 416x416 และใช้เวลา 200 mSec ในการประมวลผลเฟรมเดียว
มีค่าใช้จ่ายเพียงหน่วยความจำเพิ่มเติมและพลังการประมวลผลเท่านั้น
หากคุณต้องการสตรีม UDP หรือ TCP ต้องแน่ใจว่าสตรีมใช้งานได้กับพรอมต์บรรทัดคำสั่งล่วงหน้า ถ้าไม่เช่นนั้น สิ่งเหล่านี้จะไม่ทำงานใน OpenCV อย่างแน่นอน ข้อผิดพลาดมักเกิดจากการเข้ารหัสในไปป์ไลน์ ที่อยู่ หรือโมดูลที่ขาดหายไป หากคุณต้องการติดตั้งโมดูล GStreamer เพิ่มเติม คุณจะต้องสร้าง OpenCV ของคุณใหม่ด้วย! สำหรับข้อมูลเพิ่มเติม โปรดดูที่เว็บไซต์ของเรา
หากต้องการเรียกใช้แอปพลิเคชัน ให้โหลดไฟล์โครงการ RTSPcam.cbp ใน Code::Blocks
หากคุณใช้ Jetson Nano คุณต้องเปลี่ยนตำแหน่งที่ OpenCV เก็บไฟล์ส่วนหัวเป็น /usr/include/opencv4
ที่บรรทัดที่ 16 ใน main.cpp สตรีมจะเปิดขึ้น
cam.Open("rtsp://192.168.178.129:8554/test/");
cam.Open("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 ของผู้รับ
cam.Open("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 ของผู้ส่ง
cam.Open("libcamerasrc ! video/x-raw, width=640, height=480, framerate=30/1 ! videoconvert ! videoscale ! video/x-raw, width=640, height=480 ! appsink", cv::CAP_GSTREAMER);
cam.Open("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);
cam.Open(0);
cam.Open(0); //if RaspiCam is not connected
cam.Open(1); //if RaspiCam is connected
cam.Open("James.mp4");
cam.Open("/home/pi/Pictures/Plants");
cam.Open("/home/pi/Pictures/Garden.jpg");
int main ()
{
cv::Mat frame;
RTSPcam cam;
cv::namedWindow ( " Camera " , cv::WINDOW_AUTOSIZE);
cam. Open ( " rtsp://192.168.178.129:8554/test/ " ); // you can dump anything OpenCV eats. (cv::CAP_ANY) BTW,OpenCV first tries FFmpeg
while ( true )
{
if (!cam. GetLatestFrame (frame)){
cout << " Capture read error " << endl;
break ;
}
// place here your time consuming algorithms
// cout << cam.CurrentFileName << endl;
// show frame
cv::imshow ( " Camera " ,frame);
char esc = cv::waitKey ( 2 );
if (esc == 27 ) break ;
}
cv::destroyAllWindows () ;
return 0 ;
}