java-opencv条形码检测解码

前言

OpenCV中的条码检测主要是基于ZBar跟ZXING开源的基础上修改而来,支持多种一维码的检测,同时还支持多码检测。这节条形码检测也是在扩展模块中,参数也可以用微信的超分辨率模型(超分辨率策略指的是对较小的条码进行超分辨率放大),二维码检测微信提供的有API条形码这里是自带的,微信模型路径。

上篇内容二维码解码java-opencv体验微信二维码检测解码时有写了java-opencv的扩展模块opencv_contrib的在win编译我遇到的问题。

和二维码一样不用opencv也可以直接使用com.google.zxing这个包对条形码进行生成和解码,但这里有个问题就是就是jar包提供的API中只能识别图片中的一个条形码不能识别多个这个自行在网上找demo,效果应该也会比Zxing好因为opencv的专业是图像处理。

简单说下条形码

条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、邮件起止地点、类别、日期等许多信息,因而在商品流通、图书管理、邮政管理、银行系统等许多领域都得到广泛的应用。

条形码分类很多的各种各样,可以看下百科。

简单了解下条形码就可以照着API处理了。

opencv条形码识别demo

  1. 老规矩对图片进行缩放,缩放的时候我发现有时候过小了识别很受影响的,实际用的时候需要控制下默认宽高不然识别会受影响的。
  2. 在网上找的图有多个条形码的一个识别效果,感觉还可以
  3. 这里的条形码识别跟二维码识别有个区别时没有直接返回坐标,需要单独调用方法获取坐标画线条(独特的是这个坐标没有写到集合里面,需要从Mat里面自己拿坐标,跟HoughLines/HoughLinesP得到的线条坐标存储一样,条形码的横竖对于坐标的返回定位需要自己处理下,我这里取了第二个可以排序显示识别的内容)
  4. 由于条形码类型很多,这个多了个对应类型的返回。
ini 复制代码
public static void test2(String imgPath) {
    InitUtil.Init();
    Mat img = Imgcodecs.imread(imgPath);

    Imgproc.resize(img, img, new Size(img.cols()*0.7, img.rows()*0.6));
    String path = TestBarcode.class.getClassLoader().getResource("wechat_qrcode").getPath();
    path = path.substring(1);
    System.out.println(path);
    String sr_prototxt = path + "/sr.prototxt";
    String sr_model = path + "/sr.caffemodel";
    //BarcodeDetector bd=new BarcodeDetector(sr_prototxt,sr_model);
    BarcodeDetector bd = new BarcodeDetector();
    List<Integer> typeList = new ArrayList<Integer>();
    List<String> valList = new ArrayList<String>();
    Mat point = new Mat();
    boolean isDetect = bd.detect(img, point);
    boolean isCheck = bd.detectAndDecode(img, valList, typeList);
    if (isDetect) {
        System.out.println(point.size()+" "+point.rows()+" "+point.cols());
        for(int i=0;i<point.rows();i++) {
            Point point1 = new Point(point.get(i,0)[0], point.get(i,0)[1]);
            Point point2 =   new Point(point.get(i,1)[0], point.get(i,1)[1]);
            Point point3 =   new Point(point.get(i,2)[0], point.get(i,2)[1]);
            Point point4 =   new Point(point.get(i,3)[0], point.get(i,3)[1]);

            Imgproc.line(img, point1, point2, Color.CV_COLOR_RED, 1);
            Imgproc.line(img, point2, point3, Color.CV_COLOR_RED, 1);
            Imgproc.line(img, point3, point4, Color.CV_COLOR_RED, 1);
            Imgproc.line(img, point4, point1, Color.CV_COLOR_RED, 1) ;
            System.out.println(valList.get(i));
            img= CommonCVUtils.chinaFontText(img,new Point(point2.x,point2.y-10),"内容"+valList.get(i));
        }
    }
    HighGui.imshow("一护", img);
    HighGui.waitKey(0);
    System.exit(0);
}
相关推荐
程序猿_极客5 分钟前
【免费】2026分享一套优质的基于Java的电子产品抢购管理系统的设计与实现(智能推荐算法+可视化图表),源码+文档+视频详解(讲解)
java·spring boot·后端·协同过滤·电子产品抢购系统
小羊没烦恼!7 分钟前
关于大型asp.net应用系统的架构-架构的选择
java·服务器·开发语言·前端·c#
天空鸟_时光不老9 分钟前
09-RAG问答系统落地:从默认分割器的坑到Milvus召回调优
java·人工智能·spring boot·spring·spring cloud·maven·mybatis
小羊没烦恼!17 分钟前
Windows Azure Platform体验(1):Windows Azure
java·大数据·后端·python·flask·word·.net
suaizai_26 分钟前
ComputerUse:让AI真正操控桌面系统
java·前端·javascript
fundoit37 分钟前
资源服务器如何对 JWT 进行验签
java·运维·服务器·spring boot·php·oauth2
hljqwb37 分钟前
java服务异常日志只打印异常类型,没有堆栈定位分析(十)
java·开发语言
ym hyd 11141 分钟前
生鲜超市库存管理信息系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·vue.js·spring boot·毕设
高洁0143 分钟前
AI软件工程:大模型赋能软件研发全流程革新
人工智能·深度学习·机器学习·transformer·tornado
Rain的Java大神之路1 小时前
别再瞎装 RabbitMQ 了!从 0 到 1 部署到 Spring Boot 全链路实战,生产级坑全填平
java·后端·面试