亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        袁智勇 劉文林

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

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

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

        1? 引言

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

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

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

        (3)將識(shí)別出來(lái)的文字反饋給用戶(hù)。

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

        2? 開(kāi)發(fā)平臺(tái)和工具

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

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

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

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

        4? Leptonica位圖

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

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

        W是圖像水平像素?cái)?shù)量,h是圖像垂直像素?cái)?shù)量,bpp是每個(gè)像素的bit長(zhǎng)度。

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

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

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

        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類(lèi)的成員函數(shù)Bitmap:: LockBits來(lái)獲取位圖數(shù)據(jù)。但要注意的是,從Bitmap對(duì)象獲取的位圖數(shù)據(jù)不能直接拷貝到Pix::data字段中去。這是因?yàn)镚DI+的位圖數(shù)據(jù)格式和Leptonica的位圖數(shù)據(jù)格式是不同的。

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

        其次,Windows位圖數(shù)據(jù)可以是bottom-up(上下顛倒)的,意思是圖像的最后一行像素存儲(chǔ)在位圖數(shù)據(jù)的第一行,第一行數(shù)據(jù)反而存儲(chǔ)在位圖數(shù)據(jù)的最后一行。而leptonica的位圖數(shù)據(jù)都是top-down(從上往下)的,意思是圖像的第一行像素存儲(chǔ)在位圖數(shù)據(jù)的第一行,最后一行數(shù)據(jù)存儲(chǔ)在位圖數(shù)據(jù)的最后一行。如果Windows位圖數(shù)據(jù)是bottom-up的(這種情況非常少),必須相應(yīng)地調(diào)整像素行的存儲(chǔ)順序。下面是相應(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入門(mén)經(jīng)典[M].5版.北京:清華大學(xué)出版社, 2010.

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

        国产成人av在线影院无毒| 曰本女人与公拘交酡| 无遮无挡爽爽免费毛片| 亚洲аv天堂无码| 色偷偷亚洲av男人的天堂| 极品尤物在线精品一区二区三区 | 中文字幕精品永久在线| 亚洲精品中文字幕导航| 乱码丰满人妻一二三区| 99久久综合狠狠综合久久 | 日韩性感av一区二区三区| 成人日韩精品人妻久久一区| 国产午夜福利100集发布| 国产一区二区精品在线观看 | 国产亚洲精久久久久久无码苍井空| 国产91熟女高潮一曲区| 久久中文字幕人妻淑女| 国产精品视频露脸| 亚洲免费av电影一区二区三区| 免费高清日本一区二区| 美女国产毛片a区内射| 国产呦系列呦交| 中文字幕久久精品波多野结百度| 亚洲中文字幕视频第一二区| 成年性生交大片免费看| 精品无码国产污污污免费网站| 国产午夜av一区二区三区| 亚洲精品一区三区三区在线| 熟妇激情内射com| 亚洲国产欧美日韩一区二区| 人妻系列少妇极品熟妇| 亚洲av成人无码久久精品老人| 中国猛少妇色xxxxx| 3亚洲日韩在线精品区| 二区视频在线免费观看| 亚洲一区二区三区播放| 久久天天爽夜夜摸| 中文字幕一区二区三区6| 国产精品亚洲片在线观看不卡| 99久久久无码国产精品免费砚床 | 人妻少妇哀求别拔出来|