Este projeto demonstra como receber imagens desta câmera e processá -las em imagens e filmes estáticos usando o OpenCV e o FFMPEG no Ubuntu 20.04 em execução em um Raspberry Pi Modelo 4B. A câmera envia a seguinte mensagem JSON via postagem HTTP:
{
"body" : [
{
"name" : " battery_percent " ,
"value" : " 96 "
},
{
"name" : " 5MP_MC " ,
"frames" : 0 ,
"content_type" : " image/jpeg " ,
"value" : " "
}
]
}Os dados da bateria atingem na parte superior da página de navegação da imagem.

Para obter mais informações sobre esta página, consulte o projeto Configurações da câmera. O restante dos dados é usado para processar a carga útil value . (Foi eliminado para a brevidade. Imagine uma sequência codificada Base64 muito longa em seu lugar.) O campo name nos diz qual câmera enviou os dados. Se você tiver várias câmeras, simplesmente lhes dê nomes distintos e tudo ficará bem. O contador de frames nos informa se devemos esperar um único jpeg ou múltiplo. Os quadros são numerados de zero, então 0 quadros produzem uma imagem. Se obtivermos múltiplos, os separamos e pedimos por número de quadros. Se obtivermos o valor reservado de 255 que nos diz que recebemos um filme AVI/MJPEG. Se passar o número mágico e a validação do FFMPEG, convertemos -o para MP4 e salvá -lo como um filme. Caso contrário, tentamos salvar o máximo de quadros que pudermos e o fallback para salvar imagens numeradas com o quadro. Consulte mjpeg_utils::save_avi_frames para como o FFMPEG é usado no OpenCV para realizar todo esse processamento de imagem.
Revisei o projeto para construir diretamente no Ubuntu 20.04 (64 bits) para o Raspberry Pi Modelo 4b. Se você estiver interessado na versão anterior que usou o Raspberry Pi OS (também conhecido
Se você ainda não o fez:
sudo apt-get install build-essential libcurl-dev libmagic-dev cmake É amplamente conhecido que a parte mais difícil do uso do OpenCV é obtê -lo e suas dependências instaladas. Depois de passar, é um prazer usar. Eu construí este projeto em um Raspberry Pi Model 4b, executando o mais recente (outubro de 2020) Ubuntu 20,04 64 bits. Fiz isso porque queria que o projeto fosse acessível àqueles com um orçamento limitado. O PI é famoso e acessível e tem capacidade mais do que suficiente para as tarefas em questão. Dito isto, se você tiver acesso a um laptop que executa o Ubuntu, poderá achar isso uma opção melhor. Para começar o edifício, instale o CLANG 9. BTW: Você pode ser tentado a construir com o GCC; Se você faz com que funcione, você é um mestre de construção melhor que eu. Depois disso, instale o OpenCV e suas dependências. Por fim, execute cmake da maneira usual na pasta raiz do projeto.
Como raiz, faça o seguinte;
/usr/lib/cgi-bin/ se você renomeou o projeto em cmakelists.txt O binário também terá um novo nome. Certifique -se de refletir esse nome em HTTP_HOST_URL na plataforma do projeto da câmera.sudo a2enmod cgisudo systemctl restart apache2/etc/apache2/ports.conf e adicione Listen 4444 em uma linha abaixo Listen 80 e salve o arquivo. -1. Como root, open /etc/apache2/sites-available/000-default.conf e cole o seguinte logo abaixo da tag de fechamento </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. Como root, faça o diretório /var/www/html/motion_camera e copie o conteúdo da pasta Web_Root deste projeto nele.
-3. Corrija a propriedade, o grupo e as permissões.
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. Quando você terminar /var/www/html/motion_camera conter:
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. Agora você pode testar a configuração apontando seu navegador para http: // your_server: 4444/motion_camera
Uma das coisas úteis sobre o design da interface CGI é que todas as mensagens de erro devem ser gravadas no fluxo de erro padrão; stderr . O servidor da web os grava no log de erros; /var/log/apache2/error.log . Se este CGI encontrar um erro, ele escreverá uma mensagem útil sobre esse arquivo. Para desativar esta saída Editar Debug_Output.hpp e comente DEBUG_OUTPUT
Certamente não. O padrão de interface CGI é suportado por muitos servidores HTTP diferentes. Você deve ter pouca dificuldade em adaptar este projeto para trabalhar com o servidor da web escolhido.
Também existem ferramentas que você pode achar úteis em outros projetos. Por exemplo;
std::map<std::string, std::vector<std::string>> a partir disso, você pode criar um projeto que lida com o html obter solicitações.std::map<std::string, std::vector<std::string>> - um para variáveis e outro para arquivos. A partir disso, você pode criar um projeto em que os formulários são usados para controlar um sistema robô/incorporado ou seu Raspberry Pi. Para ajudá-lo a começar, há um formulário HTML de todos, mas tudo-pico. Edite a tag <form> na parte superior e altere o atributo action para refletir o nome do seu servidor. Se você encontrar um bug, crie um problema. Se você quiser contribuir, envie uma solicitação de tração.
Usei doxygen para criar a documentação do projeto. Você pode ler aqui.
Os seguintes foram referências úteis no desenvolvimento deste projeto.