窗體監聽006:利用OCR圖像識別技術來獲取數據
經過前幾章的學習,我們瞭解一些簡單的窗體文本信息如何獲取。但是在實際應用中並不是所有的窗體都能被Microsoft Spy++所識別,比如我們常見的WinRAR解壓軟件內容窗口就是一個整體,我們無法通過窗口節點來獲取其中壓縮的內容。就如下圖中的Celerys我們通過Microsoft Spy++只能獲取到其父級的窗口句柄信息,像這種情況我們就無法通過前面的知識來提取你想要的內容了。
遇到這種情況我們就需要更強大的功能來幫助我們實現數據的採集,那就是圖像識別技術它可以幫助我們解析提取圖片中的內容。首先我們還是需要通過句柄來獲取到你數據所在的窗口,然後對該窗體進行截圖。由於圖像識別是一個複雜的識別過程,為了能讓圖片識別效率更高我們需要對圖片進行截取來剔除掉無用的部分以提高識別的效率。現在已經有很多開源的圖像識別工具,我們只要利用這些現成的圖像識別技術將圖片中的數據提取出來即可。
首先我們還是來獲取指定窗口的句柄,利用Microsoft Spy++查看窗口對應的類名及標題名稱先獲取到程序的窗體。再通過窗體句柄來獲取窗口句柄,在SysListView32類下面還有個SysHeader32窗口,這個窗口指向的是列表的表頭我們不需要獲取。
獲取窗口大小在獲取窗口圖片之前我們需要先來獲取窗口的大小,這裏我們通過GetClientRect方法來實現。這個也是“user32.dll”中提供的函數,我們添加個函數聲明就可以直接使用了。先聲明一個struct結構體來存放窗口的座標值,利用座標值來計算窗口的大小。
這裏我們需要通過獲得hWnd指定窗口的客户區域的設備環境來創建Bitmap圖像,創建圖像需要利用到gdi32.dll中的CreateCompatibleBitmap和CreateCompatibleDC來實現。這裏需要注意的是需要需要轉成ARGB模式,也就是在RGB色彩模式上附加Alpha(透明度)通道。這樣可以給圖片加亮,提高圖片的識別率。
圖片越大識別起來就越花時間,所以我們在截取到窗口的圖片之後需要對圖片進行二次處理。這裏可以利用Bitmap中的Clone方法來實現圖片的截取,提供截取的開始座標和圖片的長寬即可拿到想要的內容。
最後就是圖像識別了,我們可以利用像Tesseract等光學字符識別庫來實現對圖像的內容識別處理。在NuGet包管理器中搜索Tesseract並安裝,Tesseract支持很多種語言,根據你的需要下載對應的語言包放到項目的tessdata文件夾裏面,實例化Tesseract的時候引入tessdata及使用的語言即可。通過Process方法返回一個Page對象,該對象可以獲得識別的文本,也可以獲得識別文本所在位置。PageSegMode參數設置識別模式,SingleLine表示單行識別。
這裏需要注意的是被採集窗口不能最小化,否則無法獲取到窗口的座標值,這樣獲取圖片的時候就會報“內存不足”的錯誤。
這裏我們發現識別的結果不是很理想(Celerys識別成了Ce‘elys)而且也彈出了警告信息(Parameter not found),參數設置可以在初始化Tesseract組件的時候通過SetVariable屬性進行設置。圖像識別準確率低可能是圖片沒做好處理,前面對圖像進行ARGB轉換和切圖就是為了提高Tesseract的識別效率,看來需要去深入研究Tesseract來訓練自己的識別庫了。
是一個開源的OCR(Optical Character Recognition,光學字符識別)引擎,可以識別各種格式的圖像並將它們轉化成超過60種語言的文本(不能識別手寫內容),同時還可以不斷訓練自己的庫使圖像轉換文本的能力不斷增強。tessdata目錄存放的是語言字庫及配置文件,用來實現轉換不同的語言文本。以上內容是小編給大家分享的【窗體監聽006:利用OCR圖像識別技術來獲取數據】,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。
【來源:編程手札】
聲明:轉載此文是出於傳遞更多信息之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與本網聯繫,我們將及時更正、刪除,謝謝。 郵箱地址:newmedia@xxcb.cn