opencv_04条形码区域分割

news2025/2/28 10:38:22

基于OpenCV的条形码区域分割
要基于OpenCV实现条形码区域分割,可以按照以下步骤进行:

  • 加载图像:使用OpenCV中的imread函数读取待处理图像。
  • 灰度化:使用OpenCV中的cvtColor函数将彩色图像转换为灰度图像。
  • 边缘检测:使用OpenCV中的Canny函数对灰度图像进行边缘检测,得到二值图像。
  • 轮廓检测:使用OpenCV中的findContours函数对二值图像进行轮廓检测,得到所有轮廓的列表。
  • 轮廓筛选:遍历所有轮廓,使用OpenCV中的boundingRect函数计算每个轮廓的包围矩形,并根据矩形的宽高比和面积进行筛选,得到符合条件的条形码区域。
  • 绘制矩形:使用OpenCV中的rectangle函数在原图上绘制符合条件的条形码区域。
  • 显示图像:使用OpenCV中的imshow函数显示处理后的图像。

但是由于选取的图片比较复杂,这样的常规流程是识别不出效果的,所以在原有的流程上又添加了新的处理:

  • 黑帽算法:使用黑帽算法可以将杂色有效去除。黑帽是一种常用的图像处理算法,可以用于图像增强、边缘检测、形态学变换等应用。
  • 二值化:通过黑帽算法设定合适的阈值来将图像有用部分提取出来。
  • 膨胀+闭运算:将图像连接起来
  • 开运算:将不符合的区间去除

效果:
在这里插入图片描述
代码:


#include <QFileDialog>
#include <opencv2/opencv.hpp>
#include <opencv2/saliency/saliencySpecializedClasses.hpp>
#include <opencv2/opencv.hpp>
#include <QApplication>
#include <QFileDialog>
#include <QLabel>
void MainWindow::on_openButton_clicked() {
    QString filename = QFileDialog::getOpenFileName(this, tr("Open Image"), ".", tr("Image Files (*.png *.jpg *.bmp)"));
    if (filename.isEmpty()) {
        return;
    }

    Mat image = imread(filename.toStdString());
    if (image.empty()) {
        return;
    }

    // 灰度化
    Mat grayImage;
    cvtColor(image, grayImage, COLOR_BGR2GRAY);

    // 黑帽 黑帽是一种常用的图像处理算法,可以用于图像增强、边缘检测、形态学变换等应用。
    Mat black_img = blackhat(grayImage, 5);

    // 二值化
    Mat binaryImg;
    threshold(black_img, binaryImg, 80, 255, cv::THRESH_BINARY);

    // 膨胀+闭运算
    Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(10, 5));
    Mat dilated;
    dilate(binaryImg, dilated, kernel);
    Mat closed;
    morphologyEx(dilated, closed, cv::MORPH_CLOSE, kernel);

    // 开运算
    Mat outputImage;
    Mat kernel1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(20, 20));
    morphologyEx(closed, outputImage, cv::MORPH_OPEN, kernel1);
    imshow("binary image", outputImage);
    // 边缘检测
    Mat edges;
    Canny(outputImage, edges, 50, 150);    // 轮廓检测
    std::vector<std::vector<cv::Point>> contours;
    findContours(edges, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);    // 轮廓筛选
    std::vector<cv::Rect> barcodeRects;
    for (int i = 0; i < contours.size(); i++)    {        // 计算包围矩形
        Rect rect = boundingRect(contours[i]);        // 根据宽高比和面积筛选
        double aspectRatio = static_cast<double>(rect.width) / rect.height;
        if (aspectRatio > 2 && aspectRatio < 4 && rect.area() > 1000) {
            barcodeRects.push_back(rect);
        }
    }
    // 绘制矩形
    for (int i = 0; i < barcodeRects.size(); i++)    {
        rectangle(image, barcodeRects[i], Scalar(255, 255, 0), 2);
    }

    cvtColor(image, image, COLOR_BGR2RGB);//BGR convert to RGB
    QImage qimage(image.data, image.cols, image.rows, image.step, QImage::Format_RGB888);
    ui->label->setPixmap(QPixmap::fromImage(qimage));
    ui->label->resize(qimage.size());
    ui->label->show();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java-android面试-线程状态

