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

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

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

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

注意

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

函数原型

cpp 复制代码
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 或取消选择的通知。

代码示例

cpp 复制代码
#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;

    // 选择 ROIs
    cv::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;
}

运行结果

相关推荐
python算法(魔法师版)14 分钟前
深度学习深度解析:从基础到前沿
人工智能·深度学习
kakaZhui38 分钟前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
struggle20252 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
佛州小李哥2 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
云空3 小时前
《DeepSeek 网页/API 性能异常(DeepSeek Web/API Degraded Performance):网络安全日志》
运维·人工智能·web安全·网络安全·开源·网络攻击模型·安全威胁分析
AIGC大时代3 小时前
对比DeepSeek、ChatGPT和Kimi的学术写作关键词提取能力
论文阅读·人工智能·chatgpt·数据分析·prompt
山晨啊84 小时前
2025年美赛B题-结合Logistic阻滞增长模型和SIR传染病模型研究旅游可持续性-成品论文
人工智能·机器学习
一水鉴天4 小时前
为AI聊天工具添加一个知识系统 之77 详细设计之18 正则表达式 之5
人工智能·正则表达式
davenian5 小时前
DeepSeek-R1 论文. Reinforcement Learning 通过强化学习激励大型语言模型的推理能力
人工智能·深度学习·语言模型·deepseek
X.AI6665 小时前
【大模型LLM面试合集】大语言模型架构_llama系列模型
人工智能·语言模型·llama