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.

主站蜘蛛池模板: 再看日本中文字幕在线观看| 欧美亚洲国产一区| 91欧美亚洲国产五月天| 高潮毛片免费观看| 波多野结衣一区二区三视频| 亚洲一区免费看| 亚洲成人黄色网址| 国产v精品成人免费视频71pao | 精品国产免费观看| 免费xxxxx在线观看网站| 丰满人妻久久中文字幕| 国产噜噜噜| 六月婷婷激情综合| 亚洲中文字幕在线观看| 亚洲bt欧美bt精品| 亚洲日韩精品欧美中文字幕| 人人澡人人爽欧美一区| 91麻豆国产视频| 狠狠做深爱婷婷综合一区| 欧美成人国产| 亚洲色婷婷一区二区| 亚洲国产精品美女| 亚洲精品视频免费看| 天堂在线亚洲| 欧美日韩激情在线| 丝袜久久剧情精品国产| 最新亚洲av女人的天堂| 亚洲色图欧美激情| 秋霞午夜国产精品成人片| 欧亚日韩Av| 免费看av在线网站网址| 人妻一区二区三区无码精品一区| 国产精品 欧美激情 在线播放 | 成人噜噜噜视频在线观看| 国产嫩草在线观看| 亚洲va在线∨a天堂va欧美va| 99精品在线视频观看| 毛片一区二区在线看| 国产农村妇女精品一二区| 国产成人精品高清不卡在线| 日本精品一在线观看视频| 综合人妻久久一区二区精品| 视频国产精品丝袜第一页| 国产精品福利导航| 日韩精品成人在线| 亚洲综合第一区| 九九热在线视频| 免费在线播放毛片| 视频一区视频二区中文精品| 国产精品女人呻吟在线观看| 福利国产微拍广场一区视频在线| 久久综合亚洲鲁鲁九月天| 国产白浆一区二区三区视频在线 | 国产成人91精品| 亚洲天堂网视频| 婷婷亚洲视频| 99这里只有精品免费视频| 77777亚洲午夜久久多人| 欧美综合中文字幕久久| 亚洲欧州色色免费AV| 国产日韩精品欧美一区喷| 九九热精品视频在线| 一级毛片免费播放视频| 亚洲五月激情网| 四虎成人精品| 久久亚洲黄色视频| 影音先锋丝袜制服| 欧美激情伊人| 欧美色视频日本| 亚洲天堂视频在线观看免费| 福利姬国产精品一区在线| 国产精品综合久久久| 日韩av在线直播| 成人亚洲国产| 日本精品视频| 中文精品久久久久国产网址| 伊人久久青草青青综合| 国产理论精品| 99热这里只有精品国产99| 国产精品不卡永久免费| 国产人成在线观看| 国产成人综合欧美精品久久|