Proyek ini menunjukkan cara menerima gambar dari kamera ini dan memprosesnya menjadi gambar dan film menggunakan OpenCV dan FFMPEG di Ubuntu 20.04 yang berjalan pada Raspberry Pi Model 4B. Kamera mengirimkan pesan JSON berikut melalui posting HTTP:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}Data baterai mendarat di bagian atas halaman penelusuran gambar.

Untuk informasi lebih lanjut tentang halaman ini, lihat proyek Pengaturan Kamera. Sisa data digunakan untuk memproses muatan value . name Jika Anda memiliki banyak kamera, cukup beri mereka nama yang berbeda dan semuanya akan baik -baik saja. Penghitung frames memberi tahu kami jika kami harus mengharapkan JPEG atau kelipatan tunggal. Bingkai diberi nomor dari nol jadi 0 frame menghasilkan satu gambar. Jika kami mendapatkan kelipatan, kami memisahkannya dan memesannya berdasarkan bingkai nomor. Jika kami mendapatkan nilai 255 yang dicadangkan yang memberi tahu kami bahwa kami telah menerima film AVI/MJPEG. Jika melewati Nomor Ajaib dan validasi FFMPEG, kami mengonversinya ke MP4 dan menyimpannya sebagai film. Jika tidak, kami berusaha menyimpan bingkai sebanyak mungkin dan mundur untuk menyimpan gambar bernomor bingkai. Lihat mjpeg_utils::save_avi_frames untuk bagaimana ffmpeg digunakan dalam opencv untuk menyelesaikan semua pemrosesan gambar ini.
Saya merevisi proyek untuk membangun langsung di Ubuntu 20.04 (64 bit) untuk Raspberry Pi Model 4B. Jika Anda tertarik dengan versi sebelumnya yang menggunakan Raspberry Pi Os (alias Raspbian) Akses Repositori di Commit 511c7b8
Jika Anda belum:
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake Diketahui secara luas bahwa bagian tersulit dari menggunakan OpenCV adalah mendapatkannya dan ketergantungannya terpasang. Setelah Anda melewati, menyenangkan untuk digunakan. Saya membangun proyek ini di Raspberry Pi Model 4B yang menjalankan Ubuntu 20.04 64 bit terbaru (Oktober 2020). Saya melakukan itu karena saya ingin proyek dapat diakses oleh mereka dengan anggaran terbatas. PI terkenal terjangkau dan memiliki kemampuan lebih dari cukup untuk tugas yang ada. Yang mengatakan, jika Anda memiliki akses ke laptop yang menjalankan Ubuntu, Anda mungkin menemukan itu pilihan yang lebih baik. Untuk memulai bangunan, pasang dentang 9. BTW: Anda mungkin tergoda untuk membangun dengan GCC; Jika Anda membuatnya bekerja, Anda adalah master yang lebih baik daripada saya. Setelah itu, instal OpenCV dan itu dependensi. Terakhir jalankan cmake dengan cara biasa di folder root proyek.
Sebagai root, lakukan hal berikut;
/usr/lib/cgi-bin/ Jika Anda mengganti nama proyek di cmakelists.txt biner akan memiliki nama baru juga. Pastikan untuk mencerminkan nama ini di HTTP_HOST_URL di platformio.ini proyek kamera.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf dan tambahkan Listen 4444 pada baris di bawah Listen 80 dan simpan file. -1. Sebagai root, buka /etc/apache2/sites-available/000-default.conf dan tempel berikut ini tepat di bawah tag penutupan </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. Sebagai root, buat direktori /var/www/html/motion_camera dan salin konten folder web_root proyek ini ke dalamnya.
-3. Perbaiki kepemilikan, kelompok, dan izin.
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. Saat Anda selesai /var/www/html/motion_camera akan berisi:
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. Anda sekarang dapat menguji konfigurasi dengan mengarahkan browser Anda ke http: // your_server: 4444/motion_camera
Salah satu hal praktis tentang desain antarmuka CGI adalah bahwa semua pesan kesalahan harus ditulis ke aliran kesalahan standar; stderr . Server web menulis ini ke log kesalahannya; /var/log/apache2/error.log . Jika CGI ini mengalami kesalahan, itu akan menulis pesan yang berguna tentang hal itu ke file ini. Untuk mematikan output ini edit debug_output.hpp dan berkomentar DEBUG_OUTPUT
Tentu tidak. Standar antarmuka CGI didukung oleh banyak server HTTP yang berbeda. Anda harus memiliki sedikit kesulitan mengadaptasi proyek ini untuk bekerja dengan server web yang Anda pilih.
Ada juga alat yang mungkin Anda temukan bermanfaat bagi Anda di proyek lain. Misalnya;
std::map<std::string, std::vector<std::string>> dari ini Anda dapat membuat proyek yang menangani permintaan html mendapatkan permintaan.std::map<std::string, std::vector<std::string>> - satu untuk variabel dan satu lagi untuk file. Dari sini Anda dapat membuat proyek di mana formulir digunakan untuk mengontrol sistem robot/tertanam atau raspberry pi Anda. Untuk membantu Anda memulai, ada formulir HTML yang semuanya-tapi-kitchen-sinting. Edit tag <form> di bagian atas dan ubah atribut action untuk mencerminkan nama server Anda. Jika Anda menemukan bug, silakan buat masalah. Jika Anda ingin berkontribusi, silakan kirim permintaan tarik.
Saya menggunakan Doxygen untuk membuat dokumentasi proyek. Anda bisa membacanya di sini.
Berikut ini adalah referensi yang bermanfaat dalam pengembangan proyek ini.