二维码识别
编了这么久的程序,如果碰到一个项目,或一个想法,会怎么做?
首先会评估一下能否实现。
如果能实现,就看是搭积木集成,还是从头来从底层实现。
当然,如果要从头来,要么这个需求很简单,要么这个需求很重要(指市场前景很好),才有必要下定决心从底层来实现。比如,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 时出现错误:\r\n%s\r\n\r\n 请检查并处理后继续!",
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了。
剩下的事就是整合进高拍仪程序。先是界面,也就是分区可以设置二维码区域
拿表哥开庭事件再加上二维码图片为例
自动分区,发现二维码区域也被识别为文字区域,需要手动设置一下。
识别结果:
进入逐行校对模式:
达到识别效果。
后记:
二维码识别目前还有三个地方需改进:
- 中文识别:目前,二维码中的中文识别出来是乱码
- 区域自动识别:如果在视频或图片中,自动识别出二维码区域,则自动化程度会更高,交互性会更好;
- 生成二维码:用户输入文字,可以生成二维码,相当于提供一个小功能。