目录
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于机器学习的二维码和条形码识别
条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。
根据条形码方向趋于一致的特点,我们可以将图像分块,通过计算每个块内梯度方向的一致性,来滤除那些低一致性的块。
由于包含条码区域的块一定连续存在的特性,我们可以通过对这些图像块再进行一个改进的腐蚀操作过滤掉部分背景图像块。
得到这些块之后,我们再根据每个图像块内的平均梯度方向进行连通。因为如果是相邻的图像块都属于同一个条码的话,那么他们的平均梯度方向也一定相同。
得到连通区域之后我们再根据条码图像的特性进行筛选,比如连通区域内的梯度大于阈值的点的比例,组成连通区域的图像块数量等。
最后,用最小外接矩形去拟合每个连通区域,并计算外界矩形的方向是否和连通区域内的平均梯度方向一致,过滤掉差距较大的连通区域。将平均梯度方向作为矩形的方向,并将矩形作为最终的定位框。
目前我们支持了三种类型的条码解码,它们分别是EAN13、 EAN8 和UPC-A。(下图为EAN13 条码示例
- #include "opencv2/barcode.hpp"
- #include "opencv2/imgproc.hpp"
-
- using namespace cv;
-
- Ptr<barcode::BarcodeDetector> bardet = makePtr<barcode::BarcodeDetector>("sr.prototxt", "sr.caffemodel"); //如果不使用超分辨率则可以不指定模型路径
- Mat input = imread("your file path");
- Mat corners; //返回的检测框的四个角点坐标,如果检测到N个条码,那么维度应该是[N][4][2]
- std::vector<std::string> decoded_info; //返回的解码结果,如果解码失败,则为空string
- std::vector<barcode::BarcodeType> decoded_format; //返回的条码类型,如果解码失败,则为BarcodeType::NONE
- bool ok = bardet->detectAndDecode(input, decoded_info, decoded_format, corners);
我是海浪学长,创作不易,欢迎点赞、关注、收藏、留言。
毕设帮助,疑难解答,欢迎打扰!