二维码识别

编了这么久的程序,如果碰到一个项目,或一个想法,会怎么做?

首先会评估一下能否实现。

如果能实现,就看是搭积木集成,还是从头来从底层实现。

当然,如果要从头来,要么这个需求很简单,要么这个需求很重要(指市场前景很好),才有必要下定决心从底层来实现。比如,DrGraph图形平台就不能东拼西凑,而必须得有自己的核心东东,说得好听点就叫自主知识产权。

今天来说二维码识别。这个小东东在高拍仪里面算是一个小模块吧。二维码好象现在在N多的地方都有应用,高拍仪软件主攻识别与交流,花点时间解决下二维码识别倒也不算是在浪费时间。

首先评估一下,这个东东是自己从头来做,还是找现成的集成。

上网简单搜了一下,居然找到了源码zxing。按中国程序员的习惯,这就是我的了。

但这个源程序,光文件有好几十个

这几十个文件,要是从头到尾读一遍,再理解一下,岂不得花个十天半个月的。这个时间可是花不起。

那就打包成DLL算了,直接编译调用接口就OK。核心处理过程:

wchar_t * TqaDll_BarCode::OnCommand(wchar_t * command) {

    FResponseNode->Clear(true);

    FResponseNode->ReadFromString(command);

    FResponseNode->AddAttribute("Status", "error");

 

    UnicodeString type = FResponseNode->AttributeValueByName("Type");

    try {

        if (type == "Scan") {

            UnicodeString fileName = FResponseNode->AttributeValueByName("FileName");

            if(FileExists(fileName)) {

                TImage * image = new TImage(Application->MainForm);

                image->Picture->LoadFromFile(fileName);

                DoScan(image->Picture);

                delete image;

}

        }

        FResponseNode->AddAttribute("Status", "OK");

    }

    catch(Sysutils::Exception & ex) {

        THelper::MessageBox(THelper::FormatString(

                "QaBarCode.dll响应 %s 时出现错误: %s 请检查并处理后继续!",

                FResponseNode->Text, ex.Message), false);

        FResponseNode->AddAttribute("Status", "error");

    }

 

    UnicodeString test = FResponseNode->Text;

    wchar_t * response = new wchar_t[test.Length() + 1];

    wcscpy(response, test.w_str());

    return response;

}

然后调用,识别居然OK了。

剩下的事就是整合进高拍仪程序。先是界面,也就是分区可以设置二维码区域

拿表哥开庭事件再加上二维码图片为例

自动分区,发现二维码区域也被识别为文字区域,需要手动设置一下。

识别结果:

进入逐行校对模式:

达到识别效果。

 

后记:

二维码识别目前还有三个地方需改进:

  1. 中文识别:目前,二维码中的中文识别出来是乱码
  2. 区域自动识别:如果在视频或图片中,自动识别出二维码区域,则自动化程度会更高,交互性会更好;
  3. 生成二维码:用户输入文字,可以生成二维码,相当于提供一个小功能。
原文地址:https://www.cnblogs.com/drgraph/p/3293476.html