opencv与tesseract

1、cv::Mat 和 IplImage 的转换

IplImage是OpenCV中C语言的图像类型; cv::Mat是OpenCV中C++语言的图像类型;

1. cv::Mat -> IplImage

cv::Mat matimg = cv::imread ("heels.jpg");

IplImage* iplimg;

*iplimg = IplImage(matimg);

2. IplImage -> cv::Mat

IplImage* iplimg = cvLoadImage("heels.jpg");

cv::Mat matimg;

matimg = cv::Mat(iplimg);


2、图像二值化

将图片转化为黑底白字的图片,便于tesseract进行识别

一. 关键函数介绍

下面就介绍OpenCV中对图像进行二值化的关键函数——cvThreshold()

函数功能:采用Canny方法对图像进行边缘检测

函数原型:

void cvThreshold(

  const CvArrsrc,

  CvArrdst,

  double threshold,

  double max_value,

  int threshold_type

);

函数说明:

第一个参数表示输入图像,必须为单通道灰度图。

第二个参数表示输出的边缘图像,为单通道黑白图。

第三个参数表示阈值

第四个参数表示最大值。

第五个参数表示运算方法。

OpenCVimgproc\types_c.h中可以找到运算方法的定义。

/* Threshold types */

enum

{

    CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */

    CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */

    CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */

    CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */

    CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */

    CV_THRESH_MASK        =7,

    CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */

};

注释已经写的很清楚了,因此不再用中文来表达了。

二. 示例程序代码

下面给出对图像进行二值化的完整的源代码:

[cpp]  view plain  copy
  1. //图像的二值化  
  2. //By MoreWindows (http://blog.csdn.net/MoreWindows)  
  3. #include   
  4. using namespace std;  
  5.   
  6. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  7.   
  8. IplImage *g_pGrayImage = NULL;  
  9. IplImage *g_pBinaryImage = NULL;  
  10. const char *pstrWindowsBinaryTitle = "二值图(http://blog.csdn.net/MoreWindows)";  
  11.   
  12. void on_trackbar(int pos)  
  13. {  
  14.     // 转为二值图  
  15.     cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);  
  16.     // 显示二值图  
  17.     cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);  
  18. }  
  19.   
  20. int main( int argc, char** argv )  
  21. {     
  22.     const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";  
  23.     const char *pstrWindowsToolBarName = "二值图阈值";  
  24.   
  25.     // 从文件中加载原图  
  26.     IplImage *pSrcImage = cvLoadImage("002.jpg", CV_LOAD_IMAGE_UNCHANGED);  
  27.   
  28.     // 转为灰度图  
  29.     g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
  30.     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);  
  31.   
  32.     // 创建二值图  
  33.     g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);  
  34.   
  35.     // 显示原图  
  36.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  37.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
  38.     // 创建二值图窗口  
  39.     cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);  
  40.   
  41.     // 滑动条    
  42.     int nThreshold = 0;  
  43.     cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);  
  44.   
  45.     on_trackbar(1);  
  46.   
  47.     cvWaitKey(0);  
  48.   
  49.     cvDestroyWindow(pstrWindowsSrcTitle);  
  50.     cvDestroyWindow(pstrWindowsBinaryTitle);  
  51.     cvReleaseImage(&pSrcImage);  
  52.     cvReleaseImage(&g_pGrayImage);  
  53.     cvReleaseImage(&g_pBinaryImage);  
  54.     return 0;  
  55. }  
  56. 运行结果如下所示,读者可以到下载源文件和程序(Release版本,不用安装OpenCV也能使用),自己动手调试下阈值大小,看看生成的二值图有什么变化。

     

    OpenCV还有个cvAdaptiveThreshold()函数,这个函数会使用Otsu算法(大律法或最大类间方差法)(注1)来计算出一个全局阈值,然后根据这个阈值进行二值化。当然直接使用上一篇《【OpenCV入门指南】第三篇Canny边缘检测》中的cvCanny()函数也可以对图像进行二值化(想到怎么传参数了吗?)。

    1.调用cvThreshold()时传入参数CV_THRESH_OTSU也是使用Otsu算法来自动生成一个阈值。



你可能感兴趣的:(tesseract-ocr,openCV)