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;
}

运行结果

相关推荐
唐某人丶24 分钟前
教你如何用 JS 实现 Agent 系统(2)—— 开发 ReAct 版本的“深度搜索”
前端·人工智能·aigc
FIT2CLOUD飞致云42 分钟前
九月月报丨MaxKB在不同规模医疗机构的应用进展汇报
人工智能·开源
阿里云大数据AI技术44 分钟前
【新模型速递】PAI-Model Gallery云上一键部署Qwen3-Next系列模型
人工智能
袁庭新1 小时前
全球首位AI机器人部长,背负反腐重任
人工智能·aigc
机器之心1 小时前
谁说Scaling Law到头了?新研究:每一步的微小提升会带来指数级增长
人工智能·openai
算家计算2 小时前
AI配音革命!B站最新开源IndexTTS2本地部署教程:精准对口型,情感随心换
人工智能·开源·aigc
量子位2 小时前
马斯克周末血裁xAI 500人
人工智能·ai编程
算家计算2 小时前
OpenAI最强编程模型GPT-5-Codex发布!可独立编程7小时,编程效率提升10倍
人工智能·ai编程·资讯
聚客AI3 小时前
🌟大模型为什么产生幻觉?预训练到推理的漏洞全揭秘
人工智能·llm·掘金·日新计划
Juchecar4 小时前
一文讲清 nn.Sequential 等容器类
人工智能