之前一个扫描验证码的小程序,有使用到一google的开源ocr组件,很不幸的是这个组建里面没有直接支持jpg

图片的ocr,但我们的目标很多都用的是jpg格式的图片。我需要把目标转换成bmp格式才能提交给tessdll处理。

 

之间还有降噪,区域分割等部分处理,之前有一写文件IO的部分在里面,导致程序运行效率不是很好,今天我试了一下 CxImage 这个同样开源的图像处理组建,哈哈 果然它就是我需要的。可以直接load内存里面的图片数据,进行ocr前的数据处理以提高ocr的精度。

 

到目前为止一切进行的都很好,当我把 CxImage中的数据提交给tesseract组件后我得到了"~"。识别不出来。于是又仔细的看了一下tsseract中 dlltest工程中的调用细节。发现里面内置的那个BMP的读取过程默默的为我们做了两件事情。这也就是我们今天要注意的两件事情:

1)把BMP图片里面的数据行进行了倒序。在Windows里BMP仿佛是从最后一行开始处理的。

在这里我们需要对BMP的数据行 就行倒序操作。

 

2)BMP图片格式中数据是4个字节对齐的,是的这样可以提高访问的效率。也就是说对于BMP中的单行

数据来说。如果这一行数据的长度不是4的整数倍的话,后面自动补齐成4字节对齐的。这个当然没有问题

        但是我们把图片数据传递给tesseract的时候这个自动补齐的部分是不能包含在里面的。我们要把它们去掉

即我们必须只保留那些真正表示图片内容的数据。

 

        tesseract里面用 stride 来表示这个值 正确的得到这个值也是这个过程里面的关键。

至于如何正确的得到这个值可以在 tesseract的示例工程中找到。

        

if (iBpp > 8)

{

iStride = (iWidth * iBpp + 7) / 8 ;

}

else

{

iStride = (iWidth + 8/iBpp -1) / (8 / iBpp) ;

}

 

其中iBpp 是 BMP中的 bpp值,iWidth 为图像的相熟宽度。

 

        做好这两点,我们就可以利用CxImage的便利处理各种格式的图片了。哈哈 enjoy it~!

 

        好记性不如烂笔头,记录下来提醒自己。

 

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