本帖最后由 流行科技 于 2023-11-25 16:37 编辑
一.前言 本次比赛我选择了LubanCat1_N(4+32G)带WIFI的板子进行测试的。为啥要做这样一个事,首先是学习下opencv的开发,使用鲁班猫板子会更加的贴近实际,实际到项目中可能就是一个小的ARM板进行识别。其次车牌识别目前搞的人很多有很多前面的经验。本次还是以这款卡片电脑为主,很多都是在卡片电脑上完成的,同时其可以安装一些编译软件,让软件运行过程更加的直观显示出来,当然其中也会有些性能上的问题,需要进行深层次的优化。 二.实施 1.说明 首先是简要说下,目前应该是有多种技术可以在这款板子上进行图像识别,最新的应该是通过调用芯片自带的NPU进行图像学习识别操作。这个尝试了,未成功。其次python+opencv是比较方便的一种,还有就是c++方式调用,本次主要使用的一种。还可以通过调用外部的API进行图像传输后,交给服务器进行识别返回。想来还是通过本地识别会好点。目前其RKNN应该是完全可以进行的,不过现在学习感觉资料还不是很多。 2.OPENCV库交叉编译 具体步骤:目前首先还是要确定opencv交叉编译。 【鲁班猫创意大赛2期】 https://www.firebbs.cn/forum.php?mod=viewthread&tid=35889&fromuid=35390 (出处: 野火电子论坛) 我是写了一个分享的,通过上位机交叉编译OPENCV到板子上使用,其实板子上也可以编译,但过程应该是比较慢的了。 完成这步后我们得到安装文件。 里面就是lib库和头文件。有些需要编译的还是要自己去添加构建的。本次还选择了QT里开发,在QT里开发,就是可以通过图像转化显示出图像,不然其GTK支持的原因,很多窗口不能显示。 QT安装只需要命令既可: - # 安装qt核心库# Debian10是安装的是Qt5.11.3,ubuntu20.04安装Qt5.12.8, Debian11默认安装Qt5.15.2
- sudo apt-get install qt5-default
- # 或者是使用下面命令(如果是Debian11系统)
- sudo apt-get install qtbase5-dev qt5-qmake
- # 安装一些Qt例程
- sudo apt-get install qtbase5-examples
-
- # 通过apt安装Qt Creator工具,Debian10系统默认安装
- sudo apt install qtcreator
- # 下载安装一些Qt工具
- sudo apt install qttools5-dev-tools
-
复制代码
一个是基础的QT5的包,一个是桌面的qt开发工具。 打开qtcreator开发工具,我们安装QT5是5.11.3还是比较新的版本。 - INCLUDEPATH += $$PWD/opencv3.4.5/include
-
- LIBS += $$PWD/../../lib/libopencv_*.so
- -lpthread
复制代码
当我们需要添加opencv库的时候,在pro下添加上这两句话既可。 这样就能找到我们的库了。 3. EasyPR 这个是很老的一个开源项目了,但是不妨碍我们零基础去学习他。里面的文档介绍,包括网上现在很多文章也都有介绍其怎么使用,还有就是怎么添加自己训练模型。 我们本着拿来就用的理念。直接下载源码,然后添加到我们的工程中。 里面其实已经删除了很多的东西了。我们要的其实就是除了test中的东西,我们先全部加入到我们工程中。 源码中多了这些东西。然后还需要修改一些地方,不然调用会出错。 首先是这个config.h文件中的CV版本,我们是高于openCV3.2直接定义下就行了。 还有就是这个模型的地址要正确不然运行也会报错。 然后就是调用下测试,编写了一个简单QT程序。 在代码中是又调用案例的,所以我们只需要弄下界面,然后配合下即可。 界面加点控件显示。 - void MainWindow::on_pb_recognition_clicked()
- {
- CPlateRecognize pr;
-
- pr.setDetectType(PR_DETECT_COLOR|PR_DETECT_CMSER);
-
- vector<CPlate> plateVec;
-
- cv::String fileName1 = fileName.toLocal8Bit().toStdString();
-
- Mat src = imread(fileName1);
- pr.setResultShow(false);
-
-
- int result = pr.plateRecognize(src,plateVec);
- qDebug() << "result:"<<result;
- pr.getDetectShow();
- CPlate plate = plateVec.at(0);
- Mat plateMat = plate.getPlateMat();
- String license = plate.getPlateStr();
- QString lice1 = QString::fromLocal8Bit(license.c_str());
-
- cvtColor( plateMat, plateMat, CV_BGR2RGB );
- QImage qPlateMat = QImage(plateMat.data,plateMat.cols,plateMat.rows,plateMat.step,QImage::Format_RGB888);
-
- ui->lb_PlateMat->setPixmap(QPixmap::fromImage(qPlateMat));
- ui->lb_PlatNuber->setText(lice1);
-
- qDebug() << lice1;
-
- }
-
- void MainWindow::on_pb_open_clicked()
- {
- fileName = QFileDialog::getOpenFileName (
- this,
- "Open Input File",
- QDir::currentPath(),
- "Video((*.jpg)");//??????????????????*
- if (QFile::exists(fileName))
- {
- QImage qimg;
- qimg.load(fileName);
-
- ui->lb_image->setPixmap(QPixmap::fromImage(qimg));
- }
-
-
- }
复制代码
然后即可打开显示了。测试中发现其定位还是很准确的,虽然有时候识别不出,准确性上来说还是很准的,后期可以试着往视频识别上做。 4. 其他方式识别车牌 这里还有一种基于模板匹配的案例,这里只做为参考,因为识别速度上不太好,但是我认为作为学习来说还是很足够了。 其先定位车牌,然后进行一些CV处理,最后进行字符分割,然后进行模板匹配,这里最后一部是需要大量数据进行比较的,所以比较耗时,而且不太准确。 要准备很多的字符,每个字符下还要不同样的,然后进行匹配。 当然现在最推荐的还是用RKNN进行识别了,一个是交到专门的处理器上做可以减少CPU占用,一个是这也是发展到现在的新的技术方向。进行图形训练,然后再进行 识别。 三.演示视频 https://www.bilibili.com/video/BV1TN4y1U7i9/?vd_source=897ad85d1724aa2677a99c9a337cf2a5 四.总结 本次大赛感谢主办方野火提供板子支持,板子资料也是很丰富,性能也是很好的。对于AI识别那块RKNN这块还是要多多学习,争取在后期中用上。当然这款板子性能好,不只在这一块上,其他的方向使用也是没问题的,后续可以使用python+opencv这样开发,省去交叉编译步骤,而且python也是比较容易上手的。
|