当前位置: 首页 > news >正文

opencv c++ 检测图像尺寸大小,标注轮廓

1. 项目背景

本项目旨在开发一个图像处理程序,通过使用计算机视觉技术,能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV,实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功能,可以为用户提供一个便捷的工具,用于快速了解图像中物体的大小信息。

2. 技术与工具
  • 编程语言: C++
  • 主要库: OpenCV(版本1460)
  • 开发环境: Visual Studio(版本 2022),Windows 10
  • 版本控制: Git
3. 主要功能

本项目的主要功能包括:

  • 图像读取与预处理: 从文件系统中读取图像,并将其转换为灰度图像进行后续处理。
  • 二值化处理: 应用阈值将灰度图像转换为二值图像,以便进行轮廓检测。
  • 轮廓检测与筛选: 使用 OpenCV 提供的轮廓检测函数 findContours,并筛选出最大面积的轮廓。
  • 边界框绘制: 对检测到的最大面积轮廓绘制边界框,并计算其尺寸。
  • 尺寸分类: 根据边界框的尺寸(宽度和高度),将物体分为大、中、小三类,并输出分类结果。
  • 结果显示与保存: 将处理后的图像显示在窗口中,并可以选择保存处理结果。
4. 使用方法

用户可以通过以下步骤使用该项目:

  1. 准备图像: 将需要处理的图像放置在指定的目录中(例如 ../image/)。
  2. 运行程序: 在开发环境中编译并运行项目,或者直接运行已编译好的可执行文件。
  3. 查看结果: 程序将依次处理每张图像,检测物体的尺寸并输出分类结果。

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>using namespace std;
using namespace cv;// 函数声明:处理单张图像并输出最大边界框尺寸类别
void processImage(const string& imagePath);// 函数定义:处理单张图像并输出最大边界框尺寸类别
void processImage(const string& imagePath) {// 读取图像Mat image = imread(imagePath);// 检查图像是否成功读取if (image.empty()) {cout << "无法打开或找到图像: " << imagePath << endl;return; // 返回主函数继续处理下一张图像}// 将图像转换为灰度格式Mat img_gray;cvtColor(image, img_gray, COLOR_BGR2GRAY);// 应用二值化阈值处理int lower_gray_threshold = 35;  // 设置较低的灰度阈值 0int upper_gray_threshold = 90;  // 设置较高的灰度阈值 255Mat thresh;threshold(img_gray, thresh, lower_gray_threshold, upper_gray_threshold, THRESH_BINARY);// 在二值化图像上检测轮廓,使用 RETR_TREE 检索模式vector<vector<Point>> contours;vector<Vec4i> hierarchy;findContours(thresh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);// 找到最大面积的轮廓double max_area = 0;int max_area_index = -1;for (size_t i = 0; i < contours.size(); i++) {double area = contourArea(contours[i]);if (area > max_area) {max_area = area;max_area_index = static_cast<int>(i);}}// 如果找到最大面积的轮廓,则绘制其边界框并输出尺寸类别if (max_area_index != -1) {Mat image_copy = image.clone();// 绘制最大面积轮廓drawContours(image_copy, contours, max_area_index, Scalar(0, 255, 0), 2);// 获取最大面积轮廓的边界框Rect bounding_rect = boundingRect(contours[max_area_index]);// 绘制边界框rectangle(image_copy, bounding_rect, Scalar(0, 0, 255), 2);// 获取边界框的中心点Point center(bounding_rect.x + bounding_rect.width / 2, bounding_rect.y + bounding_rect.height / 2);// 标注宽度和高度string text = "Width: " + to_string(bounding_rect.width) + ", Height: " + to_string(bounding_rect.height);int fontFace = FONT_HERSHEY_SIMPLEX;double fontScale = 0.5;int thickness = 1;int baseline = 0;Size textSize = getTextSize(text, fontFace, fontScale, thickness, &baseline);Point textOrg(center.x - textSize.width / 2, center.y + textSize.height / 2);putText(image_copy, text, textOrg, fontFace, fontScale, Scalar(255, 0, 0), thickness);// 输出边界框的尺寸int bounding_width = bounding_rect.width;int bounding_height = bounding_rect.height;string size_category;if (bounding_width >= 2000 && bounding_height >= 2000) {size_category = "大";}else if (bounding_width >= 1000 && bounding_height >= 1000) {size_category = "中";}else {size_category = "小";}cout << "图像: " << imagePath << ",尺寸:" << bounding_width << " x " << bounding_height << ",尺寸类别:" << size_category << endl;// 显示和保存结果(可选)// imshow("最大边界框", image_copy);// string output_filename = "largest_bounding_box_" + to_string(i) + ".jpg";// imwrite(output_filename, image_copy);// waitKey(0);// destroyAllWindows();}else {cout << "在图像 " << imagePath << " 中未找到符合条件的轮廓。" << endl;}
}int main() {// 图像路径列表vector<string> imagePaths = {"D:/Project/image/001.jpg","D:/Project/image/002.jpg","D:/Project/image/003.jpg","D:/Project/image/004.jpg","D:/Project/image/005.jpg","D:/Project/image/006.jpg","D:/Project/image/007.jpg",};// 遍历处理每张图像for (const auto& imagePath : imagePaths) {processImage(imagePath);}return 0;
}

