• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

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

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

      袁智勇 劉文林

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

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

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

      1? 引言

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

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

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

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

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

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

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

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

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

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

      4? Leptonica位圖

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

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

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

      不過這個(gè)庫函數(shù)構(gòu)建的Pix對(duì)象只是個(gè)框架,對(duì)象的一些字段是空的,還需進(jìn)一步初始化。其中最重要的是Pix::data字段,這個(gè)字段指向的緩存用于存儲(chǔ)位圖數(shù)據(jù)。如果我們將屏幕截圖保存下來的位圖數(shù)據(jù)拷貝到Pix對(duì)象中,并完成其他一些必要的初始化操作,就可以在內(nèi)存中構(gòu)造一個(gè)完整的Pix對(duì)象,用于tesseract文字識(shí)別,無需進(jì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類的成員函數(shù)Bitmap:: LockBits來獲取位圖數(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ǔ)顏色?,F(xiàn)在原始圖像的一般是每像素24bit長,但為了和32bit的CPU字長對(duì)齊,實(shí)際上一般將24bit的像素?cái)U(kuò)張到32bit來存儲(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ù)丟失,但這無關(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入門經(jīng)典[M].5版.北京:清華大學(xué)出版社, 2010.

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

      长汀县| 芒康县| 弥勒县| 肥东县| 康乐县| 包头市| 凤翔县| 通海县| 衡山县| 类乌齐县| 湘潭县| 吉林省| 正镶白旗| 留坝县| 北辰区| 东乌| 含山县| 三原县| 靖西县| 兴文县| 旺苍县| 墨玉县| 松溪县| 察雅县| 连江县| 安义县| 利川市| 亚东县| 蕲春县| 大悟县| 丹巴县| 金秀| 贵德县| 上饶市| 永兴县| 赤壁市| 铁力市| 柳林县| 都江堰市| 阿鲁科尔沁旗| 稷山县|