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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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是獲取當前光標屏幕坐標的指針向量.其中l(wèi) p Po i n.t x為水平坐標,l p Po i n.t y為垂直坐標.1.2 移動光標確定了拍攝按鈕的位置,還必須要把光標移到此位置,才有可能對它進行操作.這一步驟要求鼠標能由系統(tǒng)操縱,無論當前光標在哪里,系統(tǒng)都要把它自動地移到指定位置處.這一任務可由函數(shù)Set C ur sorPos(i n tX,intY來實現(xiàn),用該函數(shù)可以將鼠標移到屏幕上的任何地方.參數(shù)

5、X和Y,表示目標位置在屏幕上的坐標,X是水平坐標,Y是垂直坐標,這里X、Y是由GetCursor Pos獲得的,所以,X=lpPo in.t x, Y=l p Po i n.t y.1.3 模擬鼠標事件鼠標移動到了指定的拍攝按鈕處,還必須進行鼠標事件的模擬,也就是模擬鼠標左鍵單擊,實現(xiàn)拍照任務.用來實現(xiàn)這一功能的函數(shù)是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 鼠標輪子轉動的數(shù)量,dwExtraI nfo一個關聯(lián)鼠標動作輔加信息,dwFlags是真正模擬鼠標事件的參數(shù),對它的利用可以真正發(fā)揮鼠標的功能.主要鼠標事件見表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 連續(xù)點擊給鼠標點擊事件發(fā)送一次消息,可以模擬鼠標一次點擊,拍攝到一張圖片.但是要實現(xiàn)圖像的連續(xù)采集,必須不停地發(fā)送同一個消息.Set T i m er 函數(shù)可以實現(xiàn)每隔一段時間執(zhí)行一次任務,消息的反復發(fā)送可以用它來實現(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當使用Set T i m er 函數(shù)的時候,會生成一個計時器.函數(shù)中nI DEvent 是計時器的標識.nE lapse 是時間間隔,指每隔多長時間觸發(fā)一次事件,以毫秒為單位,-1為關閉定時器.第三個參數(shù)是一個回調(diào)函數(shù),在這個函數(shù)里,放入要做的事情的代碼,如將它設定為NULL ,就是使用系統(tǒng)默認的回調(diào)函數(shù),系統(tǒng)默認的是onT i m e 函數(shù).onT i m e 函數(shù)需要在計時器所在的類中生成.用C lass W izard ,添加WM _T I M E 消息映射,系統(tǒng)會自動生成onT i m e 函數(shù).然后在函數(shù)里添加實現(xiàn)鼠標點擊的代碼.這樣每隔nE

9、lapse 時間,系統(tǒng)就會發(fā)送一次消息,執(zhí)行一次鼠標點擊操作.需要停止點擊的時候,就要撤銷定時器,用函數(shù)K ill T i m er(HWND h W nd ,U I N T uI D Event ,uI DEvent 指的是定時器號.計時器是較為耗費系統(tǒng)資源的,在程序結束的時候,必須銷毀它以釋放系統(tǒng).2 界面與相關程序本應用程序是使用VC +6.0建立的基于對話框的應用程序,工程名為AutoC lick .整個程序的主界面如圖1所示. 圖1 程序主界面主要程序代碼如下:vo i d CAu to C li ckDlg :OnBu ttonT i m e Y es (/點擊時間間隔確認處理函數(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(/點擊時間間隔取消處理函數(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、始點擊按鈕處理函數(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ù)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 獲得一個固定的鼠標點擊位置;二是怎樣停止鼠標的點擊事件.說這兩個問題特殊,是因為在本應用程序中鼠標已經(jīng)被操縱,無法再利用鼠標來完成這兩件事.3.1 固定鼠標點擊位置已知Get C ursor Pos 函數(shù)得到的是當前鼠標位置的屏幕坐標值,這里有兩個要求:第一,無論鼠標是在哪個應用程序窗口,都能正確返回此時的坐標值;第二,無論鼠標點擊器是前臺運行還是后臺運行

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

14、do w s 熱鍵,發(fā)送一個(WM _HOT KEY 消息,在消息處理函數(shù)On H ot K ey (中執(zhí)行G et C urso r Pos ,從而準確得到鼠標處屏幕坐標.3.2 停止點擊對于停止鼠標點擊同樣如此.因為在執(zhí)行鼠標點擊的過程中,鼠標已被程序控制,這時我們并不能手工自由移動它.和上述講的得到鼠標位置一樣,這時31還是要用W indo w s熱鍵.定義一個熱鍵,按下此鍵,執(zhí)行消息處理函數(shù)On H o t K ey(來停止鼠標點擊.3.3 注冊熱鍵及相關程序注冊熱鍵是用函數(shù)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/該敏感鍵的鍵值.由于將系統(tǒng)熱鍵都注冊到系統(tǒng),因此必須在服務程序退出之前將其卸載,否則將導致下次注冊時的失敗.函數(shù)U nreg ister H o t K ey(負責完成對系統(tǒng)熱鍵的釋放.在VC+6.0中,大多數(shù)的窗口消息可以從C lass W izard中找到.但是一些不常用的消息在C lass W izard中并沒有封裝,熱鍵處理消息(WM_HOTKE Y就是其中之一,所以原本那些由類向導所自動生成的代碼也必須由用戶編寫了.具

16、體步驟如下:(1聲明熱鍵消息處理函數(shù)原型.在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消息與相應處理函數(shù).在C Au to C lickD l g. cpp中加入消息映射宏,使消息與相應處理函數(shù)發(fā)生關系,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 trl+F1獲得鼠標位置.Regi s t er H ot K ey(m_h W nd,0xB4EF,M OD_CONTROL,VK_F2; /注冊熱鍵C trl+F2停止鼠標點擊.(4處理熱鍵.在消息處理函數(shù)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消息映射函數(shù)OnDestroy( ,程序運行完畢后解除熱鍵.利用CLASS W IZ ARD 在C A uto C lickD l g類中創(chuàng)建一個響應WM_DESTROY 消息的函數(shù)OnD

19、 estroy(的框架.在OnD estroy(中通過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 應用程序的操作綜上所述,本應用程序操作步驟有:(1使用前先用!注冊按鈕注冊熱鍵,注冊成功后可看到OK 項選中;(2把鼠標移動到所要點擊對象的位置,使用熱鍵!C trl+F1獲取光標的位置;(3設定點擊間隔時間;(4點擊!開始按鈕開始運行程序,實現(xiàn)鼠標左鍵連續(xù)點擊;(5用熱鍵!C trl+F2結束鼠標的點擊;(6按!退

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

溫馨提示

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

評論

0/150

提交評論