加载中…
个人资料
秦风
秦风
  • 博客等级:
  • 博客积分:0
  • 博客访问:398
  • 关注人气:2
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Tesseract-OCR识别 学习(三、C# 包装C++的dll,并调用 来识别图片)

(2016-09-01 17:20:22)
分类: OCR识别
因为后面主要是用C# winform来写的自定义截图来识别,而Tesseract-ocr主要是C++编译的dll.虽然有相应的C# dll,但是不知道具体函数怎么声明的。所以我就先用VS2013 VC调用了一次(上篇讲的就是。)发现,有3个函数要使用,而直接引用dll  会报错:
http://s15/mw690/004epTiYzy74vzZbJ3E6e&690学习(三、C# 包装C++的dll,并调用 来识别图片)" TITLE="Tesseract-OCR识别 学习(三、C# 包装C++的dll,并调用 来识别图片)" />
只有发DllImport 相应的dll 里面的函数了。三个函数,而且参数比较多。所以只好自己用C++ 包装了一次,在调用了。  说的有点啰嗦。哈哈
把上一篇的使用原dll的来识别图片的方法 提出来:
#define _CRT_SECURE_NO_DEPRECATE   
//#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1  

#include "tesseract\baseapi.h"
#include "tesseract\strngs.h"
#include "PackageDll.h"
#pragma  comment(lib,"libtesseract302.lib")
#pragma  comment(lib, "liblept168.lib")  
extern "C"
{
_declspec(dllexport)
char*  OCRDiscern(char* imagePath)
{
//static char * str = imagePath;
tesseract::TessBaseAPI  api;
api.Init(NULL, "eng", tesseract::OEM_DEFAULT);
api.SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
STRING text_out;
//
if (!api.ProcessPages(imagePath, NULL, 0, &text_out))
{
//MessageBox(NULL, LPCWSTR(str), LPCWSTR(str), 0);
return 0;
}
char * pc = new char[100];
strncpy(pc, text_out.string(),100);
//MessageBox(NULL, LPCWSTR(pc), LPCWSTR(pc), 0);
return pc;// text_out.string();
}

头文件就省略了。注:  extern "C"  _declspec(dllexport)   函数  } 这个是为了生成dll时,C# 调用时方法名称不被编译成其他的函数名。  生成的时候还会报各种错误,找不到libtesseract302.lib  什么的,拷贝到dubug下就好了。

生产好后就,在C#里面引用就是了。
  
        [DllImport("packagedll.dll", CharSet = CharSet.Ansi)]
        unsafe public static extern StringBuilder OCRDiscern(String imagePath);


然后调用dll里面的方法就是了。
 try
            {
                StringBuilder results = new StringBuilder("Hello World!", 25);
                unsafe
                {
                    string imagePath = "7.jpg";
                    //StringBuilder sbu = new StringBuilder("7.jpg");
                    pictureBox1.Image = Image.FromFile(imagePath);
                    pictureBox1.Refresh();
                    results = OCRDiscern(imagePath);
                }
                if (results.ToString() == "")
                {
                    MessageBox.Show("空字符串");
                }
                else
                {
                    //MessageBox.Show(results.ToString());
                    MessageBox.Show(results.ToString());
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
因为C#项目 会使用到C++里面的指针,会报一个不安全的使用
http://s2/mw690/004epTiYzy74vBlDj2x21&690学习(三、C# 包装C++的dll,并调用 来识别图片)" TITLE="Tesseract-OCR识别 学习(三、C# 包装C++的dll,并调用 来识别图片)" />
修改项目属性里面的生成,允许不安全代码即可:
http://s11/mw690/004epTiYzy74vBpxGWe6a&690学习(三、C# 包装C++的dll,并调用 来识别图片)" TITLE="Tesseract-OCR识别 学习(三、C# 包装C++的dll,并调用 来识别图片)" />

还有要注意的是:
1、把你自己封装的dll  拷贝到C# 项目的Debug下;
2、原代码中的dll 也必须拷贝到相应Debug目录下;
3、原代码中的语言包也必须拷贝的Debug下:     如图:http://s7/mw690/004epTiYzy74vBI5aE696&690学习(三、C# 包装C++的dll,并调用 来识别图片)" TITLE="Tesseract-OCR识别 学习(三、C# 包装C++的dll,并调用 来识别图片)" />
后面就是识别电子设备中的数字了。
买的一个摄像头,带有代码的,几百块,可以截图什么的。然后修改代码,让他,定时截图,这个截图是截的全图,还是手动截取只有数字的部分。然后识别。加油。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有