opencv c++ 检测图像尺寸大小,标注轮廓
1. 项目背景
本项目旨在开发一个图像处理程序,通过使用计算机视觉技术,能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV,实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功能,可以为用户提供一个便捷的工具,用于快速了解图像中物体的大小信息。
2. 技术与工具
- 编程语言: C++
- 主要库: OpenCV(版本1460)
- 开发环境: Visual Studio(版本 2022),Windows 10
- 版本控制: Git
3. 主要功能
本项目的主要功能包括:
- 图像读取与预处理: 从文件系统中读取图像,并将其转换为灰度图像进行后续处理。
- 二值化处理: 应用阈值将灰度图像转换为二值图像,以便进行轮廓检测。
- 轮廓检测与筛选: 使用 OpenCV 提供的轮廓检测函数
findContours
,并筛选出最大面积的轮廓。 - 边界框绘制: 对检测到的最大面积轮廓绘制边界框,并计算其尺寸。
- 尺寸分类: 根据边界框的尺寸(宽度和高度),将物体分为大、中、小三类,并输出分类结果。
- 结果显示与保存: 将处理后的图像显示在窗口中,并可以选择保存处理结果。
4. 使用方法
用户可以通过以下步骤使用该项目:
- 准备图像: 将需要处理的图像放置在指定的目录中(例如
../image/
)。 - 运行程序: 在开发环境中编译并运行项目,或者直接运行已编译好的可执行文件。
- 查看结果: 程序将依次处理每张图像,检测物体的尺寸并输出分类结果。
#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. 项目背景 本项目旨在开发一个图像处理程序,通过使用计算机视觉技术,能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV,实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功…...
Python数据可视化基础:使用Matplotlib绘制图表
Python数据可视化基础:使用Matplotlib绘制图表 数据可视化是数据分析中的重要环节,它可以帮助我们更直观地理解数据。Python作为一门强大的编程语言,提供了多种库来支持数据可视化,其中Matplotlib是最为流行和功能丰富的库之一。…...
Java开发接口设计的原则
在现代软件开发实践中,接口设计扮演着至关重要的角色。它不仅关乎代码的结构和未来的可维护性,还直接影响到软件系统的灵活性和扩展性。本文将通过实例详解几个核心的接口设计原则,帮助开发者更好地编写和管理接口,从而提升软件的…...

[火灾警报系统]yolov5_7.0-pyside6火焰烟雾识别源码
国内每年都会发生大大小小的火灾,造成生命、财产的损失。但是很多火灾如果能够早期发现,并及时提供灭火措施,将会大大较小损失。本套源码采用yolov5-7.0目标检测算法结合pyside6可视化界面源码,当检测到火灾时,能否发出…...
机器学习和深度学习区别
定义和范围: 机器学习:是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改…...

【功能详解】银河麒麟操作系统“安全启动”是如何发挥作用的?
2023年12月,财政部、工信部发布了7项信息类产品《政府采购需求标准》,为包括操作系统在内多项产品的政府集中采购提供政策支撑。其中,安全、可信作为国产操作系统的基本要求备受关注。 安全体系的构建离不开操作系统本身的硬实力,…...
关于多线程的理解
#系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 关于Redis知识的理解 文章目录 前言一、线程…...

C语言 | Leetcode C语言题解之第155题最小栈
题目: 题解: //单调栈 单调递减 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客户端创建集合(Collection)插入向量数据创建索引搜索向量清理资源 Qdrant是一个开源的向量数据库,它专注于高维向量的快速相似性搜索。以下是一个基础的Qdrant教程,帮助你开始使用Qd…...

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

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日,百度文库发布了一款创新产品「橙篇」,这一行业首创的产品集成了10万字长文生成及多模态编辑能力,成为首个实现「查阅创编」一站式AI自由创作平台的里程碑。 百度“橙篇”官网: 地址:橙篇AI - 用橙篇…...
wsl子系统ubuntu20.04 设置docker服务开机自启动
docker的重要性毋庸置疑。掌握虚拟化必备工具。windows台式机相信大家都有,那么开启windows的wsl子系统ubuntu来熟悉linux分布式开发就方便多了,用不着另购电脑。docker是在有限成本前提下尽可能多的尝试使用多OS、隔离物理环境影响的方便工具。下面就介…...

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

充电学习—3、Uevent机制和其在android层的实现
sysfs 是 Linux userspace 和 kernel 进行交互的一个媒介。通过 sysfs,userspace 可以主动去读写 kernel 的一些数据,同样的, kernel 也可以主动将一些“变化”告知给 userspace。也就是说,通过sysfs,userspace 和 ker…...
“河南省勘察设计资质整合趋势与企业应对“
"河南省勘察设计资质整合趋势与企业应对" 河南省勘察设计资质的整合趋势与企业应对策略可以从以下几个方面来分析: 整合趋势: 资质标准简化与合并:随着国家和地方政府深化“放管服”改革,勘察设计资质的管理趋向简化&…...

简单了解雪花算法
雪花算法是什么 不多解释。看一看 具体是怎么 生产 唯一ID 的。 ID 由多个数据组合拼接成64位,分别是 时间戳 服务器节点ID 序列号,每个数据项占的位数不固定,可以根据实际需求设置。首位 1 个二进制位 是 符号位。 public long allocate(l…...
决策树算法详细介绍原理和实现
决策树是一种常用的分类算法,它通过一系列的问题将数据分割成不同的分支,最终确定数据属于哪个类别。下面是决策树的原理、实现方式以及一个案例实现的详细介绍。 决策树原理 特征选择:决策树的构建过程首先需要选择一个特征作为节点&#…...

vue:vue2与vue3如何全局注册公共组件(包括涉及到的相关方法函数的讲解)
目录 第一章 vue2全局注册公共组件 1.1 方法一:逐个注册 1.2 方法二:批量注册 1.2.1 require.context()方法解释 第二章 vue3全局注册公共组件 1.1 方法一:逐个注册 1.2 方法二:批量注册 第一章 vue2全局注册公共组件 Vue…...

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

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...
32位寻址与64位寻址
32位寻址与64位寻址 32位寻址是什么? 32位寻址是指计算机的CPU、内存或总线系统使用32位二进制数来标识和访问内存中的存储单元(地址),其核心含义与能力如下: 1. 核心定义 地址位宽:CPU或内存控制器用32位…...
RLHF vs RLVR:对齐学习中的两种强化方式详解
在语言模型对齐(alignment)中,强化学习(RL)是一种重要的策略。而其中两种典型形式——RLHF(Reinforcement Learning with Human Feedback) 与 RLVR(Reinforcement Learning with Ver…...

基于小程序老人监护管理系统源码数据库文档
摘 要 近年来,随着我国人口老龄化问题日益严重,独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长,随之而来的是日益突出的老年人问题,尤其是老年人的健康问题,尤其是老年人产生健康问题后&…...