如何实现摄像头拍照功能???在线等待

dingyuanpu 2010-09-15 03:13:52
我在做一个远程网络监控的项目,基于arm9和Linux的,视频服务器使用的是mjpg-streamer,
通过远程浏览器访问开发板,cgi做后台处理,
如何实现拍照功能呢?
...全文
852 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aragon 2011-03-23
  • 打赏
  • 举报
回复
mjpg-stream实现JPG图片的直接存储,后来发现有个库可以直接用的
我修改了脚本文件为
#!/bin/sh
mjpg_stream -i "lib/WebCam/input_cmoscamera.so -r 320*250" -o "/lib/WebCam/output_file.so -f /opt/jpg/"
得到流JPG文件
Aragon 2011-03-22
  • 打赏
  • 举报
回复
我也碰到这个问题了,楼主怎么解决的?
latelee 2010-09-17
  • 打赏
  • 举报
回复
因为摄像机已经打开该设备,所以只能从output_http plugin中截获一张图片,保存,但是应该怎么实现呢?
-------------------------------
output_http plugin这个我不懂的。
但是,无论如何,你总得通过代码来获取缓冲区的数据,再保存啊。


同意楼上的看法。
wwwunix 2010-09-17
  • 打赏
  • 举报
回复
摄像机程序可以修改吗?如果可以的话,非常简单。点击的时候,把当前拍到画面保存下来就行了。
如果不能修改摄像机程序的话,那么分析一下摄像机程序是如何处理拍摄的画面的。例如怎么缓存?怎么保存?是否需要在某个显示设备上显示?等等
dingyuanpu 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 latelee 的回复:]
引用 3 楼 dingyuanpu 的回复:
引用 1 楼 latelee 的回复:
直接读取视频数据,保存为图片。


直接读取驱动吗?

可以看看luvcview或mjpg-streamer的源代码,前者我看过,有保存为图片的函数。
[/Quote]

我要实现的功能是能够在前台点击拍照按钮,就能获得一张图片,保存在远程的arm9上,拍照的时候不能再大块摄像头设备,因为摄像机已经打开该设备,所以只能从output_http plugin中截获一张图片,保存,但是应该怎么实现呢?
latelee 2010-09-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dingyuanpu 的回复:]
引用 1 楼 latelee 的回复:
直接读取视频数据,保存为图片。


直接读取驱动吗?
[/Quote]
可以看看luvcview或mjpg-streamer的源代码,前者我看过,有保存为图片的函数。
c271525290 2010-09-16
  • 打赏
  • 举报
回复
学习mjpg-streamer来的。
dingyuanpu 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wwwunix 的回复:]
建议用V4L2来读取摄像头的数据。然后保存成文件就行了。必要的话,通过网络发送到浏览器中显示出来。
[/Quote]

谢谢,我的摄像头是使用的UVC的驱动(万能驱动),采用了V4L2框架,我先看看V4L2的编程
wwwunix 2010-09-15
  • 打赏
  • 举报
回复
建议用V4L2来读取摄像头的数据。然后保存成文件就行了。必要的话,通过网络发送到浏览器中显示出来。
dingyuanpu 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wwwunix 的回复:]
1、写个中间库,用于在arm9上控制摄像头
2、写cgi程序调用中间库来控制摄像头。
3、打开开发板上的http服务
这样,远端机器就可以通过浏览器访问开发板上的cgi程序来控制摄像头,也就可以拍照了。
[/Quote]

主要是这个中间库不知道该怎么写
dingyuanpu 2010-09-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 latelee 的回复:]
直接读取视频数据,保存为图片。
[/Quote]

直接读取驱动吗?
wwwunix 2010-09-15
  • 打赏
  • 举报
回复
1、写个中间库,用于在arm9上控制摄像头
2、写cgi程序调用中间库来控制摄像头。
3、打开开发板上的http服务
这样,远端机器就可以通过浏览器访问开发板上的cgi程序来控制摄像头,也就可以拍照了。
latelee 2010-09-15
  • 打赏
  • 举报
回复
直接读取视频数据,保存为图片。
用你的脸当开机密码(有摄象头的进来看看)一日,朋友在我离开电脑时想用我的机子玩游戏,可是摆弄了半天,就是无法进入。无奈之下只有把我召回来。我到电脑前坐下,呵呵,电脑马上退出了锁定保护,回到我刚才的工作界面中。其实,只要具备一个摄像头安装Alparysoft Video Lock这个软件,你的电脑也可轻松实现人像智能识别功能

Alparysoft Video Lock是一款人像识别工具,能兼容大多数的数字摄像头,只要你的摄像头支持RGB24或I420格式即可。它能根据人的相貌特征来识别电脑前的用户是不是合法用户。合法用户不用输入密码也不必动手便可为自己启动锁定的计算机;若是他人,计算机则会一直处于锁定状态,禁止别人随便使用。

软件安装运行后,它首先会要求用户设置自己的用户名和密码,确认后即可进入主界面。要让Alparysoft Video Lock能认识电脑的主人,必须先进入“Training”模式。把你的面部对着摄像头的镜头,程序便可自动侦测你的面部位置并进行校准,在图像显示窗口可以看见一个黄色线框标出面部位置,这时点击“Add Picture” 按钮便可把图像添加到数据库中。为了使Alparysoft Video Lock能更准确地识别你,最好添加10至15张在不同光线条件下记录的图像到数据库中。若校准指示器显示为红色,图像窗口中便不会出现黄色方框,说明程序无法对你的面部进行侦测,那么你就要调整一下摄像头的焦距或环境的光线了。

Alparysoft Video Lock的操作相当简单,程序可以设定在指定时间锁定电脑,也可以通过“Ctrl+Alt+L”快捷键锁定,还可以在系统托盘的程序图标上点击鼠标右键,选择“Lock Workstation”命令即可。当你再次回到电脑前坐下,摄像头就会自动对你的面部进行侦测识别,确认用户身份后,电脑才会解锁,否则谁也别想开锁进去。若有时由于光线等原因电脑无法把你认出来,可以用热键“Ctrl+Alt+Q”呼出密码登录窗口,输入密码开锁。 如果有非法用户试图登录你的计算机,Alparysoft Video Lock也可以帮你保留下这些非法用户的登录证据,由于每次进行“开锁”操作的时候,程序都对登录者做拍照记录,我们可以在程序主界面的“View Logs”中查看这些记录,当记录太多时,可以用“Delete”按钮进行删除,也可以在界面的右下方设定记录保存的时间和记录保存容量的大小,当超过时间或容量时让程序 自动清除旧记录。

