java条形码识别_java openCV 识别条形码

java条形码识别_java openCV 识别条形码我在尝试使用 javaopenCV 识别条形码 在花边框时却这样 我初步判断是 计算面积出现问题 System out println WelcometoOpe Core VERSION Matm newMat 5 10 CvType CV 8UC1 newScalar 0 System out println OpenCV m MatsrcImage

我在尝试使用java openCV 识别条形码。在花边框时却这样。

我初步判断是,计算面积出现问题。

067e77272594000800a3d13c82e00194.png

System.out.println(“Welcome to OpenCV “+Core.VERSION);

Mat m = new Mat(5,10, CvType.CV_8UC1,new Scalar(0));

System.out.println(“OpenCV:”+m);

Mat srcImage = Imgcodecs.imread(“C:\\Users\\13543\\Desktop\\timg.jpg”);//原始

Mat grayImage = new Mat();//灰色

Mat gradientXImage = new Mat();

Mat gradientYImage = new Mat();

Mat gradientImage = new Mat();

Mat blurImage = new Mat();//降噪图

Mat thresholdImage = new Mat();

Mat morphImage = new Mat();

Mat resultFileNameSring = new Mat();

ImageViewer imageViewer = new ImageViewer(srcImage, “原图”);

imageViewer.imshow();

if(srcImage.empty()){

System.out.println(“image file read error”);

return;

}

//图片转为灰度图片

if(srcImage.channels()==3){

Imgproc.cvtColor(srcImage,grayImage,Imgproc.COLOR_RGB2GRAY);

}else{

grayImage = srcImage.clone();

}

new ImageViewer(grayImage, “灰色图”).imshow();

//建立图像的梯度幅值(滤波器)

Imgproc.Scharr(grayImage,gradientXImage,CvType.CV_32F,1,0);

Imgproc.Scharr(grayImage,gradientYImage,CvType.CV_32F,0,1);

//因为我们需要的条形码在需要X方向水平,所以更多的关注X方向的梯度幅值,而省略掉Y方向的梯度幅值

Core.subtract(gradientXImage,gradientYImage,gradientImage);

//归一化为八位图像

Core.convertScaleAbs(gradientImage,gradientImage);

//看看得到的梯度图像是什么样子

new ImageViewer(gradientImage, “3图”).imshow();

//对图片进行相应的模糊化,使一些噪点消除

Imgproc.blur(gradientImage,blurImage,new Size(9,9));

//模糊化以后进行阈值化,得到到对应的黑白二值化图像,二值化的阈值可以根据实际情况调整

Imgproc.threshold(blurImage,thresholdImage,210,255,Imgproc.THRESH_BINARY);

//看看二值化图像

new ImageViewer(thresholdImage, “4图”).imshow();

//二值化以后的图像,条形码之间的黑白没有连接起来,就要进行形态学运算,消除缝隙,相当于小型的黑洞,选择闭运算

//因为是长条之间的缝隙,所以需要选择宽度大于长度

Mat kernel = Imgproc.getStructuringElement(MORPH_RECT,new Size(21,7));

Imgproc.morphologyEx(thresholdImage,morphImage,MORPH_CLOSE,kernel);

//看看形态学操作以后的图像

new ImageViewer(morphImage, “5图”).imshow();

//现在要让条形码区域连接在一起,所以选择膨胀腐蚀,而且为了保持图形大小基本不变,应该使用相同次数的膨胀腐蚀

//先腐蚀,让其他区域的亮的地方变少最好是消除,然后膨胀回来,消除干扰,迭代次数根据实际情况选择

Imgproc.erode(morphImage,morphImage,Imgproc.getStructuringElement(MORPH_RECT,new Size(3,3)),new Point(-1,-1),4);

Imgproc.dilate(morphImage,morphImage,Imgproc.getStructuringElement(MORPH_RECT,new Size(3,3)),new Point(-1,-1),4);

//看看形态学操作以后的图像

new ImageViewer(morphImage, “6图”).imshow();

List contours = new ArrayList();

List contourArea = new ArrayList();

Mat hierarchy = new Mat();

//接下来对目标轮廓进行查找,目标是为了计算图像面积

Imgproc.findContours(morphImage,contours,hierarchy,Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_SIMPLE);

System.out.println(“============”+contours.size());

//计算轮廓的面积并且存放

for(int i = 0; i < contours.size();i++)

{

contourArea.add(Imgproc.contourArea(contours.get(i)));

}

//找出面积最大的轮廓

Double maxValue;Point maxLoc;

Core.MinMaxLocResult minMaxLocResult = Core.minMaxLoc(morphImage);