相关文章:

opencv c++ 检测图像尺寸大小,标注轮廓

1. 项目背景 本项目旨在开发一个图像处理程序&#xff0c;通过使用计算机视觉技术&#xff0c;能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV&#xff0c;实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功…...

Python数据可视化基础:使用Matplotlib绘制图表

Python数据可视化基础&#xff1a;使用Matplotlib绘制图表 数据可视化是数据分析中的重要环节&#xff0c;它可以帮助我们更直观地理解数据。Python作为一门强大的编程语言&#xff0c;提供了多种库来支持数据可视化&#xff0c;其中Matplotlib是最为流行和功能丰富的库之一。…...

Java开发接口设计的原则

在现代软件开发实践中&#xff0c;接口设计扮演着至关重要的角色。它不仅关乎代码的结构和未来的可维护性&#xff0c;还直接影响到软件系统的灵活性和扩展性。本文将通过实例详解几个核心的接口设计原则&#xff0c;帮助开发者更好地编写和管理接口&#xff0c;从而提升软件的…...

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码

国内每年都会发生大大小小的火灾&#xff0c;造成生命、财产的损失。但是很多火灾如果能够早期发现&#xff0c;并及时提供灭火措施&#xff0c;将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码&#xff0c;当检测到火灾时&#xff0c;能否发出…...

机器学习和深度学习区别

定义和范围&#xff1a; 机器学习&#xff1a;是一门多领域交叉学科&#xff0c;涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改…...

【功能详解】银河麒麟操作系统“安全启动”是如何发挥作用的?

2023年12月&#xff0c;财政部、工信部发布了7项信息类产品《政府采购需求标准》&#xff0c;为包括操作系统在内多项产品的政府集中采购提供政策支撑。其中&#xff0c;安全、可信作为国产操作系统的基本要求备受关注。 安全体系的构建离不开操作系统本身的硬实力&#xff0c…...

关于多线程的理解

#系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 关于Redis知识的理解 文章目录 前言一、线程…...

C语言 | Leetcode C语言题解之第155题最小栈

题目&#xff1a; 题解&#xff1a; //单调栈 单调递减 typedef struct {//正常 stackint stack[10000];int stackTop;//辅助 stackint minStack[10000];int minStackTop; } MinStack;MinStack* minStackCreate() {MinStack* newStack (MinStack *) malloc(sizeof(MinS…...

Qdrant 的基础教程

目录 安装Qdrant安装Qdrant客户端初始化Qdrant客户端创建集合&#xff08;Collection&#xff09;插入向量数据创建索引搜索向量清理资源 Qdrant是一个开源的向量数据库&#xff0c;它专注于高维向量的快速相似性搜索。以下是一个基础的Qdrant教程&#xff0c;帮助你开始使用Qd…...

任务4.8.3 利用SparkSQL统计每日新增用户

实战概述&#xff1a;利用SparkSQL统计每日新增用户 任务背景 在大数据时代&#xff0c;快速准确地统计每日新增用户是数据分析和业务决策的重要部分。本任务旨在使用Apache SparkSQL处理用户访问历史数据&#xff0c;以统计每日新增用户数量。 任务目标 处理用户访问历史数…...

