使用libdmtx库高效识别DM码,关键是图像预处理

直接代码

void MainWindow::on_pushButton_decode_datamatrix_clicked()
{//ROIcv::Rect rect(876,172,1200,1200);cv::Mat Dm_image_roi = Dm_image(rect);cv::imshow("ROI",Dm_image_roi);cv::waitKey(1);//return;//Resizecv::Size size(Dm_image_roi.rows/2 ,Dm_image_roi.cols/2);cv::Mat resize_image;cv::resize(Dm_image_roi,resize_image,size);cv::imshow("Resize",resize_image);cv::waitKey(1);//return;//平滑cv::Mat blur_mat;cv::medianBlur(resize_image,blur_mat,5);cv::imshow("blur_mat",blur_mat);cv::waitKey(1);//二值化//cv::Mat threshold_image;//cv::threshold(resize_image,threshold_image,50,255,0);//cv::imshow("threshold",threshold_image);//cv::waitKey(1);//cv::imwrite("C:/Users/OKAGV/Desktop/threshold.bmp",threshold_image);//修改低于某阈值的像素值cv::Mat threshold_image = blur_mat.clone();int h = threshold_image.rows;int w = threshold_image.cols;int dims = threshold_image.channels();for(int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {if (dims == 1) {//灰度图像int pv = threshold_image.at<uchar>(row, col);if(pv > 70){threshold_image.at<uchar>(row, col) = 255;}}if (dims == 3) {//彩色图像cv::Vec3b bgr = threshold_image.at<cv::Vec3b>(row, col);if(bgr[0] > 70){threshold_image.at<cv::Vec3b>(row, col)[0] = 255;threshold_image.at<cv::Vec3b>(row, col)[1] = 255;threshold_image.at<cv::Vec3b>(row, col)[2] = 255;}}}}cv::imshow("threshold_image", threshold_image);cv::waitKey(1);cv::Mat open_image;cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5));cv::morphologyEx(threshold_image,open_image,cv::MORPH_CLOSE,element);cv::imshow("open",open_image);cv::waitKey(1);//cv::imwrite("C:/Users/OKAGV/Desktop/open.bmp",open_image);cv::Mat dilate_image;cv::Mat element2 = cv::getStructuringElement(cv::MORPH_RECT,cv::Size(5,5));cv::morphologyEx(open_image,dilate_image,cv::MORPH_ERODE,element2);cv::imshow("dilate",dilate_image);cv::waitKey(1);//cv::imwrite("C:/Users/OKAGV/Desktop/dilate.bmp",dilate_image);//转换为QImageQImage qcolor = QImage((const unsigned char*)(dilate_image.data),dilate_image.cols, dilate_image.rows, dilate_image.step,QImage::Format_RGB888);QTime time;time.start();QImage img = qcolor;                 //globalImg2;if(img.isNull()){QMessageBox::information(this,"信息","打开文件失败");}else{DmtxMessage *msg;DmtxRegion *reg;QImage src =img.copy();DmtxImage *imgdtx;QPixmap pix=QPixmap::fromImage(src);QString str;int leftLineAngle;int bottomLineAngle;int cornerx;int cornery;//qDebug()<<"src.format() "<<src.format();if(src.format()==QImage::Format_Mono){src=src.convertToFormat(QImage::Format_ARGB32);//qDebug()<<"转换后:src.format() "<<src.format();}int pack=DmtxPack32bppXRGB;switch(src.format()){case QImage::Format_ARGB32:pack=DmtxPack32bppXRGB;break;case QImage::Format_RGB32:pack=DmtxPack32bppXRGB;break;case QImage::Format_RGB888:pack=DmtxPack24bppRGB;break;case QImage::Format_Indexed8:pack=DmtxPack8bppK;break;case  QImage::Format_Grayscale8:pack=DmtxPack8bppK;}// 增加超时时间。DmtxTime beginTime = dmtxTimeNow();	// 根据系统设置情况,获得当前时间long timeout_ms = 2000;DmtxTime stopTime = dmtxTimeAdd(beginTime, timeout_ms);	// 增加xx msimgdtx = dmtxImageCreate(src.bits(),src.width(),src.height(),pack);Q_ASSERT(imgdtx != NULL);DmtxDecode *dec = dmtxDecodeCreate(imgdtx, 1);Q_ASSERT(dec != NULL);reg = dmtxRegionFindNext(dec,&stopTime);	// 如果超时则认为没有找到// assert(reg != NULL);if(dmtxTimeExceeded(stopTime)){//qDebug()<<"超时";QMessageBox::information(this,"信息","decode timeout");}else{if (reg != NULL){msg = dmtxDecodeMatrixRegion(dec, reg, DmtxUndefined);if (msg != NULL){//                    cout << msg->output << endl;//                    cout << msg->outputIdx << endl;std::string strout = (char*)msg->output;//解码信息str=QString::fromStdString(strout);QString outmsg=QString("<font color=\"#00FF00\">%1</font>").arg(QString::fromStdString(strout));ui->textEdit->setText(outmsg);//  qDebug()<<"reg->leftAngle "<<reg->leftAngle;//  qDebug()<<"reg->leftAngle "<<reg->bottomAngle;//   qDebug()<<"reg->finalPos.X "<<reg->finalPos.X;//   qDebug()<<"reg->finalPos.Y "<<reg->finalPos.Y;//qDebug()<<"reg->leftLine.mag"<<reg->leftLine.mag;//qDebug()<<"reg->leftLine.hOffset"<<reg->leftLine.hOffset;//qDebug()<<"reg->leftLine.stepBeg"<<reg->leftLine.stepBeg;//qDebug()<<"reg->leftLine.stepPos"<<reg->leftLine.stepPos;//qDebug()<<"reg->leftLine.stepNeg"<<reg->leftLine.stepNeg;//qDebug()<<"reg->leftLine.distSq"<<reg->leftLine.distSq;//qDebug()<<"reg->leftLine.locBeg.X "<<reg->leftLine.locBeg.X;//qDebug()<<"reg->leftLine.locBeg.Y "<<reg->leftLine.locBeg.Y;//                    qDebug()<<"reg->leftLine.locPos.X "<<reg->leftLine.locPos.X;//准的
//                    qDebug()<<"reg->leftLine.locPos.Y "<<reg->leftLine.locPos.Y;//准的
//                    qDebug()<<"reg->leftLine.locNeg.X "<<reg->leftLine.locNeg.X;//准的
//                    qDebug()<<"reg->leftLine.locNeg.Y "<<reg->leftLine.locNeg.Y;//准的
//                    qDebug()<<"bottomLine.locPos.X "<<reg->bottomLine.locPos.X;
//                    qDebug()<<"bottomLine.locPos.Y "<<reg->bottomLine.locPos.Y;
//                    qDebug()<<"bottomLine.locNeg.X "<<reg->bottomLine.locNeg.X;
//                    qDebug()<<"bottomLine.locNeg.y "<<reg->bottomLine.locNeg.Y;QPainter p;p.begin(&pix);p.setPen(QPen(Qt::blue, 2));p.drawEllipse(reg->leftLine.locPos.X-5,pix.height()-reg->leftLine.locPos.Y-5, 10, 10);//准的p.setPen(QPen(Qt::yellow, 2));p.drawEllipse(reg->leftLine.locNeg.X-5,img.height()-reg->leftLine.locNeg.Y-5, 10, 10);//准的p.setPen(QPen(Qt::darkRed, 2));p.drawEllipse(reg->bottomLine.locPos.X-5,img.height()-reg->bottomLine.locPos.Y-5, 10, 10);//准的p.setPen(QPen(Qt::darkGreen, 2));p.drawEllipse(reg->bottomLine.locNeg.X-5,img.height()-reg->bottomLine.locNeg.Y-5, 10, 10);//准的int lineOriginX=(reg->leftLine.locNeg.X+reg->bottomLine.locPos.X)/2;int lineOriginY=img.height()-(reg->leftLine.locNeg.Y+reg->bottomLine.locPos.Y)/2;int lineLeftX=reg->leftLine.locPos.X;int lineLeftY=pix.height()-reg->leftLine.locPos.Y;int lineBottomX=reg->bottomLine.locNeg.X;int lineBottomY=img.height()-reg->bottomLine.locNeg.Y;p.setPen(QPen(Qt::red, 2));p.drawLine(lineOriginX,lineOriginY,lineLeftX,lineLeftY);p.drawLine(lineOriginX,lineOriginY,lineBottomX,lineBottomY);p.end();leftLineAngle=reg->leftLine.angle;bottomLineAngle=reg->bottomAngle;cornerx=lineOriginX;cornery=lineOriginY;dmtxMessageDestroy(&msg);}else{//qDebug()<<"无法检测到2";QMessageBox::information(this,"信息","无法检测到2");}dmtxRegionDestroy(&reg);}else{//qDebug()<<"无法检测到1";QMessageBox::information(this,"信息","无法检测到1");}}dmtxDecodeDestroy(&dec);dmtxImageDestroy(&imgdtx);//qDebug()<<time.elapsed()/1000.0<<"s";ui->label_data_matrix->clear();
//        src=src.scaled(ui->label->width(),ui->label->height(),Qt::KeepAspectRatio);//Qt::KeepAspectRatio自适应大小,不变形
//        ui->label->setPixmap(QPixmap::fromImage(src));//QImage 显示速度慢pix=pix.scaled(ui->label_data_matrix->width(),ui->label_data_matrix->height(),Qt::KeepAspectRatio);//Qt::KeepAspectRatio自适应大小,不变形ui->label_data_matrix->setPixmap(pix);ui->label_base->clear();QString base_str=str.left(8);QString label_base_text=QString("信息:左边 %1°底边 %2°角点X %3 角点Y %4 内容 %5..").arg(leftLineAngle).arg(bottomLineAngle).arg(cornerx).arg(cornery).arg(base_str);ui->label_base->setText(label_base_text);QString timestr= QString("解码耗时 ")+ QString::number(time.elapsed())+ QString(" ms");ui->label_time->setText(timestr);}//dataMatrixDecode();//简化版本
}

