โครงการนี้แสดงให้เห็นถึงวิธีการรับภาพจากกล้องนี้และประมวลผลเป็นภาพนิ่งและภาพยนตร์โดยใช้ OpenCV และ FFMPEG บน Ubuntu 20.04 ที่ทำงานบน Raspberry Pi Model 4B กล้องส่งข้อความ JSON ต่อไปนี้ผ่านโพสต์ HTTP:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}ข้อมูลแบตเตอรี่ลงที่ด้านบนของหน้าการท่องภาพ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับหน้านี้ดูโครงการการตั้งค่ากล้อง ส่วนที่เหลือของข้อมูลใช้ในการประมวล value โหลด (มันได้รับการอธิบายอย่างกะทันหันลองนึกภาพสตริงที่เข้ารหัส Base64 ที่ยาวมากในสถานที่) ฟิลด์ name บอกเราว่ากล้องที่ส่งข้อมูล หากคุณมีกล้องหลายตัวเพียงแค่ให้ชื่อที่แตกต่างกันและทุกอย่างจะดี ตัวนับ frames แจ้งให้เราทราบว่าเราควรคาดหวัง JPEG หรือทวีคูณเดียว เฟรมมีหมายเลขจากศูนย์ดังนั้น 0 เฟรมให้ภาพหนึ่งภาพ หากเราได้รับทวีคูณเราจะแยกออกจากกันและสั่งซื้อตามหมายเลขเฟรม หากเราได้รับมูลค่าที่สงวนไว้ที่ 255 ที่บอกเราว่าเราได้รับภาพยนตร์ AVI/MJPEG หากผ่านหมายเลขเวทย์มนตร์และการตรวจสอบ FFMPEG เราจะแปลงเป็น MP4 และบันทึกเป็นภาพยนตร์ หากไม่เป็นเช่นนั้นเราพยายามที่จะบันทึกเฟรมให้มากที่สุดเท่าที่จะทำได้และทางเลือกในการบันทึกภาพที่มีหมายเลขเฟรม ดู mjpeg_utils::save_avi_frames สำหรับวิธีการใช้ FFMPEG ภายใน OpENCV เพื่อบรรลุการประมวลผลภาพทั้งหมดนี้
ฉันแก้ไขโครงการเพื่อสร้างโดยตรงบน Ubuntu 20.04 (64 บิต) สำหรับ Raspberry Pi Model 4B หากคุณมีความสนใจในเวอร์ชันก่อนหน้าซึ่งใช้ Raspberry Pi OS (aka Raspbian) เข้าถึงที่เก็บที่ส่งมอบ 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. BTW: คุณอาจถูกล่อลวงให้สร้างด้วย GCC; ถ้าคุณทำให้มันทำงานได้คุณเป็นอาจารย์ที่ดีกว่าฉัน หลังจากนั้นติดตั้ง OpenCV และการพึ่งพา สุดท้ายเรียกใช้ cmake ตามปกติในโฟลเดอร์รูทโครงการ
เป็นรากให้ทำต่อไปนี้;
/usr/lib/cgi-bin/ ถ้าคุณเปลี่ยนชื่อโครงการใน cmakelists.txt ไบนารีจะมีชื่อใหม่เช่นกัน ตรวจสอบให้แน่ใจว่าได้ไตร่ตรองชื่อนี้ใน HTTP_HOST_URL ใน platformio.ini ของโครงการกล้อง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 ทุกอย่าง แต่ Kitchen-Sink แก้ไขแท็ก <form> ที่ด้านบนและเปลี่ยนแอตทริบิวต์ action เพื่อสะท้อนชื่อเซิร์ฟเวอร์ของคุณ หากคุณพบข้อผิดพลาดโปรดสร้างปัญหา หากคุณต้องการมีส่วนร่วมโปรดส่งคำขอดึง
ฉันใช้ Doxygen เพื่อสร้างเอกสารโครงการ คุณสามารถอ่านได้ที่นี่
ต่อไปนี้เป็นข้อมูลอ้างอิงที่เป็นประโยชน์ในการพัฒนาโครงการนี้