开篇一张图&#xff08;本图来源于网络&#xff09;&#xff0c;余下全靠编&#xff0c;我们正式开始。 一、线程的状态 总共有6种状态&#xff0c;分别如下&#xff1a; 1. 新建状态(New): 线程对象被创建后&#xff0c;就进入了新建状态。例如&#xff0c;Thread thread …

ShareSDK Google平台注册指南

注册开发者账号 访问Firebase&#xff0c;使用Google账号登录 创建项目 登录完成后&#xff0c;点击转到控制台 点击添加项目 输入项目名称&#xff0c;点击继续 根据需要选择是否开启Google Analytics&#xff08;分析&#xff09;&#xff0c;点击继续 选择Google Analytic…

04 【Sass语法介绍-运算】

1.前言 运算是一种通过已知量可能的组合&#xff0c;获得新的量的行为。Sass 中也为我们提供了各种各样的运算&#xff0c;以便我们更好的处理样式代码。本节我们将学习 Sass 中的数字运算、关系运算、除法运算、颜色运算、字符串运算等等… 2.什么是 Sass 运算&#xff1f; …

ArcGIS Pro坐标系统

目录 1 测量学基础 1.1 地球的形状和大小 1.1.1 大地水准面 1.1.2 大地体 1.1.3 地球椭球 2 坐标系统 2.1 地理坐标系 2.2 投影坐标系 2.3 局部坐标系&#xff08;假定坐标系&#xff09; 2.4 高程坐标系 3 地图投影 3.1 投影概念 3.2 投影分类 3.3 投影类型 3.…

长按实现安卓端下载图片和安装包

