车牌识别系统easyPR的MFC可视化界面
车牌识别系统easyPR自带的demo基于win32控制台,个人认为可操作性不如可视化的操作界面。为了更好的学习这个系统和openCV,我尝试建立了一个MFC的可视化界面,目前已初步实现,现开始记录实现过程中个人认为值得分享的内容。
我初步规划的easyPR的MFC可视化界面功能如下:用户可以指定当前需要识别的图片,在界面中可以观察到源图像,识别结果,可以选择观察车牌识别的中间过程,中间过程可以显示在源图片的左上角,例如车牌定位,车牌分割,字符分割等等,界面如下图所示。
1. 建立easyPR可视化界面的基本流程
1.1 在已编译成功的easyPR解决方案中添加新项目testPR,我添加的是基于对话框的VC++ MFC应用程序,将新添加的项目设置为启动项目。
1.2 为新添加的项目添加VC++包含openCV相关的目录和库文件,添加方法请参考EasyPR(车牌识别系统)在win10&VS2013&X64环境下的编译方法。
1.3 在解决方案资源管理器中,选中testPR,右键单击–>生成依赖项–>项目依赖项,设置libeasypr为testPR的依赖项目。
1.4 在libeasypr中有大量的加载图片与资源的代码,用的是相对路径。因此需要在testPR的项目属性–>配置属性–>C/C++ –>常规–>附加包含目录中添加”$(SolutionDir)include”,这样设定后,libeasypr中的相对路径才会生效;如果此处不更改,将会出现各种错误。
1.5 在testPRDlg.cpp文件中添加如下头文件和命名空间。
1 2 3 4 5 6 |
#include "easypr.h" using namespace easypr; using namespace cv; using namespace std; using namespace api; |
1.6 双击Result按钮,在该按钮的在实现函数中添加如下代码,试用libeasypr的车牌识别功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//Get the recognition result of the loaded plate void CtestPRDlg::OnBnClickedButton() { CPlateRecognize pr; pr.setLifemode(true); pr.setDebug(false); pr.setMaxPlates(4); pr.setDetectType(easypr::PR_DETECT_CMSER); vector<CPlate> plateVec; Mat src = imread(m_srcPath);//m_srcPath是std::string类型,记录用户当前选中的待识别图片的路径 int result = pr.plateRecognize(src, plateVec); if (result == 0) { size_t num = plateVec.size(); CString resultStr; for (size_t j = 0; j < num; j++) { resultStr += plateVec[j].getPlateStr().c_str();//string to constant char* } SetDlgItemText(RESULT_EDIT2, resultStr);//RESULT_EDIT2是用于显示识别结果的编辑框 } } |
1.7 完成上述步骤之后可以试编译一下,如果设置正确的话,此时显示识别结果的编辑框中应该会出现正确的车牌识别结果。
2. 在实现easyPR可视化界面过程中的注意事项
2.1 Cstring string const char*的相互转化
通过openfile dialog获取的图片途径是CString类型,在picture control控件中需要的路径是const char*类型,opencv的imread函数需要的输入路径是string。这三种格式之间的转换方法如下:
1 2 3 4 5 6 7 |
CString cs_srcPath; const char* cc_srcPath; USES_CONVERSION;//需添加头文件#include <atlconv.h> string s_srcPath(W2A(tmpSrcPath));//CString转换为string cc_srcPath =s_srcPath.c_str();//string转换为const char* |
2.2 在picture control控件中显示图片
我在MFC的picture control控件中实现显示图片时,用到了CvvImage类,该类在openCV3.0中已经不存在,不过可以下载CvvImage.h和CvvImage.cpp来实现该功能,具体的代码会发布在Github的easyPR的仓库中。
2.3 picture control控件和对话框随加载图片的尺寸来更改自身的尺寸。
目前源图加载时,对话框和picture control的尺寸会根据源图尺寸来进行调整;对话框中的其他控件并不会调整。在加载图片时,MFC对话框会触发一次重绘事件,此时获取对话框句柄是空。因此需要在界面初始化时,获取到对话框的尺寸,加载图片时直接根据图片尺寸更新对话框尺寸,具体的代码会发布在Github的easyPR的仓库中。
请问为什么载入图片后,在source image窗口显示不完整,只有图片一部分
会不会是图片比较特殊,导致显示不完整?请问可以把你显示不完整的图片发给我看一下吗?通过微博或者邮箱,在 关于小站 页面中可以找到,谢谢!
EasyPR的人工神经网络模型的哪一种,因为人工神经网络模型有好多种,现在在做毕设,希望给于回复
你好,我猜你想问的是:EasyPR中用的是哪一种人工神经网络模型?很抱歉,我对人工神经网络模型并没有研究,不过EasyPR的作者有一篇博客是关于神经网络的 神经网络浅讲:从神经元到深度学习,你可以参考一下
谢谢,我现在想问一下,从github下载你的EasyPR_MFC-master,在EasyPR_MFC-masterEasyPRx64Debug的testPR.exe打开的话会出现应用程序无法正常启动 ,该怎么办啊
应该是exe文档无法识别你电脑上配置的opencv路径,你要自己重新为项目配置opencv,编译成功后才可以打开exe文档。
您好,请问在github上怎么下载啊,找不到这个程序啊
您好,下载地址如下:https://github.com/livezingy/EasyPR_MFC
请问您还有源码吗,GitHub上下载说损坏了
作者有qq或者邮箱吗?我有些问题想要详细咨询一下
请问,点击result按钮后没有显示结果,显示线程均已退出,并且在plate_recognize.cpp中showDectectResults显示未定义,我也没有找到这个函数的定义在哪里。VS2017+Opencv3.2.0.求指教。不胜感激
您好,首先谢谢您试用EasyPR_MFC。showDectectResults函数的定义在src\core\core_func.cpp中,core_func.cpp和plate_recognize.cpp属于同一个命名空间namespace easypr,正常情况下不会显示未定义。
不过很抱歉,我使用的是VS2013+opencv3.1,状况可能和您不一样,建议您按照如下方式确认一下:
1. 随意找一个opencv3.2自带的例程,按照配置TestPR的方式配置该例程的opencv3.2,确认是否可以正常运行。若例程无法运行,那么您的Opencv配置可能有问题。
2. 若第1步没有问题,您可以单独运行libeasypr,看看是否能成功。若不成功,那么有可能时当前的libeasypr不兼容opencv3.2。
在5月中旬,EasyPR的作者更新了1.6 alpha版本,宣称兼容了opencv3.2,5月下旬,我也对EasyPR_MFC进行了相应的更新,您可以下载新的程序再试试。
感谢回复,更新EasyPR原作者的代码后上述问题解决。运行原作者Demo为出现问题,运行MFC后kv.cpp中assert(reader)引发断点,char_identifi.cpp中 ann_->predict(featureRows, output)引发断点:将一个无效参数传递给了将无效参数视为严重错误的函数。这是版本问题吗?百度无果。。。
有可能,好像有不少人遇到过类似的问题,你可以参考一下这里http://www.cnblogs.com/Anita9002/p/6237513.html
您好,请问那个assert(reader)的问题解决了吗?
您好,请问assert(reader)这个问题解决了吗
您好,请问有MFC界面设计代码吗?在哪下载?
您好 ,看评论是VS2013+opencv3.1,但是在下载页面那里说的是VS2013+opencv3.0。?
抱歉,我的疏忽给您造成困扰了,目前github上是VS2013+opencv3.1,但readme中的说明忘记同步更新了。
你好,按照你的步骤配置新添加的项目的时候还是会报无法解析的外部符号这个错误
error LNK2019: 无法解析的外部符号 “public: __cdecl easypr::CPlateDetect::~CPlateDetect(void)” (??1CPlateDetect@easypr@@QEAA@XZ),该符号在函数 “public: __cdecl easypr::CPlateRecognize::~CPlateRecognize(void)” (??1CPlateRecognize@easypr@@QEAA@XZ) 中被引用
这是为什么呢?
请问你编译的是哪个项目?EasyPR,还是EasyPR_MFC?参考的具体是哪一篇攻略呢?有没有确认过opencv和Vs的版本?
编译的是EasyPR,在这个基础上添加MFC项目 但是会爆出 无法解析外部符号的错误
博主你好,我用到LOAD_ANN_MODEL(ann_, kDefaultAnnPath);的时候总是报错
C2275 “cv::ml::ANN_MLP”: 将此类型用作表达式非法 libeasypr
用的是VS2017 + OpenCV341 方便解答一下吗? 不胜感激
我也是这个问题
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2275 “cv::ml::ANN_MLP”: 将此类型用作表达式非法
LOAD_ANN_MODEL(ann_, kDefaultAnnPath); 这个地方总报错
请问博主这是怎么回事啊
博主你好,我用到LOAD_ANN_MODEL(ann_, kDefaultAnnPath);的时候总是报错
C2275 “cv::ml::ANN_MLP”: 将此类型用作表达式非法 libeasypr
用的是VS2017 + OpenCV341 方便解答一下吗? 不胜感激
你好,参考这里:https://github.com/liuruoze/EasyPR/issues/244
https://github.com/liuruoze/EasyPR/issues/226
您好,请问您下载有源码吗,GitHub上失效了
请问你说的是哪个失效了呢?我的github上《车牌识别系统easyPR的MFC可视化界面》相关的代码没有失效,是目前我这边的最新版本。
我下载的您上传的这个,https://github.com/livezingy/EasyPR_MFC。下载下来一直说破损了,或者说加载不出来。如果您方便的话,可以发一份压缩包么。邮箱:1596162941@qq.com
已发送,请查阅。
作者有邮箱或者qq吗?有些信息想咨询一下
livezingy@163.com
“channels”: 不是“cv::DataType”的成员 以及 “depth”: 不是“cv::DataType”的成员 ,出现这种问题要怎么处理呢?本人用的VS2017 + opencv4.0.0