版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第29卷第12期通化师范学院学报Vo.l29 12 2008年12月J OURNAL OF TONGHUA TE AC HERS C OLLEGE Dec.2008摄像头图像自动采集的实现刘 钧(洛阳理工学院现代教育中心,河南洛阳471023摘 要:该文就图像识别系统中摄像头图像的自动采集问题,介绍了一种在VC+6.0中实现的鼠标自动点击器的设计方法,进而解决自动拍照问题,实现了图像识别系统的全自动化.文中详细说明了自动定位点击对象、模拟鼠标事件、设定点击的速度等功能的实现方法,并给出了相关程序.并就两个特殊问题进行了探讨.关键词:摄像头图像;自动采集;VC+6.0;API函数;自动点击中图分
2、类号:TP317.4 文献标志码:A 文章编号:1008-7974(200812-0030-03收稿日期:2008-05-28作者简介:刘钧(1978-,女,洛阳理工学院现代教育中心讲师.在W I N DO W S系统下的图像识别系统中,需要用一台计算机实现图像采集、识别、结果显示等任务.要采集图像就要运行摄像头提供的软件,点击拍摄按钮完成拍照.要完成图像识别、结果显示就需要运行用户编制的用于图像处理和显示结果的VC+ +可执行文件.由于摄像头只提供EXE文件,在CRT上显示的软件图形操作界面,需要手动点击鼠标左键才能完成拍摄像片的工作,这一手工的劳动不仅浪费了我们大量的时间和精力,而且也不能
3、完成图像采集、识别、结果显示的全自动化.如果设计一个鼠标自动点击器,来完成自动点击操作,这一问题就可以得到完美的解决.本文设计的鼠标自动点击器是用VC+6.0实现的,使用它既可以利用现有的EXE文件,单独运行,又可以把它嵌入到相关程序中去,减少不必要的开发时间.1 程序设计步骤需要解决的基本问题包括:定位光标、移动光标、模拟鼠标事件、连续点击等.1.1 定位光标对拍摄按钮进行点击操作,首先应该获得它的确切位置,也就是它在屏幕上的坐标,这是很关键的一步.这一步骤可由API函数Get C ursor Pos来实现. Get C ursor Pos的功能是以屏幕坐标返回光标的当前位置.只要把鼠标放在
4、按钮处,执行Get C ursor Pos就可以了.Get C ursor Pos的函数原型为GetCursorPos (LPPOI NT lpPo i n t,参数l p Po i n t是获取当前光标屏幕坐标的指针向量.其中l p Po i n.t x为水平坐标,l p Po i n.t y为垂直坐标.1.2 移动光标确定了拍摄按钮的位置,还必须要把光标移到此位置,才有可能对它进行操作.这一步骤要求鼠标能由系统操纵,无论当前光标在哪里,系统都要把它自动地移到指定位置处.这一任务可由函数Set C ur sorPos(i n tX,intY来实现,用该函数可以将鼠标移到屏幕上的任何地方.参数
5、X和Y,表示目标位置在屏幕上的坐标,X是水平坐标,Y是垂直坐标,这里X、Y是由GetCursor Pos获得的,所以,X=lpPo in.t x, Y=l p Po i n.t y.1.3 模拟鼠标事件鼠标移动到了指定的拍摄按钮处,还必须进行鼠标事件的模拟,也就是模拟鼠标左键单击,实现拍照任务.用来实现这一功能的函数是m ouse_even,t 它可以模拟鼠标的全部操作.m ouse_event完整形式为:m ouse_event(dwF lags,dx,dy,c Buttons,dwEx traI n fo,dx指定水平方向的绝对位置或相对运动, dy指定垂直方向的绝对位置或相对运动,cBu
6、ttons 鼠标轮子转动的数量,dwExtraI nfo一个关联鼠标动作辅加信息,dwFlags是真正模拟鼠标事件的参数,对它的利用可以真正发挥鼠标的功能.主要鼠标事件见表1:模拟鼠标左键点击是用MOUSEEVENTF_ LEFTDOWN和MOUSEEVENTF_LEFTUP.表1 主要鼠标事件M OUSEEVENTF_M OVE移动鼠标M OUSEEVENTF_LEFTDO W N模拟鼠标左键按下M OUSEEVENTF_LEFTUP模拟鼠标左键抬起M OUSEEVENTF_R I GHTDO W N模拟鼠标右键按下M OUSEEVENTF_R I GHTUP模拟鼠标右键抬起M OUSEEV
7、ENTF_M I DDLEDOWN模拟鼠标中键按下M OUSEEVENTF_M I DDLEUP模拟鼠标中键抬起301.4 连续点击给鼠标点击事件发送一次消息,可以模拟鼠标一次点击,拍摄到一张图片.但是要实现图像的连续采集,必须不停地发送同一个消息.Set T i m er 函数可以实现每隔一段时间执行一次任务,消息的反复发送可以用它来实现.Set T i m er 函数的原型为:U I N T Set T i m er(U I N T nI D Even,t U I N T nE lapse ,vo id(CALL B ACK EXPORT *lpfnT i m er(H WND ,U I
8、N T ,Y I N T ,D WORD当使用Set T i m er 函数的时候,会生成一个计时器.函数中nI DEvent 是计时器的标识.nE lapse 是时间间隔,指每隔多长时间触发一次事件,以毫秒为单位,-1为关闭定时器.第三个参数是一个回调函数,在这个函数里,放入要做的事情的代码,如将它设定为NULL ,就是使用系统默认的回调函数,系统默认的是onT i m e 函数.onT i m e 函数需要在计时器所在的类中生成.用C lass W izard ,添加WM _T I M E 消息映射,系统会自动生成onT i m e 函数.然后在函数里添加实现鼠标点击的代码.这样每隔nE
9、lapse 时间,系统就会发送一次消息,执行一次鼠标点击操作.需要停止点击的时候,就要撤销定时器,用函数K ill T i m er(HWND h W nd ,U I N T uI D Event ,uI DEvent 指的是定时器号.计时器是较为耗费系统资源的,在程序结束的时候,必须销毁它以释放系统.2 界面与相关程序本应用程序是使用VC +6.0建立的基于对话框的应用程序,工程名为AutoC lick .整个程序的主界面如图1所示. 图1 程序主界面主要程序代码如下:vo i d CAu to C li ckDlg :OnBu ttonT i m e Y es (/点击时间间隔确认处理函数
10、Update Data(tru e;Get D l gIte m (IDC _BUTTON _START->E nab l e W i ndo w (true;vo i d CAu to C li ckD l g :OnBu ttonT i m e C ancel(/点击时间间隔取消处理函数Get D l gIte m (IDC _BUTTON _START->E nab l e W i ndo w (f a l se;m _T i m e1=1.0;Updat eDat a(fals e;vo i d CAu t oC li ckD l g :OnBu ttonStart (/开
11、始点击按钮处理函数i nt ;ii =m _T i m e1*1000;m _nT i m e1=S et T i m er(1,i NULL;vo i d CAu t oC lickD l g :OnT i m er(U I NT n I DE ven t/定时器处理函数Set Curs orPos(poi n t _xy .x ,poi n t_xy .y;mouse_even t(MOUSEEVENTF_LEFTDOWN,0,0,0,0;mouse_even t(MOUSEEVENTF_LEFTUP ,0,0,0,0;CD i al og :OnT i m er(n I DEven t;
12、vo i d CAu t oC li ckD l g :OnSys t e mE xit (CAuto C li ckDlg :OnCan cel(;3 特殊问题的处理这里有两个问题要特殊处理:一是怎样通过G et C urso r Pos 获得一个固定的鼠标点击位置;二是怎样停止鼠标的点击事件.说这两个问题特殊,是因为在本应用程序中鼠标已经被操纵,无法再利用鼠标来完成这两件事.3.1 固定鼠标点击位置已知Get C ursor Pos 函数得到的是当前鼠标位置的屏幕坐标值,这里有两个要求:第一,无论鼠标是在哪个应用程序窗口,都能正确返回此时的坐标值;第二,无论鼠标点击器是前台运行还是后台运行
13、,坐标值都能有效的返回.执行过程要求是把鼠标放到指定位置后,发送一次消息来得到此处的坐标值.那么这样的消息应该由谁来发送?这是问题的关键.由于此时鼠标已经放到指定位置,不能再移动,发送消息当然不能再靠它来实现.这种情况下用界面按钮、菜单都不能解决问题.如果程序不是在前台工作,用快捷键也不能如愿.所以,这时就要用到W i n do w s 热键.热键是向W i n dow s 系统注册的敏感键,在多个正在运行的应用程序中,无论是前台程序还是后台程序,只要用户按下此键,该程序就会立即变为前台程序,执行相应的操作.热键的运用使鼠标得以解放,所以就可以把鼠标放到指定位置不动,按一下自定义的W i n
14、do w s 热键,发送一个(WM _HOT KEY 消息,在消息处理函数On H ot K ey (中执行G et C urso r Pos ,从而准确得到鼠标处屏幕坐标.3.2 停止点击对于停止鼠标点击同样如此.因为在执行鼠标点击的过程中,鼠标已被程序控制,这时我们并不能手工自由移动它.和上述讲的得到鼠标位置一样,这时31还是要用W indo w s热键.定义一个热键,按下此键,执行消息处理函数On H o t K ey(来停止鼠标点击.3.3 注册热键及相关程序注册热键是用函数R eg ister H o t K ey.原型为BOOL Reg ister H ot K ey(HWND h
15、 W nd/响应该敏感键的窗口句柄,I nti d,/该敏感键的唯一标示符, U I N Tfs M od ifi e rs/该敏感键的辅助按键,U I N T vk/该敏感键的键值.由于将系统热键都注册到系统,因此必须在服务程序退出之前将其卸载,否则将导致下次注册时的失败.函数U nreg ister H o t K ey(负责完成对系统热键的释放.在VC+6.0中,大多数的窗口消息可以从C lass W izard中找到.但是一些不常用的消息在C lass W izard中并没有封装,热键处理消息(WM_HOTKE Y就是其中之一,所以原本那些由类向导所自动生成的代码也必须由用户编写了.具
16、体步骤如下:(1声明热键消息处理函数原型.在C AutoC lickD lg.h中消息映射声明处(AFX_m SG字样之后加入如下语句:LRESULT On H ot Key(W PARA M wPara m,LP ARA M l P ara m.(2消息与相应处理函数.在C Au to C lickD l g. cpp中加入消息映射宏,使消息与相应处理函数发生关系,ON_M ESSAGE(WM_HOTKEY,On H ot K ey.(3向系统登记热键.在vo id C AutoC lickD l g: OnButtonR eghotkey(函数中加入如下代码以向系统登记热键.Regi s
17、t er H ot K ey(m_h W nd,0xB4EE,M OD_CONTROL,VK_F1;/注册热键C trl+F1获得鼠标位置.Regi s t er H ot K ey(m_h W nd,0xB4EF,M OD_CONTROL,VK_F2; /注册热键C trl+F2停止鼠标点击.(4处理热键.在消息处理函数On H o t K ey(中对热键进行处理,并可加入用户希望运行的程序代码等:if(w Para m=0xB4EECW nd:Set Foreground W i ndo w(;/th i s->Set Foreground W i n do w(;Get Cu rs
18、or Pos(&poi n t_xy;m_Textx=po i nt_xy.x;m_Texty=point_xy.y;Updat eDat a(fals e;els e if(wPara m=0xB4EFK ill T i m er(1;CW nd:Set Foreground W i ndo w(;/th i s->Set Foreground W i n do w(;(5WM_DESTROY消息映射函数OnDestroy( ,程序运行完毕后解除热键.利用CLASS W IZ ARD 在C A uto C lickD l g类中创建一个响应WM_DESTROY 消息的函数OnD
19、 estroy(的框架.在OnD estroy(中通过UnR eg ister H o t K ey(解除热键登记,释放系统资源.Unregister H ot K ey(m_h W nd,0xB4EE;Unregister H ot K ey(m_h W nd,0xB4EF;4 应用程序的操作综上所述,本应用程序操作步骤有:(1使用前先用!注册按钮注册热键,注册成功后可看到OK 项选中;(2把鼠标移动到所要点击对象的位置,使用热键!C trl+F1获取光标的位置;(3设定点击间隔时间;(4点击!开始按钮开始运行程序,实现鼠标左键连续点击;(5用热键!C trl+F2结束鼠标的点击;(6按!退
20、出按钮退出程序同时注销热键.5 小结本文所介绍的这种在VC+6.0中实现的鼠标自动点击器,能利用摄像头提供的软件,不断点击其操作界面上的拍摄按键,自动采集图像并存储,解决了图像识别中图像的自动采集问题;再利用运行的VC+图像识别系统,进行图像识别和显示识别结果,实现了图像采集、识别、和显示的全自动化.另外,本程序只是根据需要设置了左键连续单击,也可以根据自己的需要在此框架的基础上加一定的代码来完成特定的功能,比如左键双击、右键单双击等.显然这种方法在其他提供图形操作界面、用手动点击鼠标执行程序的场合,以及在利用鼠标自动点击来执行对应按键的功能程序中,均有一定的参考价值.参考文献:1(美David J.K rugli
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子支付安全技术与风险控制方案
- 人教版一年级下册小学语文教学计划
- 陕西单招大专试题真题及答案
- 乐理一级考试试卷及答案
- 血透室停水应急预案
- 2025年临床执业医师《外科》阶段测试卷
- 医保基金监管专项整治迎检培训试题及答案
- 物业文员考试题及答案
- 医疗器械从业人员职业道德培训试题及答案
- 医疗行风建设三基三严考试题库及答案
- 胎盘早剥的超声诊断
- QC成果提高外墙真石漆一次验收合格率
- 小婉管乐小品《遇人不赎》台词剧本手稿
- 旅行社运营实务电子课件 1.2 了解旅行社核心业务部门
- LY/T 1300-2005工业单宁酸
- JJF 1458-2014磁轭式磁粉探伤机校准规范
- 99S203 消防水泵接合器安装图集
- JJF 1321-2011 元素分析仪校准规范-(高清现行)
- 中小学生防溺水安全教育PPT课件【爱生命防溺水】
- 第二章吸附分离功能高分子
- 八宅八星详解及化煞方法
评论
0/150
提交评论