OpenCV高级图形用户界面(14)交互式地选择一个或多个感兴趣区域函数selectROIs()的使用

news/2024/10/21 4:53:01/
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

允许用户在给定的图像上选择多个 ROI。

该函数创建一个窗口,并允许用户使用鼠标来选择多个 ROI。控制方式:使用空格键或回车键完成当前的选择并开始一个新的选择,使用 ESC 键终止多个 ROI 的选择过程。

注意
该函数使用 cv::setMouseCallback(windowName, …) 为指定的窗口设置自己的鼠标回调。工作完成后,将为使用的窗口设置一个空的回调。

函数原型

void cv::selectROIs	
(const String & 	windowName,InputArray 	img,std::vector< Rect > & 	boundingBoxes,bool 	showCrosshair = true,bool 	fromCenter = false,bool 	printNotice = true 
)		

参数

  • 参数windowName 显示选择过程的窗口的名称。
  • 参数wimg 用于选择 ROI 的图像。
  • 参数wboundingBoxes 选定的 ROIs。
  • 参数wshowCrosshair 如果为真,则将显示选择矩形的十字光标。
  • 参数wfromCenter 如果为真,则选择的中心将匹配初始鼠标位置。相反的情况下,选择矩形的一个角将对应于初始鼠标位置。
  • 参数wprintNotice 如果为真,则将在控制台中打印选择 ROI 或取消选择的通知。

代码示例

#include <iostream>
#include <opencv2/opencv.hpp>int main()
{// 加载图像cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/hawk.jpg", cv::IMREAD_COLOR );if ( img.empty() ){std::cerr << "Error: Image not found!" << std::endl;return -1;}// 创建窗口std::string windowName = "Select ROIs";cv::namedWindow( windowName, cv::WINDOW_NORMAL );// 显示图像cv::imshow( windowName, img );// 准备存储 ROI 的向量std::vector< cv::Rect > boundingBoxes;// 提示用户如何进行选择std::cout << "Use the mouse to draw rectangles around the regions you want to select."<< " Press space or enter to confirm a selection and start a new one."<< " Press ESC to finish the selection process." << std::endl;// 选择 ROIscv::selectROIs( windowName, img, boundingBoxes, false, false, true );// 检查是否有 ROI 被选中if ( !boundingBoxes.empty() ){// 打印所选区域的信息std::cout << "Selected ROIs:" << std::endl;for ( const auto& roi : boundingBoxes ){std::cout << "ROI at (" << roi.x << ", " << roi.y << ") with size (" << roi.width << ", " << roi.height << ")" << std::endl;}// 在原图上画出所选区域的边界框for ( const auto& roi : boundingBoxes ){cv::rectangle( img, roi, cv::Scalar( 0, 255, 0 ), 2 );}// 显示带有边界框的图像cv::imshow( windowName, img );cv::waitKey( 0 );  // 等待用户按键}else{std::cout << "No ROIs were selected." << std::endl;}// 关闭所有窗口cv::destroyAllWindows();return 0;
}

运行结果

在这里插入图片描述


http://www.ppmy.cn/news/1540700.html

相关文章

论文阅读-U3M(2)

HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE? 文章目录 HOW MUCH POSITION INFORMATION DO CONVOLUTIONAL NEURAL NETWORKS ENCODE?前言一、位置编码网络&#xff08;PosENet&#xff09;二、训练数据三、实验3.1 位置信息的存在性3.2 分析PosEN…

【LeetCode每日一题】——523.连续的子数组和

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 前缀和 二【题目难度】 中等 三【题目编号】 523.连续的子数组和 四【题目描述】 给你一个…

第2节 如何学习鸿蒙技术

以下是学习鸿蒙技术的一些途径&#xff1a; 一、官方文档与资源 1. 华为开发者官网 • 这是最权威的学习资源平台。官网提供了详细的鸿蒙操作系统的文档&#xff0c;包括架构介绍、开发指南、API参考等内容。例如&#xff0c;对于初学者来说&#xff0c;可以从入门教程开始&am…

015集——c# 实现CAD excel交互(CAD—C#二次开发入门)

第一步&#xff1a;添加引用 程序集—>扩展 namespace WindowsFormsApp2 {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){}private void 获取当前excel_Click(object sender, EventArgs e…

GNU 链接脚本

官方手册 The GNU linker 目录 3 链接脚本3.1 基本链接脚本概念3.2 链接脚本格式3.3 简单链接脚本示例3.4 简单链接脚本命令3.4.1 设置入口点3.4.2 处理文件的命令3.4.3 处理对象文件格式的命令3.4.4 为内存区域指定别名3.4.5 其他链接器脚本命令 3.5 为符号赋值3.5.1 简单赋值…

数据中台业务架构图

数据中台的业务架构是企业实现数据驱动决策和业务创新的关键支撑。它主要由数据源层、数据存储与处理层、数据服务层以及数据应用层组成。 数据源层涵盖了企业内部各个业务系统的数据&#xff0c;如 ERP、CRM 等&#xff0c;以及外部数据来源&#xff0c;如社交媒体、行业数据…

C06.L11.二维前缀和.课堂练习2.打砖块(brick)

hi&#xff01;我是AC使者&#xff01; 题目描述 KXT 是一个很无聊的小朋友&#xff0c;一天到晚都在打坐...... 一天&#xff0c;被他发现了一个比打坐更无聊的事情——打砖块。很多块砖分布在一个m*mm∗m 的矩阵中&#xff0c;他可以消掉以他为左上角顶点的一个 n*nn∗n 的…

无人机电机故障率骤降:创新设计与六西格玛方法论双赢

项目背景 TBR-100是消费级无人机头部企业推出的主打消费级无人机&#xff0c;凭借其出色的续航能力和卓越的操控性&#xff0c;在市场上获得了广泛认可。在产品运行过程&#xff0c;用户反馈电机故障率偏高&#xff0c;尤其是在飞行一段时间后出现电机过热、损坏以及运行不稳定…