이 프로젝트는이 카메라에서 이미지를 수신하고 Raspberry Pi Model 4B에서 실행되는 Ubuntu 20.04의 OpenCV 및 FFMPEG를 사용하여 스틸 이미지 및 영화로 처리하는 방법을 보여줍니다. 카메라는 HTTP 게시물을 통해 다음 JSON 메시지를 보냅니다.
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}배터리 데이터는 이미지 브라우징 페이지 상단에 있습니다.

이 페이지에 대한 자세한 내용은 카메라 설정 프로젝트를 참조하십시오. 나머지 데이터는 value 페이로드를 처리하는 데 사용됩니다. (그것은 간결성을 위해 기소되었습니다. 대신에 매우 긴 Base64 인코딩 된 문자열을 상상해보십시오.) name 필드는 어떤 카메라가 데이터를 보냈는지 알려줍니다. 여러 카메라가 있다면 단순히 뚜렷한 이름을 주면 모든 것이 잘 될 것입니다. frames 카운터는 단일 JPEG 또는 배수를 기대 해야하는지 알려줍니다. 프레임은 0에서 번호가 매겨져 0 프레임은 하나의 사진을 산출합니다. 우리가 배수를 얻으면 우리는 그것들을 분리하고 프레임 번호로 주문합니다. 우리가 255 의 예약 가치를 얻으면 우리에게 AVI/MJPEG 영화를 받았다. Magic 번호와 FFMPEG 검증을 전달하면 MP4로 변환하여 영화로 저장합니다. 그렇지 않은 경우, 우리는 가능한 한 많은 프레임을 저장하고 프레임 번호가 매겨진 이미지를 저장하는 데 대한 폴백을 저장하려고 시도합니다. OpenCV 내에서 FFMPEG를 사용하는 방법에 대해서는 mjpeg_utils::save_avi_frames 참조하십시오.
Raspberry Pi Model 4B의 Ubuntu 20.04 (64 비트)를 직접 구축하도록 프로젝트를 수정했습니다. Raspberry Pi OS (일명 Raspbian)를 사용한 이전 버전에 관심이 있으시면 Commit 511C7B8의 저장소에 액세스하십시오.
당신이 아직하지 않은 경우 :
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake OpenCV를 사용하는 것의 가장 어려운 부분은 그것을 얻고 그 종속성을 설치하는 것이 널리 알려져 있습니다. 일단 지나면 사용하는 것이 기쁩니다. 최신 (2020 년 10 월) Ubuntu 20.04 64 비트를 실행하는 Raspberry Pi Model 4B 에이 프로젝트를 구축했습니다. 한정된 예산의 프로젝트가 프로젝트에 액세스 할 수 있기를 원했기 때문에 그렇게했습니다. PI는 유명하게 저렴하며 당면한 작업을위한 충분한 기능이 있습니다. 즉, Ubuntu를 실행하는 노트북에 액세스 할 수 있다면 더 나은 옵션을 찾을 수 있습니다. 건물을 시작하려면 Clang 9를 설치하려면 BTW : GCC로 건축하려는 유혹을받을 수 있습니다. 당신이 그것을 일하게한다면 당신은 나보다 더 나은 빌드 마스터입니다. 그런 다음 OpenCV를 설치하면 종속성입니다. 마지막으로 프로젝트 루트 폴더의 일반적인 방식으로 cmake 실행하십시오.
뿌리로서 다음을 수행하십시오.
/usr/lib/cgi-bin/ 으로 구축 한 CGI 바이너리 (JPEG_CATCHER)를 cmakelists에서 프로젝트로 이름을 바꾸면 바이너리가 새 이름을 갖습니다. 이 이름을 카메라 프로젝트의 Platformio.ini에서 HTTP_HOST_URL 에 반영하십시오.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf 편집하고 아래 줄 아래 줄에 Listen 4444 추가하고 파일을 저장 Listen 80 . -1. 루트로서 /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>> 에 저장합니다.std::map<std::string, std::vector<std::string>> - 다른 하나는 변수와 파일의 경우 2 개의 std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map <std :: map. 이를 통해 양식을 사용하여 로봇/임베디드 시스템 또는 Raspberry Pi를 제어하는 프로젝트를 만들 수 있습니다. 시작하는 데 도움을주기 위해 Kitchen-Sink HTML 양식이 있습니다. 상단에서 <form> 태그를 편집하고 action 속성을 변경하여 서버 이름을 반영하십시오. 버그를 찾으면 문제를 만듭니다. 기부하려면 풀 요청을 보내주십시오.
나는 doxygen을 사용하여 프로젝트 문서를 작성했습니다. 여기서 읽을 수 있습니다.
다음은이 프로젝트 개발에 도움이되었습니다.