其中预处理中最关键的是,自己测试的时候也有蒙的成分,但是效果很好

    //修改低于某阈值的像素值cv::Mat threshold_image = blur_mat.clone();int h = threshold_image.rows;int w = threshold_image.cols;int dims = threshold_image.channels();for(int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {if (dims == 1) {//灰度图像int pv = threshold_image.at<uchar>(row, col);if(pv > 70){threshold_image.at<uchar>(row, col) = 255;}}if (dims == 3) {//彩色图像cv::Vec3b bgr = threshold_image.at<cv::Vec3b>(row, col);if(bgr[0] > 70){threshold_image.at<cv::Vec3b>(row, col)[0] = 255;threshold_image.at<cv::Vec3b>(row, col)[1] = 255;threshold_image.at<cv::Vec3b>(row, col)[2] = 255;}}}}cv::imshow("threshold_image", threshold_image);cv::waitKey(1);

附图一张
在这里插入图片描述

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

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

相关文章

MySQL的主从复制(主从数据库都是Linux版本)

概述 1.什么是主从复制 主从复制是指将主库的 DDL 和 DML 操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;&#xff0c;从而使得从库和主库的数据保持一致。 2.主从复制作用 数据备份&#xff1a;通过主从复…

SQL:学习SQL优化

学习 1.语句 2.原则&#xff08;三条快速记忆&#xff09; 3.常见查询类型 试验 本次试验采用SQL表中的world 数据库中city表来试验 1.查询方法 explain SELECT * FROM city where ID>500 limit 10; #1.all查询&#xff0c;主要是因为查询的键不是District&#xff0c;…

新加坡裸机云多IP服务器与跨境外贸业务的适配性

在数字化时代&#xff0c;跨境外贸业务对服务器的需求愈发高标准化、多元化。新加坡裸机云多IP服务器&#xff0c;凭借其独特的优势&#xff0c;成为了跨境外贸等业务的首选。源库主机测评将为您科普新加坡裸机云多IP服务器如何满足跨境外贸等业务的需要。 首先&#xff0c;新加…

工业交换机的好处有哪些?

工业交换机是现代工业网络中不可或缺的重要组成部分&#xff0c;它扮演着连接和管理各种网络设备的关键角色。工业交换机的优点不言而喻&#xff0c;首先是其稳定可靠的性能&#xff0c;能够支撑工业环境下的高负荷工作。无论是在恶劣的温度、湿度或电磁干扰的环境下&#xff0…

【Java】/*类和对象(上)*/

目录 一、什么是类、什么是对象 二、为什么要学习类和对象 三、初识面向过程和面向对象编程 四、如何定义类 4.1 语法形式 4.2 定义示例 示例一&#xff1a;定义一个描述学生的类 示例二&#xff1a;定义一个描述冰箱的类 示例二&#xff1a;定义一个描述狗的类 4.3…

MySQL5个查询

# 总查询 EXPLAIN SELECT * FROM city; # 范围查询 EXPLAIN SELECT * from city where ID>5 and ID<20; #主键查询 EXPLAIN SELECT * from city where ID5; # 索引查询 EXPLAIN SELECT * from city where CountryCodeNLD; # 普通索引 EXPLAIn SELECT * from cit…

7 Series FPGAs Integrated Block for PCI Express IP核简介

7 Series FPGAs Integrated Block for PCI Express IP核是Xilinx公司7系列FPGA中集成的PCI Express&#xff08;PCIe&#xff09;IP核模块&#xff0c;是一个可扩展的、高带宽的、可靠的串行互联构建块&#xff0c;用于与Xilinx的Zynq-7000 SoC和7系列FPGA配合使用。它支持1-la…

【算法】栈——逆波兰表达式求值