使用 Alparysoft Video Lock时还要特别注意,如果我们在操作系统中设置的显示器关闭等待时间短于屏幕保护的等待时间,那么就不能使程序进入安全保护模式,因此,“关闭监视器”这个选项应设为“从不”,或者把“关闭监视器”的时间界限设置大于屏幕保护的等待时间
一、程序的组成 1.1 本程序分为server端 server的daemon端,也即是ChildGuard.py,默认监听在8888端口。 运行时,会申请管理员身份运行,如果没有管理员权限,也可以运行。 其用到了MyTTS.py模块,该模块主要负责调用百度的api接口,文字转语音,然后播放它,以及语音转文字(暂未用)。 百度的API还不错,比讯飞的免费调用次数给的多些,请自行申请对应的相关APP_ID、API_KEY、SECRET_KEY信息 由于wav的pcm格式转mp3用的是pydub的AudioSegment,这个是调用的ffmpeg来实现,要先下载ffmpeg,并把它放在PATH能够得着的地方。 下载地址:http://ffmpeg.org/download.html 监听pc麦克风用的是pyaudio模块,默认在windows上,直接pip装不上,建议直接下载对应的windows版本下载到本地。 再pip install PyAudio*.whl来进行安装 Server端目前有个问题,就是必须在前台运行,不能后台(比如计划任务调用,比如windows服务调用)。 如果后台运行的话,相关的msg接口,相关的获得前台进程接口,都有问题(这个是windows安全性的限制), 目前还在研究偷explorer.exe的token,然后用它token运行ChildGuard.py,但各种坑,还在趟 (OpenProcess,OpenProcessToken,DuplicateTokenEx,CreateProcessWithTokenW) 1.2 本程序的client端 客户端部分,有几个: 1.2.1 ChildControl.py控制部分 这个我是放在家里的树莓派3B上运行,它负责死循环,每30s检查一下孩子pc的状态: ①获得当前运行的是什么程序,程序的标题是什么 ②如果当前的前台程序在黑名单,那么kill它 ③检查360浏览器的标题,含有相关关键字,kill它 ④检查腾讯视频是否存在,kill它 ⑤每30s抓拍一次电脑屏幕,以及摄像头抓拍一次 ⑥每30s抓一端10s的麦克风录音 1.2.2 rpc_cmd.py的命令行cli部分 这个可以放在我的电脑上运行,或者放在树莓派上运行类似这样: pi@raspberrypi:/var/www/html$ ./rpc_cmd.py checking host=stanleypc,port=8888 http://stanleypc:8888>help func=s.help() ['now', 'md5sum', 'wf', 'rf', 'my_exec', 'killProcess', 'getProcess', 'getActiveProcName', 'cpu_usage', 'mem_usage', 'dimm_info', 'msg', 'msgImm', 'get_path', 'tts', 'net_info', 'is_admin', 'GetSystemPowerStatus', 'uptime', 'create_time', 'username', 'disk_c_usage', 'disk_io_counters', 'net_io_counters', 'snapScreen', 'snapCam', 'snapMerge', 'snapAudio', 'll', 'exit', 'help', 'version'] http://stanleypc:8888>version func=s.version() v0.8.6.20200410 http://stanleypc:8888>tts(别玩游戏啦,快做作业!) tts这个用得多,主要是会在它屏幕上显示一个对话框,上面有你发过去的文字,然后会在他电脑上,语音播报一下这段文字 1.2.3 update_childguard.py更新程序 这个会把我电脑里面最新的ChildGuard.py程序,去覆盖当前孩子pc上的。 但如何热更新,目前还摸索中。 现在只能是update_childguard.py完了后, 用ssh进孩子的电脑,netstat -ano|findstr 8888查看是哪个pid占8888端口, 然后taskkill /f /pid 把ChildGuard.py进程杀掉 然后teamviewer连进孩子的电脑,再图像界面下,启动ChildGuard.py(前面ssh里面起的话,算后台起,API资源受限) 1.2.4 rpc_trans_file.py批量文件传送 这个会把我电脑to_trans/目录下的所有文件,都发到孩子pc上去 二、程序当前支持的功能: now:取得当前孩子pc的时间 md5sum:给定文件名,返回对应的md5值(用于校验文件比对) wf: 写data给到指定文件 rf: 读文件内容 my_exec : 执行指定的dos命令,返回标准输出的内容,和错误输出的内容 'killProcess', 给定pid,杀进程 'getProcess', 不加参数,返回所有进程信息;加pid返回pid进程信息;加caption信息,返回caption的进程信息 'getActiveProcName', 返回当前前台的进程信息 'cpu_usage', 返回当前cpu利用率 'mem_usage', 返回当前内存利用率 'dimm_info',返回当前物理内存条情况 'msg', 发指定的文本消息给孩子的电脑屏幕,并等待孩子点“确定” 'msgImm',发指定的文本消息给孩子的电脑屏幕,不等孩子点,直接返回 'get_path',获得当孩子pc上ChildGuard.py运行所在目录 'tts',发指定的文本消息给孩子的电脑屏幕,并语音播报给消息内容 'net_info',返回孩子pc上的网络信息内容 'is_admin', 判断ChildGuard.py是否是以管理员模式运行的 'GetSystemPowerStatus',判断电池电量等信息,方便今后的其他应急程序准备 'uptime', 获得电脑的运行时间 'create_time',获得ChildGuard.py的运行时间 'username', 获得当前ChildGuard.py是以哪个用户运行的 'disk_c_usage', 获得c盘的利用率 'disk_io_counters', 获得当前磁盘的io情况,建议间隔运行2次,取差值÷间隔时间,获得io流量 'net_io_counters', 获得网络io情况 'snapScreen',抓电脑屏幕 'snapCam', 抓摄像头拍照 'snapMerge', 抓电脑屏幕并抓摄像头拍照,然后把两者拼接到一个图片上 'snapAudio',抓电脑的麦克风录音一段指定时长(默认10s) 'll',类似linux的ls -l的输出信息 三、待完善支持功能 1、热更新 2、获得微信访问指定网址的内容。 目前GetForegroundWindow获得窗口句柄 再GetWindowText用窗口句柄获得标题, 用GetWindowThreadProcessId获得pid 用WMI接口用pid获得命令行信息 基本能覆盖各个浏览器标题内容,满足了大部分需求。 但如果用微信打开的网页链接,或者小程序之类的,这个标题text或者页面内容获得不到。 各位有什么思路,能把这个信息捕获到么? 3、黑名单的开启时间段 比如设置成晚上或者周末,可以使用黑名单的程序 4、防被杀 目前孩子只9岁,还找不到隐藏dos窗口的程序,将来可能就会了。 要考虑病毒方式双进程互动 5、目前用的是xmlrpc.server.SimpleXMLRPCServer,还没有身份验证机制,这个端口映射放公网的话,有些不太安全 ……
【RT-Thread作品秀】智能家居的语音控制方案。作者:xqyjlj 概述智能家居是现在一个很火热的方向,随着人们生活水平的提高,我们都逐渐开始希望身边的电器都可以不用手来控制,本作品就是基于这种需求,开发出来了一个基于语音控制的智能家居方案。本智能家居方案,分为联网与不联网两种版本。其中,无论是联网与不联网,语音识别功能均能正常使用。在本作品没有连上网的情况下,可以进行语音对开关的控制,进行MP3等常用音频文件的播放,以及具有拍照功能,可以将拍下来的照片储存在SD卡内,在本作品连上网的情况下,还附加了以下功能,可以将一些数据上报到云平台(onenet),并且将一些工作日志通过邮件发送给用户。 开发环境硬件:ART_PI(主控) LD3320(语音识别芯片) VS1053(音频解码芯片) OV2640(摄像头) RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:RT-Thread Studio 2.0.0 RT-Thread使用情况概述内核:调度器,信号量。 组件:UART,DFS,SPI,IIC,PIN。 软件包:smtp_client,btstack,netuils,fal,easyflash,littlefs,onenet。 硬件框架主控:ART-PI ART-Pi 是 RT-Thread 团队为嵌入式软件工程师、开源创客设计的一款极具扩展功能的 DIY 开源硬件。致力打造一个开源的软硬件平台。 语音识别芯片:LD3320 LD3320是非特定人(不用针对指定人)语音识别芯片,即语音声控芯片。最多可以识别50条预先内置的指令。 音频解码芯片:VS1053 VS1053是一款利用SPI通讯的音频解码模块,支持大部分的音频文件的解码播放和编码保存 摄像头:OV2640 OV2640是OmniVision公司生产的一颗1/4寸的CMOSUXGA(1632*1232)图像传感器;支持自动曝光控制、自动增益控制、自动白平衡、自动消除灯光条纹等自动控制功能。 软件框架说明本项目采用的是多级联控模式。将多个模块的任务分为多个级别,以语音识别为主体,摄像头和语音播报为从体,在语音识别到关键字的时候,会出发相对应的函数,实现不同的效果,而onenet是与语音识别互相独立的,会源源不断的把数据实时发送到云端。 软件模块说明smtp_thread_entry:邮件线程,用于发送邮件。 ld3320_asr_thread:语音识别线程,用于语音识别,调用其他程序。 onenet_upload_entry:onenet线程,用于向云端发送数据。 语音识别过程: 首先初始化LD3320芯片,在对其写入需要识别的关键字数据,之后启动LD3320,之后等待其信号引脚拉低,在其信号引脚拉低后,通过读取其寄存器,我们便能知道LD3320获取到了什么样的关键字。之后便从关键字调取我们的相对应的函数。使之工作于不同的功能。 演示效果演示视频: 比赛感悟在报名这个比赛之后,我的目标其实是比现在的功能多得多的,这一点可以从我的Gitee上面的进度表可以看出,奈何原本打算三个人做的项目,到最后,也是我一个人来完成。自己之前画的板子,也是因为自己画板功力不足,还有焊接能力不足,导致本来拥有更多功能的拓展板也没完成。 不过比赛嘛,重要的不是结果,而是过程。通过这次比赛,我最起码收货到了以下知识: 安卓开发,微信小程序设计,web开发(以上由于个人能力问题,其实并未实现),音频处理,STM32H750的众多DMA的设置,以及bootloader,同时也知道了STM32还能片外运行的神奇事情,也学会了RT-Thread Studio的使用。最重要的事情就是明白了不要过分依赖别人,自己想的计划,就要自己去实现,不要总是把任务布置给其他人。
一.概览 本人虽然是电子信息技术专业出身,在毕业后从事的是偏软件的工作,大多数是PC软件的开发,但一直以来,闲暇时间会利用STM32做些小的作品。对于RT-Thread这国内的物联网操作系统,其实早有耳闻,期间也参加过深圳的一次RT-Thread线下交流活动,所以对于RT-Thread是有所了解而未实际应用的程度。 借着此次RT-Thread大赛的机会,我想将PC的一些图像处理和图像识别算法放到art-pi试跑一下看看效果如何,所以本次参赛将会使用art-pi获取OV7670的图像来做像处理和图像识别。 二.开发环境 硬件:PC、ART-PI、OV7670、RGB_LCD RT-Thread版本:rt-thread4 .0.3,art-pi adk 1.1.0 开发工具及版本:立创EDA,RT-Studio,SecureCRT 三.RT-Thread使用情况概述 线程:创建图像处理线程用于通过DCMI获取OV7670的图像,图像处理后完显示在LCD上 信号量:用于DCMI图像获取,当捕捉完一帧图像后,释放信号量给图像处理线程。 驱动:使用了drv_dcmi驱动并参考drv_ov2640移植drv_ov7670驱动 四.实现功能展示 通过摄像头采集图像进行图像识别,然后将结果显示在LCD屏幕上。 五.硬件框架 本次的硬件核心由ART-PI、OV7670、LCD三部分组成: ART-PI:stm32H750作为控制核心部分,采集图像源数据、处理图像源生成处理结果、将处理结果送到LCD显示 OV7670:作为图像源,提供320*240的RGB565图像 LCD:实时显示图像源图像和显示处理结果 六.软件流程图 1. 硬件初始化:时钟、I2C、DCMI、SDRAM、LTDC 2. 进入图像处理线程,启动拍照等待拍照完成信号量 3. 完成拍照释放拍照完成信号量 4. 得到图像后,进行图像处理与图像识别 5. 将图像识别结果在LCD上显示 6. 回到步骤2 七.图像识别功能介绍 通过DCMI驱动获取OV7670的分辨率为320*240的RGB565原始图像。RGB565每个像素使用用下图的方式存储,每个像素占用2个字节。所以每帧320*240的图像所需内存为320*240*2=153600字节。 实际上,我们在这次项目中并不需要使用到彩色特征,所以先将RGB565转换为灰色度。灰度图其实就是每个像素占用一字节,用0-255值来形容一个像素的灰度值。因此320*240所占用的内存为76800字节。 RGB565转灰度图公式如下:Gray = R*0.299 + G*0.587 + B*0.114 提取的灰度图后,我们还需要再进行一次二值化处理,因此设定一个阈值,当灰色像素大于这个阈值我们将它改为255,低于这个值变成0。这样就得到一帧只有0和225值的图像。 得到二值化图像后,我们便可以寻找要识别物体了。在此使用九宫格的方式提取连通分量,原理其实很简单,就是在九宫格里寻找连在一起的像素,如果能找到便将该像素便将该像素的坐标(位于X行,y列)写入到链表里。如此循环,直到找完所有像素。 完成连通分量的提取后便是特征提取了,我们还是采用九宫格分割法,将取得的图像平均分割为9个区域,再计算9个区域中值为255像素的个数。通过这一步算法,我们得到了9组特征数据。 本次用了两种特征提取方式: 1.通过水平与垂直方向的穿越数找出部分数字 以数字0和7为例,在1/2宽度处,0和7稳定的得到垂直穿越数是2.而在1/2高度,0的水平穿越数是2,7的水平穿越数是1. 2.在图像的水平和垂直的中间切分成四块,根据四个部分不同像素比例找出其他数字。以2和3为例 ,在右下角部分,3的每一行都会有像素点,而2会缺几行。因此2的像素更少从而区分2和3。 最终检测效果如下图: 八.比赛感悟 虽然标题是比赛感悟,实际上比赛并不是我的目的。RT-Thread我知道它更久了,但是一直没有去更进一步使用RT-Thread。这次比赛让我深入了解了RT-Thread的生态系统,给我的感觉真的太惊喜了。RT-Thread平台拥有丰富的组件,完善的各种外设驱动,通过官方的RT-Studio基本上做到入手即用了。 当时拿到ART-PI,通过RT-Thread SETTING进行勾选,再使用CubeMX选择外设,生成引脚初始化代码后。我本次项目的软件基本平台已经完成了,我只需要专注于我的应用层开发便可以了,这真的是太便利了。 通过本次比赛,让我对RT-Thread获得相当大的好感,我想未来硬件项目当中,我会毫不犹豫的选择RT-Thread代替其他实时操作系统。

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