إنها مشكلة معروفة في تدفقات RTSP والخوارزميات التي تستغرق وقتًا طويلاً مثل أطر التعلم العميق. ستنتهي عملية المزامنة إذا استغرقت معالجة الإطارات الفردية وقتًا أطول من معدل إطارات التدفق. هناك تأخير متزايد بين الواقع والصور الملتقطة.
هناك حلان محتملان لهذه المشكلة.
الكود يتحدث عن نفسه.
يمكنك إما استخدام GStreamer أو FFmpeg لفتح الدفق.
عادةً ما يتم ضغط تدفقات RTSP باستخدام H264. ولذلك فإن عملية إلغاء الضغط الخاصة بك حساسة لمشاكل التوقيت، مثل توقف المواضيع لبعض الوقت.
لتشغيل التطبيق عليك:
$ sudo apt-get install codeblocks
) استخدم فقط اتصال Ethernet سلكيًا لدفق RTSP الخاص بك. يمكن أن تكون شبكة Wi-Fi غير مستقرة.
نظرًا لأن بروتوكول RTSP حساس حتى لإطار واحد مفقود، فمن الممكن أن يتعطل الدفق بسهولة.
إذا كنت تستخدم الدفق في تطبيق التعلم العميق، فاضبط الدقة ومعدل الإطارات وفقًا لمتطلبات نموذج التعلم العميق.
ليس من الجيد إرسال دفق بدقة 1280 × 960 بمعدل 30 إطارًا في الثانية إذا كان النموذج الخاص بك يحتوي على إدخال 416 × 416 ويستغرق 200 مللي ثانية لمعالجة إطار واحد.
لا يتطلب الأمر سوى ذاكرة إضافية وقوة معالجة.
إذا كنت تريد دفق 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
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
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 ;
}