DS知识点总结--线性表定义及顺序表示

数据结构知识点汇总(考研C版) 文章目录 数据结构知识点汇总(考研C版)二、线性表2.1 线性表的定义和操作2.1.1 线性表的定义2.1.2 线性表的基本操作 2.2 线性表的顺序表示2.2.1 顺序表的定义2.2.2 顺序表上的基本操作的实现 二、线性表 2.1 线性表的定义和操作 2.1.1 线性表的…...

百度文库AI产品“橙篇”:支持10万字长文生成,开启AI创作新篇章

6月19日&#xff0c;百度文库发布了一款创新产品「橙篇」&#xff0c;这一行业首创的产品集成了10万字长文生成及多模态编辑能力&#xff0c;成为首个实现「查阅创编」一站式AI自由创作平台的里程碑。 百度“橙篇”官网&#xff1a; 地址&#xff1a;橙篇AI - 用橙篇&#xf…...

wsl子系统ubuntu20.04 设置docker服务开机自启动

docker的重要性毋庸置疑。掌握虚拟化必备工具。windows台式机相信大家都有&#xff0c;那么开启windows的wsl子系统ubuntu来熟悉linux分布式开发就方便多了&#xff0c;用不着另购电脑。docker是在有限成本前提下尽可能多的尝试使用多OS、隔离物理环境影响的方便工具。下面就介…...

SAP ScreenPersonas

https://developers.sap.com/mission.screen-personas.html 跟着这个练习做一遍就了解了Personas 访问SAP提供的Personas练习系统 申请用户 登录练习系统 随便找一个可以支持Personas的程序搞起来&#xff0c;比如IW51 执行后等它出现这个图标就可以开始了....

充电学习—3、Uevent机制和其在android层的实现

sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs&#xff0c;userspace 可以主动去读写 kernel 的一些数据&#xff0c;同样的&#xff0c; kernel 也可以主动将一些“变化”告知给 userspace。也就是说&#xff0c;通过sysfs&#xff0c;userspace 和 ker…...

“河南省勘察设计资质整合趋势与企业应对“

"河南省勘察设计资质整合趋势与企业应对" 河南省勘察设计资质的整合趋势与企业应对策略可以从以下几个方面来分析&#xff1a; 整合趋势&#xff1a; 资质标准简化与合并&#xff1a;随着国家和地方政府深化“放管服”改革&#xff0c;勘察设计资质的管理趋向简化&…...

简单了解雪花算法

雪花算法是什么 不多解释。看一看 具体是怎么 生产 唯一ID 的。 ID 由多个数据组合拼接成64位&#xff0c;分别是 时间戳 服务器节点ID 序列号&#xff0c;每个数据项占的位数不固定&#xff0c;可以根据实际需求设置。首位 1 个二进制位 是 符号位。 public long allocate(l…...

决策树算法详细介绍原理和实现

决策树是一种常用的分类算法&#xff0c;它通过一系列的问题将数据分割成不同的分支&#xff0c;最终确定数据属于哪个类别。下面是决策树的原理、实现方式以及一个案例实现的详细介绍。 决策树原理 特征选择&#xff1a;决策树的构建过程首先需要选择一个特征作为节点&#…...

vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)

目录 第一章 vue2全局注册公共组件 1.1 方法一&#xff1a;逐个注册 1.2 方法二&#xff1a;批量注册 1.2.1 require.context()方法解释 第二章 vue3全局注册公共组件 1.1 方法一&#xff1a;逐个注册 1.2 方法二&#xff1a;批量注册 第一章 vue2全局注册公共组件 Vue…...

LoRa126X系列LoRa模块:专为物联网设计而生

LoRa126X是思为无线研发的一款应用于物联网应用的LoRa 前端模块系列&#xff0c;采用 Semtech 公司的 SX1262和SX1268 芯片。该系列模块具有小体积、低功耗&#xff0c;高灵敏度等特点&#xff0c;并且严格遵循无铅工艺生产和测试流程&#xff0c;符合 RoHS 和 Reach 环保标准。…...

