999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Windows位圖和Leptonica位圖的轉(zhuǎn)換

2019-03-08 14:22:47袁智勇劉文林
科技創(chuàng)新導(dǎo)報 2019年30期

袁智勇 劉文林

摘? ?要:很多屏幕文字識別應(yīng)用把截屏后的數(shù)據(jù)保存為圖片文件,然后從硬盤上讀取圖片文件進(jìn)行文字識別,這種做法效率很低。本文介紹了Windows位圖和Leptonica位圖格式的不同特點,提出了一套簡便的,在內(nèi)存中進(jìn)行轉(zhuǎn)換的方法。這使得直接在內(nèi)存中識別文字成為可能,省去在硬盤上存取圖片文件的步驟,從而大大提高屏幕文字識別應(yīng)用的效率。

關(guān)鍵詞:屏幕文字識別? tesseract? leptonica? GDI+? 位圖數(shù)據(jù)轉(zhuǎn)換

中圖分類號:TP391.4? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?文獻(xiàn)標(biāo)識碼:A? ? ? ? ? ? ? ? ? ? ? ? 文章編號:1674-098X(2019)10(c)-0113-02

1? 引言

有一類屏幕文字識別應(yīng)用,其流程是這樣的:

(1)屏幕截圖,將包含文字的截圖保存為圖片文件。

(2)調(diào)用文字識別模塊,讀取保存好的圖片文件,識別其中包含的文字。

(3)將識別出來的文字反饋給用戶。

在上述過程中,截圖須保存到硬盤上,然后由文字識別模塊讀取識別。這就涉及硬盤文件的讀寫,而硬盤文件的讀寫相對來說比較慢。很多情況下,保存下來的截圖并沒有其他用途,這樣一來不但增加了一些無謂的開銷,而且也拖慢了應(yīng)用的整體響應(yīng)速度。如果能將保存在內(nèi)存中的截圖數(shù)據(jù)直接發(fā)送到文字識別模塊,略去存取文件的過程,無疑是最佳的。這正是本文要解決的問題。

2? 開發(fā)平臺和工具

應(yīng)用平臺為Windows 7以上Windows操作系統(tǒng)。開發(fā)工具為集成于Visual Studio中的Visual C++。因為目前的Windows API(編程接口)并不直接支持文字識別,需要為Visual C++安裝支持文字識別的擴(kuò)展包——tesseract。之所以使用tesseract,一是它是免費開源軟件,可以免費使用;同時,雖然它是一款免費開源軟件,但其文字識別率非常高,不次于同檔次商業(yè)軟件。

Tesseract是在Linux平臺上開發(fā)的,要移植到Windows平臺,需要的步驟相當(dāng)繁瑣,而且容易出錯。幸運(yùn)的是微軟專門開發(fā)了一款稱為vcpkg的軟件,專門用于從Linux平臺移植軟件。通過vcpkg安裝好tesseract擴(kuò)展包后,還需下載對應(yīng)語言的訓(xùn)練數(shù)據(jù)(training data),這是文字識別的支撐數(shù)據(jù)庫。

3? 使用tesseract進(jìn)行文字識別

通過調(diào)用tesseract API,可以以編程的方式實現(xiàn)文字識別。Tesseract API的核心功能封裝于TessBaseAPI類中,通過其成員函數(shù)GetUTF8Text完成文字識別,使用起來非常簡單方便。在調(diào)用GetUTF8Text前需要進(jìn)行一些初始化操作,其中一步就是讀取硬盤上的包含文字的圖像文件,構(gòu)造一個Pix對象。然后以這個Pix對象為參數(shù)調(diào)用SetImage成員函數(shù),為TessBaseAPI指定要識別的圖像。

4? Leptonica位圖

