最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Tesseract5+OpenCV4(VS2017+win10)实现OCR识别

来源:博客园

一、环境配置

较之前采用cppan进行编译的方式,vcpkg的方式已经发生了许多变化,带来的最大不同就是便捷。

对于在NuGet中能够找到的Vcpkg的export,真的实现了开箱即用


(相关资料图)

这样的话对于普通用户来说就购了;而复杂的问题就交给专家来解决。

二、代码编写和结果展示

//ConsoleOCRDEMO.cpp:基于vcpkg+nuget快速解决环境配置问题#include#include#include#include#include#include#includeusingnamespacecv;usingnamespacecv::dnn;usingnamespacestd;//对east的结果进行解码voiddecode(constMat&scores,constMat&geometry,floatscoreThresh,std::vector&detections,std::vector<float>&confidences){detections.clear();CV_Assert(scores.dims==4);CV_Assert(geometry.dims==4);CV_Assert(scores.size[0]==1);CV_Assert(geometry.size[0]==1);CV_Assert(scores.size[1]==1);CV_Assert(geometry.size[1]==5);CV_Assert(scores.size[2]==geometry.size[2]);CV_Assert(scores.size[3]==geometry.size[3]);constintheight=scores.size[2];constintwidth=scores.size[3];for(inty=0;yfloat*scoresData=scores.ptr<float>(0,0,y);constfloat*x0_data=geometry.ptr<float>(0,0,y);constfloat*x1_data=geometry.ptr<float>(0,1,y);constfloat*x2_data=geometry.ptr<float>(0,2,y);constfloat*x3_data=geometry.ptr<float>(0,3,y);constfloat*anglesData=geometry.ptr<float>(0,4,y);for(intx=0;xfloatscore=scoresData[x];if(scorecontinue;//Decodeaprediction.//Multipleby4becausefeaturemapsare4timelessthaninputimage.floatoffsetX=x*4.0f,offsetY=y*4.0f;floatangle=anglesData[x];floatcosA=std::cos(angle);floatsinA=std::sin(angle);floath=x0_data[x]+x2_data[x];floatw=x1_data[x]+x3_data[x];Point2foffset(offsetX+cosA*x1_data[x]+sinA*x2_data[x],offsetY-sinA*x1_data[x]+cosA*x2_data[x]);Point2fp1=Point2f(-sinA*h,-cosA*h)+offset;Point2fp3=Point2f(-cosA*w,sinA*w)+offset;RotatedRectr(0.5f*(p1+p3),Size2f(w,h),-angle*180.0f/(float)CV_PI);detections.push_back(r);confidences.push_back(score);}}}intmain(){//参数和常量准备Stringmodel="F:/未来项目/GOCVHelper455/GOCVHelper455/GOCVHelper455/model/frozen_east_text_detection.pb";std::vectorouts;std::vectoroutNames(2);outNames[0]="feature_fusion/Conv_7/Sigmoid";outNames[1]="feature_fusion/concat_3";Matblob;std::vectorboxes;std::vector<float>confidences;std::vector<int>indices;charcbuf[255];//引入EASTmodelNetnet=readNet(model);//对tesseract进行初始化操作tesseract::TessBaseAPItess;if(tess.Init("C:/ProgramFiles/Tesseract-OCR/tessdata","eng")){std::cout<<"OCRTesseract:Couldnotinitializetesseract."<return1;}tess.SetVariable("tessedit_char_whitelist","0123456789");Matsrc=imread("F:/未来项目/OCR2023/2.jpg");Matboard=src.clone();//用于显示图片blobFromImage(src,blob,1.0,Size(1280,1280),Scalar(),true,false);//Scalar采用默认是设置net.setInput(blob);net.forward(outs,outNames);Matscores=outs[0];Matgeometry=outs[1];decode(scores,geometry,0.5,boxes,confidences);//注意0.5是超参数NMSBoxes(boxes,confidences,0.5,0.4,indices);Point2fratio((float)src.cols/1280,(float)src.rows/1280);//缩放比例//获得最终框选结果for(size_ti=0;ifor(intj=0;j<4;++j){vertices[j].x*=ratio.x;vertices[j].y*=ratio.y;}Point2f*lastItemPointer=(vertices+sizeofvertices/sizeofvertices[0]);vectorcontour(vertices,lastItemPointer);RectboundRect=boundingRect(Mat(contour));//对rect适当进行扩充boundRect=cv::Rect(boundRect.tl().x-5,boundRect.tl().y,boundRect.width+10,boundRect.height);if(boundRect.yfor(intj=0;j<4;++j)line(board,vertices[j],vertices[(j+1)%4],Scalar(0,255,0),1);rectangle(board,boundRect,Scalar(0,0,255));//绘制外接最小矩形//打印数据sprintf_s(cbuf,"F:/未来项目/OCR2023//roi/%d.jpg",i);//打印出来imwrite(cbuf,roi);////将切割出来的图片输入tesseract中autopixs=pixRead(cbuf);if(!pixs){std::cout<<"Cannotopeninputfile:"<return1;}//recognizetess.SetImage(pixs);tess.Recognize(0);//getresultanddelete[]returnedchar*stringstd::cout<(tess.GetUTF8Text()).get()<stringstrOut=tess.GetUTF8Text();putText(board,std::unique_ptr(tess.GetUTF8Text()).get(),boundRect.tl(),1,1.0f,Scalar(0,255,0));//cleanuptess.Clear();pixDestroy(&pixs);}}imshow("board",board);imwrite("F:/未来项目/OCR2023/roi/result.jpg",board);cv::waitKey();getchar();return0;}

三、代码编写和结果展示

这种环境配置方法以数量级的方式降低了环境配置的难度,而且“正好”有这样的一个可以使用的环境。其中:。

1、VCPKG是什么

VCPKG是微软 C++ 团队开发的适用于 C 和 C++ 库的跨平台开源软件包管理器,它大大简化了 Windows、Linux 和 macOS 上第三方库相关的下载和配置操作,目前已有超过1600个第三方库可以通过vcpkg来安装。

自动下载开源库源代码。一键安装第三方库。源码包的缓存管理和版本管理,可以依需求安装指定的版本。

自动检查库的依赖关系并安装其依赖项。

无缝集成Visual Studio,不用手动设置任何的库相关的路径。

Visual Studio全平台支持,不仅支持Debug/Release、x86/x64编译,还支持UWP、ARM平台的编译。

2、nuget

Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展。在使用Visual Studio 或.NET CLI开发基于.NET 或.NET Framework的应用时,Nuget能把在项目中添加、移除和更新引用的工作变得更加快捷方便。

3、vcpkg导出NuGet

vcpkg export --nuget [options] ...

/..nupkg创建 NuGet 包。

包含 标准集成文件 以及其他 MSBuild 集成,以支持通过 NuGet 包管理器 (.vcxproj) 包含在 MSBuild C++ 项目中。 请注意,不能将生成的 export 多个 NuGet 包混合在一起 -- 仅使用其中一个包。 若要添加其他库,必须创建包含完整依赖项集的新导出。

关键词: