يوضح هذا المشروع كيفية تلقي الصور من هذه الكاميرا ومعالجتها في الصور والأفلام الثابتة باستخدام OpenCV و FFMPEG على Ubuntu 20.04 تشغيل على طراز Raspberry Pi Model 4B. ترسل الكاميرا رسالة JSON التالية عبر HTTP Post:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}تهبط بيانات البطارية في الجزء العلوي من صفحة تصفح الصور.

لمزيد من المعلومات حول هذه الصفحة ، راجع مشروع إعدادات الكاميرا. يتم استخدام بقية البيانات لمعالجة حمولة value . (لقد تم تمييزه للإيجاز. تخيل سلسلة مشفرة طويلة جدًا في مكانها.) يخبرنا حقل name الكاميرا التي أرسلت البيانات. إذا كان لديك العديد من الكاميرات ، فما عليك سوى إعطائها أسماء مميزة وسيكون كل شيء على ما يرام. تتيح لنا عداد frames معرفة ما إذا كان ينبغي لنا أن نتوقع JPEG واحد أو مضاعفات. تم ترقيم الإطارات من الصفر ، لذا فإن 0 إطارات تعطي صورة واحدة. إذا حصلنا على مضاعفات ، فنحن نقوم بتفكيكها ونطلبها حسب رقم الإطار. إذا حصلنا على القيمة المحجوزة البالغة 255 التي تخبرنا أننا تلقينا فيلم AVI/MJPEG. إذا كان يمر بالرقم السحري والتحقق من صحة FFMPEG ، فنحن نحوله إلى MP4 وحفظه كفيلم. إذا لم يكن الأمر كذلك ، فنحن نحاول توفير أكبر عدد ممكن من الإطارات والتراجع إلى حفظ الصور المرقمة. راجع mjpeg_utils::save_avi_frames لمعرفة كيفية استخدام FFMPEG داخل OpenCV لإنجاز كل معالجة الصور هذه.
قمت بمراجعة المشروع للبناء مباشرة على Ubuntu 20.04 (64 بت) لنموذج Raspberry Pi 4B. إذا كنت مهتمًا بالنسخة السابقة التي استخدمت Raspberry Pi OS (AKA Raspbian) الوصول إلى المستودع في Commice 511C7B8
إذا لم تقم بالفعل:
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake من المعروف على نطاق واسع أن الجزء الأصعب من استخدام OpenCV هو الحصول عليها وتبعياتها مثبتة. بمجرد أن تتخطى أنه من دواعي سروري استخدامه. لقد قمت ببناء هذا المشروع على طراز Raspberry Pi Model 4B الذي يدير أحدث (أكتوبر 2020) Ubuntu 20.04 64 بت. لقد فعلت ذلك لأنني أردت أن يكون المشروع متاحًا لمن لديهم ميزانية محدودة. PI معقولة معقولة ولديه أكثر من القدرة الكافية للمهام في متناول اليد. ومع ذلك ، إذا كان لديك إمكانية الوصول إلى جهاز كمبيوتر محمول يعمل Ubuntu ، فقد تجد هذا خيارًا أفضل. لبدء المبنى ، قم بتثبيت Clang 9. راجع للشغل: قد تميل إلى البناء باستخدام GCC ؛ إذا حصلت عليه للعمل ، فأنت أفضل مني. بعد ذلك ، قم بتثبيت OpenCV وهو تبعيات. أخيرًا ، قم بتشغيل cmake بالطريقة المعتادة في مجلد جذر المشروع.
كما الجذر ، افعل ما يلي ؛
/usr/lib/cgi-bin/ إذا قمت بإعادة تسمية المشروع في cmakelists.txt سيكون للثنائي اسمًا جديدًا أيضًا. تأكد من عكس هذا الاسم في HTTP_HOST_URL في منصة مشروع الكاميرا.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf وأضف Listen 4444 على سطر أدناه Listen 80 وحفظ الملف. -1. كجذر ، open /etc/apache2/sites-available/000-default.conf ولصق ما يلي في أسفل علامة الإغلاق </VirtualHost> .
<VirtualHost *:4444>
<Directory /var/www/html/motion_camera>
Options +Indexes
AddType image/svg+xml svg svgz
AddEncoding gzip svgz
<IfModule mod_autoindex.c>
IndexOptions IgnoreCase FancyIndexing HTMLTable SuppressHTMLPreamble FoldersFirst VersionSort NameWidth=* DescriptionWidth=* XHTML IconHeight=16 IconWidth=16
IndexIgnore ..
IndexOrderDefault Descending Name
IndexStyleSheet ./fancy-index/style.css
HeaderName ./fancy-index/header.html
ReadmeName ./fancy-index/footer.html
# IGNORE THESE FILES
IndexIgnoreReset ON
IndexIgnore fancy-index
# DEFAULT ICON
DefaultIcon ./fancy-index/icons/file-text.svg
AddIcon ./fancy-index/icons/back.svg ..
AddIcon ./fancy-index/icons/file-directory.svg ^^DIRECTORY^^
# https://github.com/file-icons/source
AddIcon ./fancy-index/icons/file-media.svg .jpg .jpeg
AddIcon ./fancy-index/icons/Video.svg .avi .mp4
# https://upload.wikimedia.org/wikipedia/commons/d/da/Battery-303889.svg
AddIcon ./fancy-index/icons/battery.svg .pwr
AddDescription "MPEG Layer 4 Format" .mp4
AddDescription "Joint Photographics Experts Group" .jpg .jpeg .jpe .jfif
AddDescription "Audio Video Interleave - Motion JPEG" .avi
AddDescription "Camera battery power available" .pwr
</IfModule>
</Directory>
</VirtualHost>
-2. كجذر ، قم بعمل الدليل /var/www/html/motion_camera ونسخ محتويات مجلد Web_root لهذا المشروع فيه.
-3. إصلاح الملكية والمجموعة والأذونات.
sudo mkdir /var/www/html/motion_camera
cd /var/www/html/motion_camera
sudo chown -R www-data:www-data
sudo find . -type f -exec chmod 0644 {} ;
sudo find . -type d -exec chmod 0755 {} ; -4. عند الانتهاء /var/www/html/motion_camera سوف تحتوي على:
ls -al /var/www/html/motion_camera/fancy-index/
total 72
drwxr-xr-x 3 www-data www-data 4096 Jun 9 09:37 .
drwxr-xr-x 3 www-data www-data 40960 Jun 15 09:06 ..
-rw-r--r-- 1 www-data www-data 66 Jun 5 15:53 footer.html
-rw-r--r-- 1 www-data www-data 295 Jun 5 16:05 header.html
drwxr-xr-x 2 www-data www-data 4096 Jun 8 15:35 icons
-rw-r--r-- 1 www-data www-data 6322 Jun 8 15:48 script.js
-rw-r--r-- 1 www-data www-data 3170 Jun 9 09:37 style.css-5. يمكنك الآن اختبار التكوين عن طريق توجيه متصفحك إلى http: // your_server: 4444/motion_camera
أحد الأشياء المفيدة حول تصميم واجهة CGI هو أنه يجب كتابة جميع رسائل الخطأ إلى دفق الخطأ القياسي ؛ stderr . يكتب خادم الويب هذه في سجل الخطأ الخاص به ؛ /var/log/apache2/error.log . إذا واجه هذا CGI خطأ ، فسوف يكتب رسالة مفيدة حول هذا الملف. لإيقاف تشغيل هذا الإخراج تحرير debug_output.hpp والتعليق على DEBUG_OUTPUT
بالتأكيد لا. يتم دعم معيار واجهة CGI من قبل العديد من خوادم HTTP المختلفة. يجب أن تواجه صعوبة ضئيلة في تكييف هذا المشروع للعمل مع خادم الويب الذي اخترته.
هناك أيضًا أدوات قد تجدها مفيدة لك في مشاريع أخرى. على سبيل المثال؛
std::map<std::string, std::vector<std::string>> من هذا يمكنك إنشاء مشروع يتولى html الحصول على طلبات.std::map<std::string, std::vector<std::string>> - واحدة للمتغيرات والآخر للملفات. من هذا ، يمكنك إنشاء مشروع حيث يتم استخدام النماذج للتحكم في نظام روبوت/مضمن أو Raspberry Pi. لمساعدتك في البدء ، يوجد نموذج HTML من كل شيء-لكنك. قم بتحرير علامة <form> في الجزء العلوي وقم بتغيير سمة action لتعكس اسم الخادم الخاص بك. إذا وجدت خطأ ، يرجى إنشاء مشكلة. إذا كنت ترغب في المساهمة ، فيرجى إرسال طلب سحب.
لقد استخدمت doxygen لإنشاء وثائق المشروع. يمكنك قراءتها هنا.
فيما يلي مراجع مفيدة في تطوير هذا المشروع.