Tesseract沒有為一些基本的圖像處理,比如圖像文件的存取開發(fā)相應(yīng)的庫函數(shù),而是借用了Leptonica。Leptonica也是一款著名的Linux下的免費開源軟件,專門用于基本的圖像處理,包括圖像文件的存取、格式轉(zhuǎn)換、圖像變換等。在Leptonica中,圖像被封裝成Pix類。除了讀取硬盤上的圖像文件來構(gòu)造Pix對象,也可以從內(nèi)存中的圖像數(shù)據(jù)來構(gòu)造Pix對象,比如通過下面的庫函數(shù):

Pix * px = pixCreate(w, h, bpp);

W是圖像水平像素數(shù)量,h是圖像垂直像素數(shù)量,bpp是每個像素的bit長度。

不過這個庫函數(shù)構(gòu)建的Pix對象只是個框架,對象的一些字段是空的,還需進(jìn)一步初始化。其中最重要的是Pix::data字段,這個字段指向的緩存用于存儲位圖數(shù)據(jù)。如果我們將屏幕截圖保存下來的位圖數(shù)據(jù)拷貝到Pix對象中,并完成其他一些必要的初始化操作,就可以在內(nèi)存中構(gòu)造一個完整的Pix對象,用于tesseract文字識別,無需進(jìn)行圖像文件的硬盤存取操作。

5? 位圖數(shù)據(jù)轉(zhuǎn)換

在Windows平臺下可以將截圖后獲得的圖像數(shù)據(jù)封裝于GDI+的Bitmap對象中:

HDC hdcScreen = GetDC(NULL);

HDC hdcMemDC = CreateCompatibleDC(hdcScreen);

HBITMAP hbmScreen = CreateCompatibleBitmap(hdcScreen, cx, cy);

SelectObject(hdcMemDC, hbmScreen);

BitBlt(hdcMemDC, 0, 0, cx, cy, hdcScreen, x0, y0, SRCCOPY);

Bitmap* bmp = new Bitmap(hbmScreen, NULL);

然后我們可以調(diào)用Bitmap類的成員函數(shù)Bitmap:: LockBits來獲取位圖數(shù)據(jù)。但要注意的是,從Bitmap對象獲取的位圖數(shù)據(jù)不能直接拷貝到Pix::data字段中去。這是因為GDI+的位圖數(shù)據(jù)格式和Leptonica的位圖數(shù)據(jù)格式是不同的。

首先,Linux平臺習(xí)慣用BGR的格式存儲顏色,而Windows平臺用RGB的個數(shù)存儲顏色。現(xiàn)在原始圖像的一般是每像素24bit長,但為了和32bit的CPU字長對齊,實際上一般將24bit的像素擴(kuò)張到32bit來存儲。多出的1字節(jié)空間可以不用,也可以存儲Alpha通道數(shù)據(jù)。因此Windows平臺顏色數(shù)據(jù)的格式為ARGB,而Linux平臺數(shù)據(jù)的格式為ABGR。另外,Linux平臺內(nèi)存中數(shù)據(jù)是以big-endian方式存儲的,最低位的R數(shù)據(jù)存儲在32bit數(shù)據(jù)的最高1個字節(jié),最高位的A數(shù)據(jù)存儲在32bit數(shù)據(jù)的最低1個字節(jié)。因此,最終像素顏色的存儲格式為RGBA,這也是Leptonica在內(nèi)存中存儲顏色數(shù)據(jù)的方式。我們可以將Windows平臺的顏色數(shù)據(jù)ARGB向左移位8bit,變成RGB0。移位后A數(shù)據(jù)丟失,但這無關(guān)緊要,因為A數(shù)據(jù)一般不用(設(shè)置為0)。這樣就可以將Windows顏色數(shù)據(jù)轉(zhuǎn)換成Leptonica顏色數(shù)據(jù)RGB0。

