嵌入式安防监控项目———摄像头监控与拍照

发布时间:2026/6/19 22:39:39

嵌入式安防监控项目———摄像头监控与拍照 前言mjpg-streamer是一个开源的视频流媒体服务器软件能够利用Linux系统的视频设备驱动以及JPEG编码库将摄像头捕获的视频帧实时转换为MJPEG格式的数据流并通过HTTP协议对外提供服务。它支持多种视频输入源并能通过网络将视频流推送给支持HTTP协议的客户端。因此摄像头数据向网页的推流我们采用 mjpg-streamer 来实现。具体的移植步骤可参考以下内容mjpg-streamer移植到IMX6ULL本次实验使用的USB摄像头是罗技C270如要采用其他摄像头则应采用支持UVC且支持MJPEG输出的摄像头。摄像头推流到网页要实现推流我们需要知道推流的端口地址mjpg默认是8080端口因此我们访问http://192.168.1.50:8080/?actionstream即可获取推流图像。在网页端需要指明图片的路径HTML部分代码如下实现的最终效果如下图所示摄像头抓拍在 /boa 目录下创建 history 文件夹用于存放抓拍图片。用户点击监控界面的“拍照”按钮后将触发 capture.cgi 程序执行。该程序以当前系统时间作为文件名将抓拍的图像存储至 /boa/history/ 目录中。抓拍图像直接调用 mjpg-streamer 自带的快照接口即可获取无需额外开发采集逻辑http://127.0.0.1:8080/?actionsnapshotcapture.cgi 的程序实现如下// capture.cgi #includestdio.h#includestdlib.h#includestring.h#includetime.h#includeunistd.h#defineCAPTURE_DIR/boa/history/intmain(void){charfilename[64];charfullpath[128];charcmd[256];time_tnow;structtm*tm_info;// 1. 生成文件名按时间命名time(now);tm_infolocaltime(now);strftime(filename,sizeof(filename),capture_%Y%m%d_%H%M%S.jpg,tm_info);// 2. 完整存储路径snprintf(fullpath,sizeof(fullpath),%s%s,CAPTURE_DIR,filename);// 3. 从 mjpg-streamer 获取快照并保存snprintf(cmd,sizeof(cmd),wget -q -O %s http://127.0.0.1:8080/?actionsnapshot,fullpath);system(cmd);snprintf(cmd,sizeof(cmd),chmod 644 %s,fullpath);// 赋予权限system(cmd);// 4. 返回 JSON 响应printf(Content-Type: application/json\r\n);printf(Access-Control-Allow-Origin: *\r\n);printf(\r\n);// 5. 检查是否保存成功if(access(fullpath,F_OK)0){printf({\success\: true, \filename\: \%s\}\n,filename);}else{printf({\success\: false, \message\: \抓拍失败\}\n);}return0;}历史记录页面通过 list_images.cgi 读取 /boa/history/ 目录下的图片文件并将文件信息封装为 JSON 格式返回给前端。前端 history.html 获取该 JSON 数据后解析渲染即可展示历史抓拍图片列表。以下是list_images.c的程序// list_images.cgi #includestdio.h#includestdlib.h#includestring.h#includedirent.h#includesys/stat.h#includetime.h#defineCAPTURE_DIR/boa/history/intmain(void){DIR*dir;structdirent*entry;structstatfile_stat;charfullpath[256];intfirst1;printf(Content-Type: application/json\r\n);printf(Access-Control-Allow-Origin: *\r\n);printf(\r\n);printf({ \images\: [);diropendir(CAPTURE_DIR);if(dir!NULL){while((entryreaddir(dir))!NULL){// 只处理 .jpg 文件if(strstr(entry-d_name,.jpg)NULL)continue;snprintf(fullpath,sizeof(fullpath),%s%s,CAPTURE_DIR,entry-d_name);stat(fullpath,file_stat);// 格式化时间加 8 小时修正时区chartime_str[64];time_tadjusted_timefile_stat.st_mtime28800;// 8小时structtm*tm_infolocaltime(adjusted_time);strftime(time_str,sizeof(time_str),%Y-%m-%d %H:%M:%S,tm_info);if(!first)printf(,);printf({);printf(\filename\:\%s\,,entry-d_name);printf(\time\:\%s\,time_str);printf(});first0;}closedir(dir);}printf(] }\n);return0;}

相关新闻