题解&#xff1a;逆波兰表达式求值(栈算法) 目录 1.题目2.题意2.1逆波兰表达式2.2向零截断 3.题解4.总结 1.题目 题目链接&#xff1a;LINK 2.题意 这个题目种涉及一些概念&#xff0c;应当适当说一下。 2.1逆波兰表达式 即后缀表达式&#xff0c;是一种数学表达式的表达…

全自动机器学习AutoML高效预测时间序列

大家好&#xff0c;时间序列数据是许多现实世界问题的核心&#xff0c;例如预测能源消耗、气象预报、库存管理。传统上&#xff0c;使用专门的时间序列模型如Prophet来对此类数据进行建模和预测。然而&#xff0c;通过将时间序列数据转换为表格格式&#xff0c;可以利用更广泛的…

【全开源】多场馆场地预定小程序源码(ThinkPHP+FastAdmin+UniApp)

场馆场地预定小程序源码一款基于ThinkPHPFastAdminUniApp开发的多场馆场地预定小程序&#xff0c;提供运动场馆运营解决方案&#xff0c;适用于体育馆、羽毛球馆、兵乒球馆、篮球馆、网球馆等场馆&#xff08;高级版&#xff09;

如何将word插入的形状转成图片(高清)导出?

文章目录 前言&#xff08;不感兴趣可以直接看正文&#xff09;一、新建画布二、插入形状三、复制四、粘贴为图片五、另存为总结 前言&#xff08;不感兴趣可以直接看正文&#xff09; 因为我毕业论文里的图片刚开始使用画图软件画的&#xff0c;但到后期论文即将胶印的时候&a…

HarmonyOS interface router scale pageTransition SlideEffect.Left ArkTS ArkUI

&#x1f3ac;️create Component export default struct TitleBar {build(){Row(){Text(transition).fontSize(30fp).fontColor(Color.White)}.width(100%).height(8%).backgroundColor(#4169E1).padding({left:10})}}&#x1f39e;️interface export interface IList{ti…

EXPLAIN执行计划详解

EXPLAIN 是 MySQL 中的一个非常实用的命令&#xff0c;主要用于分析 SQL 查询语句的执行计划&#xff08;Query Execution Plan&#xff0c;QEP&#xff09;。通过这个命令&#xff0c;用户可以获取到数据库引擎如何执行特定的 SQL 语句的详细信息&#xff0c;这对于优化查询性…

DLRover:蚂蚁集团开源的AI训练革命

在当前的深度学习领域&#xff0c;大规模训练作业面临着一系列挑战。首先&#xff0c;硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次&#xff0c;传统的检查点机制在大规模训练中效率低下&#xff0c;耗时长且容易降低训练的有效时间。资源管理的复杂性也给…

Codigger编码场景介绍(二):驾驶舱场景(Cockpit)

Codigger&#xff0c;一个专为开发人员设计的工具&#xff0c;致力于为不同的开发场景提供最佳的切换体验。Codigger囊括了多种场景&#xff0c;如传统场景、调试场景、设计器场景、驾驶舱场景以及纯净场景等。在上一篇文章中&#xff0c;我们介绍了传统场景模式&#xff0c;今…

数据结构_栈在括号匹配中的应用_代码

学习笔记 #include<stdio.h> #include<stdlib.h> #include<string.h>#define MaxSize 10 typedef struct{char data[MaxSize];int top; }SqStack;//初始化栈 void InitStack(SqStack &S){S.top 0; } //判断栈是否为空 bool StackEmpty(SqStack S){if (…

深度学习之基于YoloV5钢材微小缺陷检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在钢材生产过程中&#xff0c;由于各种因素&#xff0c;钢材表面可能会出现微小缺陷&#xff…

DevOps实践:通过云效实现hexo自动构建部署发布

DevOps&#xff08;Development和Operations的组合词&#xff09;是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。这是一种重视“软件开发人员&a…

如何科学制定个性化健康方案?

随着现代生活节奏的加快&#xff0c;慢性病已经成为困扰许多人的健康难题。在这个信息爆炸的时代&#xff0c;如何科学、有效地管理个人健康&#xff0c;成为了我们每个人必须面对的问题。今天&#xff0c;我们就来探讨一下如何通过一体化解决方案&#xff0c;科学制定个性化健…

接口自动化测试工具-----pytest

首先确保安装了Python环境&#xff0c;首先&#xff0c;你需要确保已安装 Python 和 Pip。如果还没有安装&#xff0c;可以从 Python 官方网站下载并安装最新版本的 Python。安装过程中请确保选中“Add Python to PATH”选项。 安装pytest:打开命令提示符&#xff08;Command …