// minMaxLoc(contourArea, NULL,&maxValue,NULL,&maxLoc);

// minMaxLoc()

// Core.MinMaxLocResult

// Core.MinMaxLocResult minMaxLocResult = Core.minMaxLoc(morphImage,morphImage);//Core.minMaxLoc(morphImage);

maxValue = minMaxLocResult.maxVal;

maxLoc = minMaxLocResult.maxLoc;

System.out.println(“x:”+maxLoc.x+” y:”+maxLoc.y+” maxVal:”+maxValue);

//

// System.out.println(“*Start*”);

List newContours = new ArrayList<>();

for(MatOfPoint point : contours) {

MatOfPoint2f newPoint = new MatOfPoint2f(point.toArray());

newContours.add(newPoint);

}

/计算面积最大的轮廓的最小的外包矩形

MatOfPoint2f m2f = (MatOfPoint2f) contours.get((int)maxLoc.x);

RotatedRect minRect = minAreaRect(newContours.get((int)maxLoc.x));

//

//

//

//

//

// //为了防止找错,要检查这个矩形的偏斜角度不能超标

// //如果超标,那就是没找到

if(minRect.angle<2.0){

//找到了矩形的角度,但是这是一个旋转矩形,所以还要重新获得一个外包最小矩形

Rect myRect = boundingRect(newContours.get((int)maxLoc.x));

// //把这个矩形在源图像中画出来

rectangle(srcImage,myRect,new Scalar(0,255,255),3,LINE_AA);

// //把这个矩形在源图像中画出来

new ImageViewer(srcImage, “7图”).imshow();

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199655.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 下午12:30
下一篇 2026年3月20日 下午12:31


相关推荐

  • burp suite的安装与基本使用

    burp suite的安装与基本使用1.burpsuite的下载可以在官网上下载,https://portswigger.net/burp/,除了这个社区版还有专业版,不过需要付费但是会给你一个月的试用期。安装burp会用到jdk,所以必须先配置好jdk,下载安装自行百度。2.对于初学者如果想用专业版可以在网上找激活成功教程版本,或者购买正版,社区版和专业版之间的主要区别如下:1)BurpScanner…

    2022年7月12日
    25
  • itoa、atoi 整型转字符串、字符串转整型的函数[通俗易懂]

    itoa、atoi 整型转字符串、字符串转整型的函数[通俗易懂]头文件stdlib.hchar*itoa(intvalue,char*string,intradix);将value转换成radix进制数,在将其转换成字符串,写入string中,返回值是string的首地址,windows下才有该函数,可用作进制转换(sprintf函数也有类似功能)。intatoi(constchar*nptr);将字符串转换成整型数,返回值为转换后的整型数。at

    2022年10月10日
    5
  • ext.apply ext.applyIf ext.extend的区别[通俗易懂]

    ext.apply ext.applyIf ext.extend的区别[通俗易懂]Ext.apply、Ext.applyIf和Ext.extend:_sunExt.apply、Ext.applyIf和Ext.extend:2008年07月25日星期五10:48Ext.apply、Ext.applyIf和Ext.extend:Ext.apply(obj,config,[defaults])将config对…

    2022年7月28日
    5
  • 安装portainer

    安装portainer安装 portainer 配置 dockervim usr lib systemd system docker serviceExecS usr bin dockerd Hfd containerd run containerd containerd sock 改为 ExecStart usr bin dockerd Htcp 0 0 0 0 2375 Hunix var run docker sock Hfd containerd run c

    2026年3月19日
    1
  • Typora常用好看主题推荐!!!

    Typora常用好看主题推荐!!!Typora 常用好看主题推荐 Typora 是一款支持实时预览的 Markdown 文本编辑器 它有 OSX Windows Linux 三个平台的版本 并且是完全免费的 在作者心里 Typora 的存在是简约而强大的 加上作者是艺术生出身 对于主题和颜色的美观是有一定要求 所以喜欢收集好看简约的主题 现有几款觉得好看的分享给大家 先挂几个链接 以便同样喜欢自己研究主题的小伙伴参考 Typora 官网主题 https theme typora io 为 Typora 编写自定义主题

    2026年3月20日
    3
  • HTML转word_怎么把docx转换成word

    HTML转word_怎么把docx转换成word在做项目时,要将富文本编辑器,或是html内容导出为word。先引入文件保存js<scriptsrc=”FileSaver.js”></script>导出为Docxdocx体积更小,而且word2007也可以打开1.引用插件html-docx.js<scriptsrc=”html-docx.js”></script>2.构建完整的html内容文档varcontent='<!DOCTYPEhtml&gt

    2022年10月12日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号