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