①长按按钮保存图片至安卓手机相册 using System.Collections; using System.Collections.Generic; using UnityEngine;public class LongPress : MonoBehaviour {//设置变量记录触摸时间与bool触摸private float touchTime;private bool newTouch = false;void Update () {//判…

在线问诊小程序系统方案以及价值

方案价值zlzwgz0127 1.扩大医院流量 a.预约到院 在线展示专家的介绍&#xff0c;更能彰显实力&#xff0c;吸引患者来院就医&#xff0c; 用户可选择在线问诊和预约到院 b.社区团购导流 与我们合作社区团购给医院的体检产品导流 c.专家直播导流 通过专家直播吸引潜在患者…

( 哈希表) 1. 两数之和 ——【Leetcode每日一题】

哈希表使用 O ( N ) O(N) O(N) 空间复杂度存储数据&#xff0c;并且以 O ( 1 ) O(1) O(1) 时间复杂度求解问题。 ❓1. 两数之和 难度&#xff1a;简单 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&am…

计算机网络【1】 TCP/IP

OSI七层模型与TCP/IP四层模型 首先简单说一下OSI参考模型&#xff0c;OSI将网络分为七层&#xff0c;自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层&#xff0c;而TCP/IP体系结构则将网络分为四层&#xff0c;自下而上分别是网络接口层、网络层、…

如何冲破 GPT-4 的信息茧房?

由于大模型的成功经验&#xff0c;整个 AI 领域纷纷转向&#xff0c;要么是将模型架构换为 Transformer&#xff0c;要么是将小模型换为大模型&#xff0c;要么是将建模方式换为自监督、自回归范式等等。 GPT-4 推出后&#xff0c;各种 demo 充斥网络空间&#xff0c;写代码、…

论文投稿指南——如何让SCI论文英语更地道(细节掌握)

​ 学术论文英文写作都要符合ABC三个基本点&#xff1a;准确、简洁和清晰 (Accurate\Brief\Clear)&#xff0c;在此基础上做好必要的细节&#xff0c;可以让你的英文写作更地道化、学术化。以下建议可供各位小伙伴参考&#xff1a; 一、错误用法 ★ So/But/And/Also…等连接词…

如何判定自己适合自学编程还是报班?

首先在这里&#xff0c;不做偏向性推荐&#xff0c;主要还是看个人条件。 宝剑锋从磨砺出&#xff0c;学习本身是一件艰苦的事情。在决定之前&#xff0c;建议先按照下图问自己三个问题自我检测。 如果你还不能确定&#xff0c;自学和报班的优劣势分析&#xff0c;或许能帮你们…

Spring JDBC和事务控制

目录 Spring JDBC 和 事务控制主要内容Spring 整合 JDBC 环境构建项目添加依赖坐标添加 jdbc 配置文件编写 spring 配置文件配置数据源C3P0 数据源配置DBCP 数据源配置 模板类配置Spring JDBC 测试 &#xff08;入门&#xff09;创建指定数据库创建数据表使用 JUnit 测试JUnit …

面试题30天打卡-day14

1、线程的生命周期是什么&#xff0c;线程有几种状态&#xff0c;什么是上下文切换&#xff1f; 线程通常有五种状态&#xff1a;创建&#xff0c;就绪&#xff0c;运行、阻塞和死亡状态。 新建状态&#xff08;New&#xff09;&#xff1a;新创建了一个线程对象。就绪状态&am…

超赞的实用前端社区精选?

转载 作者&#xff1a;黑马程序员前端 链接&#xff1a;https://www.zhihu.com/question/39503897/answer/2998752442 社区精选 | 好的前端社区可以根据其特点和领域进行分类整理&#xff1a; 1. 问答社区 Stack Overflow&#xff08;https://stackoverflow.com/&#xf…

【一起撸个DL框架】3 前向传播

CSDN个人主页&#xff1a;清风莫追 欢迎关注本专栏&#xff1a;《一起撸个DL框架》 文章目录 3 前向传播&#x1f95d;3.1 前情提要3.2 前向传播&#xff1a;递归的forward方法3.3 再添乘法节点&#xff1a;搭建函数y2x13.4 小结 3 前向传播&#x1f95d; 3.1 前情提要 上一篇…

vue - 实现对div的拖动功能

实现对div的拖动功能&#xff0c;需要先要知道以下的一些原生事件和方法&#xff1b; 1&#xff0c;事件: 方法描述onmousedown鼠标按钮被按下onmousemove鼠标被移动onmouseup鼠标按键被松开 2&#xff0c;方法: 方法描述event.clientX返回当事件被触发时鼠标指针相对于浏览…

基于elementplus 实现多级表格 最后一级展示图片

想要实现的效果 总共四级 前三级是表格 第四级使用图片展示&#xff1b; 看了一下官网 计划使用官网的树形结构&#xff0c; 但是发现并不能满足最后一个是图片形式的展示 最后利用了表格的expand&#xff1b; 在过程中主要需要解决的问题有&#xff1a;vue3 递归使用组件&am…

JavaScript题解2652.倍数求和|容斥原理

解题思路 在JavaScript中计算7/3*3&#xff0c;结果是7&#xff0c;而不是6。这是因为JavaScript中除法运算符&#xff08;/&#xff09;得到的结果是一个浮点数&#xff0c;而不是一个整数。 具体来说&#xff0c;7/3得到的结果是2.3333…&#xff0c;然后再乘以3得到7.0000…

辞了外包,上岸字节我落泪了,400多个日夜没人知道我付出了多少....

前言&#xff1a; 没有绝对的天才&#xff0c;只有持续不断的付出。对于我们每一个平凡人来说&#xff0c;改变命运只能依靠努力幸运&#xff0c;但如果你不够幸运&#xff0c;那就只能拉高努力的占比。 2023年3月&#xff0c;我有幸成为了字节跳动的一名自动化测试工程师&am…

nacos搭建

1、查询对应的nacos版本 在pom.xml文件中&#xff0c;按住ctrl单击 spring-cloud-alibaba-dependencies 跳转到对应的页面&#xff0c;搜索nacos 2、下载软件nacos 官网&#xff1a;https://nacos.io/zh-cn/ 地址 https://github.com/alibaba/nacos/releases 这里我们根据我…