从CMake报错到编译成功:一站式解决absl依赖配置难题

1. 当CMake突然报错&#xff1a;absl依赖缺失的紧急处理 第一次看到这个报错时&#xff0c;我正赶着在截止日期前完成gRPC服务的部署。控制台突然弹出的红色错误让我心头一紧&#xff1a;"Could not find a package configuration file provided by absl"。这种依赖缺…...

片上网络架构设计:集体通信硬件加速与优化

1. 轻量级片上网络架构设计解析 在当今机器学习(ML)模型规模呈指数级增长的背景下&#xff0c;大规模并行加速器已成为支撑AI计算的关键基础设施。这类系统通常采用数千个处理单元(PE)的集成设计&#xff0c;而连接这些计算资源的片上网络(NoC)性能直接决定了整个系统的效率瓶颈…...

Hive内部表 vs 外部表:选错一次,数据全丢?结合HDFS路径详解核心区别与选型指南

Hive内部表与外部表&#xff1a;数据安全与架构设计的深度抉择 在数据仓库与大数据分析领域&#xff0c;Hive作为构建在Hadoop之上的数据仓库工具&#xff0c;其表类型的选择往往被初学者视为简单的语法差异。然而&#xff0c;当生产环境中TB级的数据因为一个DROP TABLE命令而永…...

告别手动打断点:用GDB脚本自动化调试除零错误(附完整.gdb文件)

告别手动打断点&#xff1a;用GDB脚本自动化捕获除零错误实战指南 调试C/C程序时&#xff0c;最令人头疼的莫过于那些偶发的运行时错误。特别是当程序在压力测试或特定输入下突然崩溃&#xff0c;而开发者却无法稳定复现问题时&#xff0c;传统的调试方式往往显得力不从心。本…...

何为可编程控制器?可编程控制器4大内容介绍

可编程控制器在控制中常为使用&#xff0c;因此本文将从4大方面对可编程控制器予以介绍&#xff0c;以增进大家对可编程控制器的了解。这4大方面包括&#xff1a;1.何为可编程控制器?2. 可编程控制器的基本组成&#xff0c;3. 可编程控制器发展史&#xff0c;以及4. 可编程控制…...

DIY红外热像仪进阶:手把手教你用C语言实现7种伪彩色编码(附完整代码)

DIY红外热像仪进阶&#xff1a;手把手教你用C语言实现7种伪彩色编码&#xff08;附完整代码&#xff09; 当32x24的温度矩阵在屏幕上呈现为单调的灰度图像时&#xff0c;你是否想过如何让它焕发生机&#xff1f;伪彩色编码技术正是打开这扇门的钥匙。本文将带你深入探索七种经…...

Simulink仿真数据管理指南:如何用Logging和Timetable格式进行高效后处理与可视化

Simulink仿真数据管理进阶&#xff1a;从Logging到自动化分析流水线设计 在工程仿真领域&#xff0c;数据管理往往成为制约效率提升的隐形瓶颈。当Simulink模型复杂度超过200个信号节点时&#xff0c;传统的"运行-导出-手动处理"模式会消耗工程师40%以上的时间在数据…...

AI 内容生成 API 适合哪些团队?自媒体、电商、营销公司怎么用更省钱

现在很多团队都在用 AI 写内容。但很多人还停留在网页聊天阶段&#xff1a;打开一个 AI 工具&#xff0c;把需求复制进去&#xff0c;再把结果复制出来。这个方法适合个人临时用&#xff0c;但如果是团队长期做内容&#xff0c;尤其是自媒体、电商、营销公司、短视频团队&#…...

Visual C++运行库终极修复指南:一键解决软件启动失败的完整方案

Visual C运行库终极修复指南&#xff1a;一键解决软件启动失败的完整方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过游戏打不开、专业软件…...

【AI搜索时代生存指南】:Perplexity vs Google搜索的5大核心差异,90%的开发者还不知道的关键决策点

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI搜索时代的技术范式迁移 传统关键词匹配式搜索正被语义理解、上下文感知与生成式推理深度重构。AI搜索不再仅返回文档链接&#xff0c;而是直接合成答案、推演逻辑链、调用工具并动态验证结果——这标…...