其次,Windows位圖數(shù)據(jù)可以是bottom-up(上下顛倒)的,意思是圖像的最后一行像素存儲在位圖數(shù)據(jù)的第一行,第一行數(shù)據(jù)反而存儲在位圖數(shù)據(jù)的最后一行。而leptonica的位圖數(shù)據(jù)都是top-down(從上往下)的,意思是圖像的第一行像素存儲在位圖數(shù)據(jù)的第一行,最后一行數(shù)據(jù)存儲在位圖數(shù)據(jù)的最后一行。如果Windows位圖數(shù)據(jù)是bottom-up的(這種情況非常少),必須相應(yīng)地調(diào)整像素行的存儲順序。下面是相應(yīng)的代碼:

BitmapData bd;

bmp->LockBits(new Rect(0, 0, w, h), ImageLockModeRead, PixelFormat32bppRGB, &bd);

UINT* p = (UINT*)bd.Scan0;

if (bd.Stride < 0) p -= w * (h - 1);//Stride小于0位圖是bottom-up的,否則是top-down的

for (int i = 0; i < w * h; i++) p[i] = p[i] << 8; //顏色數(shù)據(jù)移位

參考文獻(xiàn)

[1] 周鳴揚(yáng),趙景亮.精通GDI+編程[M].北京:清華大學(xué)出版社,2004.

[2] Ivor Horton.Visual C++ 2010入門經(jīng)典[M].5版.北京:清華大學(xué)出版社, 2010.

[3] Jeffrey Richter.Windows核心編程[M].北京:機(jī)械工業(yè)出版社,2008.

主站蜘蛛池模板: 特级毛片8级毛片免费观看| 免费aa毛片| 亚洲日本中文字幕乱码中文| 91av成人日本不卡三区| 日日拍夜夜嗷嗷叫国产| 一级毛片免费观看不卡视频| 欧美a在线视频| 国产91精选在线观看| 免费视频在线2021入口| 91精品啪在线观看国产| 99久久免费精品特色大片| 一区二区三区四区日韩| 国产一区在线视频观看| 精品久久综合1区2区3区激情| 在线精品亚洲国产| 国产精品任我爽爆在线播放6080 | 国产午夜精品鲁丝片| 色爽网免费视频| 亚洲一区二区无码视频| 日本免费一区视频| 欧美国产日韩另类| 99人妻碰碰碰久久久久禁片| 亚洲欧美日韩视频一区| 国产成人免费手机在线观看视频| 亚洲三级a| 亚洲欧美激情另类| 亚洲精品无码久久毛片波多野吉| 欧美成人区| 天天干伊人| 日韩欧美国产成人| 毛片大全免费观看| 亚洲AⅤ综合在线欧美一区| 在线中文字幕日韩| 大香网伊人久久综合网2020| 天堂亚洲网| 国产精品手机在线播放| h网站在线播放| swag国产精品| 永久免费无码日韩视频| 亚洲男人天堂2018| 91精品综合| 91 九色视频丝袜| 亚洲人成色在线观看| 亚洲一区二区三区国产精品| 国产精品任我爽爆在线播放6080| 亚洲高清资源| 伊人天堂网| 在线精品欧美日韩| 日本欧美在线观看| 色窝窝免费一区二区三区| 中字无码精油按摩中出视频| 国产午夜精品鲁丝片| 2024av在线无码中文最新| 国产精品漂亮美女在线观看| 免费毛片a| 亚洲天堂啪啪| 国产日本欧美在线观看| 亚洲三级a| 亚洲最新在线| 亚洲人成人无码www| 亚洲无码高清一区二区| 热这里只有精品国产热门精品| 久久综合色视频| 亚洲国产精品不卡在线| 亚洲第一视频免费在线| 国产手机在线观看| 国产一级视频久久| 久久国产精品国产自线拍| 久久精品人妻中文视频| 欧美精品v欧洲精品| 5555国产在线观看| 视频一本大道香蕉久在线播放| 亚洲资源在线视频| 制服丝袜在线视频香蕉| 色呦呦手机在线精品| 国产区免费| 2021亚洲精品不卡a| 国产成a人片在线播放| 好吊妞欧美视频免费| 天堂成人在线| 尤物特级无码毛片免费| 72种姿势欧美久久久大黄蕉|