攝像頭圖像自動(dòng)采集的實(shí)現(xiàn)_第1頁(yè)
攝像頭圖像自動(dòng)采集的實(shí)現(xiàn)_第2頁(yè)
攝像頭圖像自動(dòng)采集的實(shí)現(xiàn)_第3頁(yè)
攝像頭圖像自動(dòng)采集的實(shí)現(xiàn)_第4頁(yè)
攝像頭圖像自動(dòng)采集的實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第29卷第12期通化師范學(xué)院學(xué)報(bào)Vo.l29 12 2008年12月J OURNAL OF TONGHUA TE AC HERS C OLLEGE Dec.2008攝像頭圖像自動(dòng)采集的實(shí)現(xiàn)劉 鈞(洛陽(yáng)理工學(xué)院現(xiàn)代教育中心,河南洛陽(yáng)471023摘 要:該文就圖像識(shí)別系統(tǒng)中攝像頭圖像的自動(dòng)采集問(wèn)題,介紹了一種在VC+6.0中實(shí)現(xiàn)的鼠標(biāo)自動(dòng)點(diǎn)擊器的設(shè)計(jì)方法,進(jìn)而解決自動(dòng)拍照問(wèn)題,實(shí)現(xiàn)了圖像識(shí)別系統(tǒng)的全自動(dòng)化.文中詳細(xì)說(shuō)明了自動(dòng)定位點(diǎn)擊對(duì)象、模擬鼠標(biāo)事件、設(shè)定點(diǎn)擊的速度等功能的實(shí)現(xiàn)方法,并給出了相關(guān)程序.并就兩個(gè)特殊問(wèn)題進(jìn)行了探討.關(guān)鍵詞:攝像頭圖像;自動(dòng)采集;VC+6.0;API函數(shù);自動(dòng)點(diǎn)擊中圖分

2、類號(hào):TP317.4 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1008-7974(200812-0030-03收稿日期:2008-05-28作者簡(jiǎn)介:劉鈞(1978-,女,洛陽(yáng)理工學(xué)院現(xiàn)代教育中心講師.在W I N DO W S系統(tǒng)下的圖像識(shí)別系統(tǒng)中,需要用一臺(tái)計(jì)算機(jī)實(shí)現(xiàn)圖像采集、識(shí)別、結(jié)果顯示等任務(wù).要采集圖像就要運(yùn)行攝像頭提供的軟件,點(diǎn)擊拍攝按鈕完成拍照.要完成圖像識(shí)別、結(jié)果顯示就需要運(yùn)行用戶編制的用于圖像處理和顯示結(jié)果的VC+ +可執(zhí)行文件.由于攝像頭只提供EXE文件,在CRT上顯示的軟件圖形操作界面,需要手動(dòng)點(diǎn)擊鼠標(biāo)左鍵才能完成拍攝像片的工作,這一手工的勞動(dòng)不僅浪費(fèi)了我們大量的時(shí)間和精力,而且也不能

3、完成圖像采集、識(shí)別、結(jié)果顯示的全自動(dòng)化.如果設(shè)計(jì)一個(gè)鼠標(biāo)自動(dòng)點(diǎn)擊器,來(lái)完成自動(dòng)點(diǎn)擊操作,這一問(wèn)題就可以得到完美的解決.本文設(shè)計(jì)的鼠標(biāo)自動(dòng)點(diǎn)擊器是用VC+6.0實(shí)現(xiàn)的,使用它既可以利用現(xiàn)有的EXE文件,單獨(dú)運(yùn)行,又可以把它嵌入到相關(guān)程序中去,減少不必要的開發(fā)時(shí)間.1 程序設(shè)計(jì)步驟需要解決的基本問(wèn)題包括:定位光標(biāo)、移動(dòng)光標(biāo)、模擬鼠標(biāo)事件、連續(xù)點(diǎn)擊等.1.1 定位光標(biāo)對(duì)拍攝按鈕進(jìn)行點(diǎn)擊操作,首先應(yīng)該獲得它的確切位置,也就是它在屏幕上的坐標(biāo),這是很關(guān)鍵的一步.這一步驟可由API函數(shù)Get C ursor Pos來(lái)實(shí)現(xiàn). Get C ursor Pos的功能是以屏幕坐標(biāo)返回光標(biāo)的當(dāng)前位置.只要把鼠標(biāo)放在

4、按鈕處,執(zhí)行Get C ursor Pos就可以了.Get C ursor Pos的函數(shù)原型為GetCursorPos (LPPOI NT lpPo i n t,參數(shù)l p Po i n t是獲取當(dāng)前光標(biāo)屏幕坐標(biāo)的指針向量.其中l(wèi) p Po i n.t x為水平坐標(biāo),l p Po i n.t y為垂直坐標(biāo).1.2 移動(dòng)光標(biāo)確定了拍攝按鈕的位置,還必須要把光標(biāo)移到此位置,才有可能對(duì)它進(jìn)行操作.這一步驟要求鼠標(biāo)能由系統(tǒng)操縱,無(wú)論當(dāng)前光標(biāo)在哪里,系統(tǒng)都要把它自動(dòng)地移到指定位置處.這一任務(wù)可由函數(shù)Set C ur sorPos(i n tX,intY來(lái)實(shí)現(xiàn),用該函數(shù)可以將鼠標(biāo)移到屏幕上的任何地方.參數(shù)

5、X和Y,表示目標(biāo)位置在屏幕上的坐標(biāo),X是水平坐標(biāo),Y是垂直坐標(biāo),這里X、Y是由GetCursor Pos獲得的,所以,X=lpPo in.t x, Y=l p Po i n.t y.1.3 模擬鼠標(biāo)事件鼠標(biāo)移動(dòng)到了指定的拍攝按鈕處,還必須進(jìn)行鼠標(biāo)事件的模擬,也就是模擬鼠標(biāo)左鍵單擊,實(shí)現(xiàn)拍照任務(wù).用來(lái)實(shí)現(xiàn)這一功能的函數(shù)是m ouse_even,t 它可以模擬鼠標(biāo)的全部操作.m ouse_event完整形式為:m ouse_event(dwF lags,dx,dy,c Buttons,dwEx traI n fo,dx指定水平方向的絕對(duì)位置或相對(duì)運(yùn)動(dòng), dy指定垂直方向的絕對(duì)位置或相對(duì)運(yùn)動(dòng),cBu

6、ttons 鼠標(biāo)輪子轉(zhuǎn)動(dòng)的數(shù)量,dwExtraI nfo一個(gè)關(guān)聯(lián)鼠標(biāo)動(dòng)作輔加信息,dwFlags是真正模擬鼠標(biāo)事件的參數(shù),對(duì)它的利用可以真正發(fā)揮鼠標(biāo)的功能.主要鼠標(biāo)事件見表1:模擬鼠標(biāo)左鍵點(diǎn)擊是用MOUSEEVENTF_ LEFTDOWN和MOUSEEVENTF_LEFTUP.表1 主要鼠標(biāo)事件M OUSEEVENTF_M OVE移動(dòng)鼠標(biāo)M OUSEEVENTF_LEFTDO W N模擬鼠標(biāo)左鍵按下M OUSEEVENTF_LEFTUP模擬鼠標(biāo)左鍵抬起M OUSEEVENTF_R I GHTDO W N模擬鼠標(biāo)右鍵按下M OUSEEVENTF_R I GHTUP模擬鼠標(biāo)右鍵抬起M OUSEEV

7、ENTF_M I DDLEDOWN模擬鼠標(biāo)中鍵按下M OUSEEVENTF_M I DDLEUP模擬鼠標(biāo)中鍵抬起301.4 連續(xù)點(diǎn)擊給鼠標(biāo)點(diǎn)擊事件發(fā)送一次消息,可以模擬鼠標(biāo)一次點(diǎn)擊,拍攝到一張圖片.但是要實(shí)現(xiàn)圖像的連續(xù)采集,必須不停地發(fā)送同一個(gè)消息.Set T i m er 函數(shù)可以實(shí)現(xiàn)每隔一段時(shí)間執(zhí)行一次任務(wù),消息的反復(fù)發(fā)送可以用它來(lái)實(shí)現(xiàn).Set T i m er 函數(shù)的原型為: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當(dāng)使用Set T i m er 函數(shù)的時(shí)候,會(huì)生成一個(gè)計(jì)時(shí)器.函數(shù)中nI DEvent 是計(jì)時(shí)器的標(biāo)識(shí).nE lapse 是時(shí)間間隔,指每隔多長(zhǎng)時(shí)間觸發(fā)一次事件,以毫秒為單位,-1為關(guān)閉定時(shí)器.第三個(gè)參數(shù)是一個(gè)回調(diào)函數(shù),在這個(gè)函數(shù)里,放入要做的事情的代碼,如將它設(shè)定為NULL ,就是使用系統(tǒng)默認(rèn)的回調(diào)函數(shù),系統(tǒng)默認(rèn)的是onT i m e 函數(shù).onT i m e 函數(shù)需要在計(jì)時(shí)器所在的類中生成.用C lass W izard ,添加WM _T I M E 消息映射,系統(tǒng)會(huì)自動(dòng)生成onT i m e 函數(shù).然后在函數(shù)里添加實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊的代碼.這樣每隔nE

9、lapse 時(shí)間,系統(tǒng)就會(huì)發(fā)送一次消息,執(zhí)行一次鼠標(biāo)點(diǎn)擊操作.需要停止點(diǎn)擊的時(shí)候,就要撤銷定時(shí)器,用函數(shù)K ill T i m er(HWND h W nd ,U I N T uI D Event ,uI DEvent 指的是定時(shí)器號(hào).計(jì)時(shí)器是較為耗費(fèi)系統(tǒng)資源的,在程序結(jié)束的時(shí)候,必須銷毀它以釋放系統(tǒng).2 界面與相關(guān)程序本應(yīng)用程序是使用VC +6.0建立的基于對(duì)話框的應(yīng)用程序,工程名為AutoC lick .整個(gè)程序的主界面如圖1所示. 圖1 程序主界面主要程序代碼如下:vo i d CAu to C li ckDlg :OnBu ttonT i m e Y es (/點(diǎn)擊時(shí)間間隔確認(rèn)處理函數(shù)

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(/點(diǎn)擊時(shí)間間隔取消處理函數(shù)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、始點(diǎn)擊按鈕處理函數(shù)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/定時(shí)器處理函數(shù)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 特殊問(wèn)題的處理這里有兩個(gè)問(wèn)題要特殊處理:一是怎樣通過(guò)G et C urso r Pos 獲得一個(gè)固定的鼠標(biāo)點(diǎn)擊位置;二是怎樣停止鼠標(biāo)的點(diǎn)擊事件.說(shuō)這兩個(gè)問(wèn)題特殊,是因?yàn)樵诒緫?yīng)用程序中鼠標(biāo)已經(jīng)被操縱,無(wú)法再利用鼠標(biāo)來(lái)完成這兩件事.3.1 固定鼠標(biāo)點(diǎn)擊位置已知Get C ursor Pos 函數(shù)得到的是當(dāng)前鼠標(biāo)位置的屏幕坐標(biāo)值,這里有兩個(gè)要求:第一,無(wú)論鼠標(biāo)是在哪個(gè)應(yīng)用程序窗口,都能正確返回此時(shí)的坐標(biāo)值;第二,無(wú)論鼠標(biāo)點(diǎn)擊器是前臺(tái)運(yùn)行還是后臺(tái)運(yùn)行

13、,坐標(biāo)值都能有效的返回.執(zhí)行過(guò)程要求是把鼠標(biāo)放到指定位置后,發(fā)送一次消息來(lái)得到此處的坐標(biāo)值.那么這樣的消息應(yīng)該由誰(shuí)來(lái)發(fā)送?這是問(wèn)題的關(guān)鍵.由于此時(shí)鼠標(biāo)已經(jīng)放到指定位置,不能再移動(dòng),發(fā)送消息當(dāng)然不能再靠它來(lái)實(shí)現(xiàn).這種情況下用界面按鈕、菜單都不能解決問(wèn)題.如果程序不是在前臺(tái)工作,用快捷鍵也不能如愿.所以,這時(shí)就要用到W i n do w s 熱鍵.熱鍵是向W i n dow s 系統(tǒng)注冊(cè)的敏感鍵,在多個(gè)正在運(yùn)行的應(yīng)用程序中,無(wú)論是前臺(tái)程序還是后臺(tái)程序,只要用戶按下此鍵,該程序就會(huì)立即變?yōu)榍芭_(tái)程序,執(zhí)行相應(yīng)的操作.熱鍵的運(yùn)用使鼠標(biāo)得以解放,所以就可以把鼠標(biāo)放到指定位置不動(dòng),按一下自定義的W i n

14、do w s 熱鍵,發(fā)送一個(gè)(WM _HOT KEY 消息,在消息處理函數(shù)On H ot K ey (中執(zhí)行G et C urso r Pos ,從而準(zhǔn)確得到鼠標(biāo)處屏幕坐標(biāo).3.2 停止點(diǎn)擊對(duì)于停止鼠標(biāo)點(diǎn)擊同樣如此.因?yàn)樵趫?zhí)行鼠標(biāo)點(diǎn)擊的過(guò)程中,鼠標(biāo)已被程序控制,這時(shí)我們并不能手工自由移動(dòng)它.和上述講的得到鼠標(biāo)位置一樣,這時(shí)31還是要用W indo w s熱鍵.定義一個(gè)熱鍵,按下此鍵,執(zhí)行消息處理函數(shù)On H o t K ey(來(lái)停止鼠標(biāo)點(diǎn)擊.3.3 注冊(cè)熱鍵及相關(guān)程序注冊(cè)熱鍵是用函數(shù)R eg ister H o t K ey.原型為BOOL Reg ister H ot K ey(HWND h

15、 W nd/響應(yīng)該敏感鍵的窗口句柄,I nti d,/該敏感鍵的唯一標(biāo)示符, U I N Tfs M od ifi e rs/該敏感鍵的輔助按鍵,U I N T vk/該敏感鍵的鍵值.由于將系統(tǒng)熱鍵都注冊(cè)到系統(tǒng),因此必須在服務(wù)程序退出之前將其卸載,否則將導(dǎo)致下次注冊(cè)時(shí)的失敗.函數(shù)U nreg ister H o t K ey(負(fù)責(zé)完成對(duì)系統(tǒng)熱鍵的釋放.在VC+6.0中,大多數(shù)的窗口消息可以從C lass W izard中找到.但是一些不常用的消息在C lass W izard中并沒(méi)有封裝,熱鍵處理消息(WM_HOTKE Y就是其中之一,所以原本那些由類向?qū)詣?dòng)生成的代碼也必須由用戶編寫了.具

16、體步驟如下:(1聲明熱鍵消息處理函數(shù)原型.在C AutoC lickD lg.h中消息映射聲明處(AFX_m SG字樣之后加入如下語(yǔ)句:LRESULT On H ot Key(W PARA M wPara m,LP ARA M l P ara m.(2消息與相應(yīng)處理函數(shù).在C Au to C lickD l g. cpp中加入消息映射宏,使消息與相應(yīng)處理函數(shù)發(fā)生關(guān)系,ON_M ESSAGE(WM_HOTKEY,On H ot K ey.(3向系統(tǒng)登記熱鍵.在vo id C AutoC lickD l g: OnButtonR eghotkey(函數(shù)中加入如下代碼以向系統(tǒng)登記熱鍵.Regi s

17、t er H ot K ey(m_h W nd,0xB4EE,M OD_CONTROL,VK_F1;/注冊(cè)熱鍵C trl+F1獲得鼠標(biāo)位置.Regi s t er H ot K ey(m_h W nd,0xB4EF,M OD_CONTROL,VK_F2; /注冊(cè)熱鍵C trl+F2停止鼠標(biāo)點(diǎn)擊.(4處理熱鍵.在消息處理函數(shù)On H o t K ey(中對(duì)熱鍵進(jìn)行處理,并可加入用戶希望運(yùn)行的程序代碼等: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消息映射函數(shù)OnDestroy( ,程序運(yùn)行完畢后解除熱鍵.利用CLASS W IZ ARD 在C A uto C lickD l g類中創(chuàng)建一個(gè)響應(yīng)WM_DESTROY 消息的函數(shù)OnD

19、 estroy(的框架.在OnD estroy(中通過(guò)UnR eg ister H o t K ey(解除熱鍵登記,釋放系統(tǒng)資源.Unregister H ot K ey(m_h W nd,0xB4EE;Unregister H ot K ey(m_h W nd,0xB4EF;4 應(yīng)用程序的操作綜上所述,本應(yīng)用程序操作步驟有:(1使用前先用!注冊(cè)按鈕注冊(cè)熱鍵,注冊(cè)成功后可看到OK 項(xiàng)選中;(2把鼠標(biāo)移動(dòng)到所要點(diǎn)擊對(duì)象的位置,使用熱鍵!C trl+F1獲取光標(biāo)的位置;(3設(shè)定點(diǎn)擊間隔時(shí)間;(4點(diǎn)擊!開始按鈕開始運(yùn)行程序,實(shí)現(xiàn)鼠標(biāo)左鍵連續(xù)點(diǎn)擊;(5用熱鍵!C trl+F2結(jié)束鼠標(biāo)的點(diǎn)擊;(6按!退

20、出按鈕退出程序同時(shí)注銷熱鍵.5 小結(jié)本文所介紹的這種在VC+6.0中實(shí)現(xiàn)的鼠標(biāo)自動(dòng)點(diǎn)擊器,能利用攝像頭提供的軟件,不斷點(diǎn)擊其操作界面上的拍攝按鍵,自動(dòng)采集圖像并存儲(chǔ),解決了圖像識(shí)別中圖像的自動(dòng)采集問(wèn)題;再利用運(yùn)行的VC+圖像識(shí)別系統(tǒng),進(jìn)行圖像識(shí)別和顯示識(shí)別結(jié)果,實(shí)現(xiàn)了圖像采集、識(shí)別、和顯示的全自動(dòng)化.另外,本程序只是根據(jù)需要設(shè)置了左鍵連續(xù)單擊,也可以根據(jù)自己的需要在此框架的基礎(chǔ)上加一定的代碼來(lái)完成特定的功能,比如左鍵雙擊、右鍵單雙擊等.顯然這種方法在其他提供圖形操作界面、用手動(dòng)點(diǎn)擊鼠標(biāo)執(zhí)行程序的場(chǎng)合,以及在利用鼠標(biāo)自動(dòng)點(diǎn)擊來(lái)執(zhí)行對(duì)應(yīng)按鍵的功能程序中,均有一定的參考價(jià)值.參考文獻(xiàn):1(美David J.K rugli

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論