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

运行结果

相关推荐
夏文强2 分钟前
DeepSeek Harness 底层探秘:Cordis 元框架与「一切皆插件」的实现
人工智能·开源·大模型·agent·deepseek
龙亘川3 分钟前
智赋能文旅领域治理|一网统管能做什么?文化服务管理系统四大场景拆解
大数据·人工智能
指针常量4 分钟前
【RL相关笔记】RL 效率综述
人工智能·笔记·大语言模型·后训练
番茄不是西红柿kk6 分钟前
OpenCode Go 与 Command Code 性价比深度分析(2026.09.04 更新)
人工智能·opencode·commondcode
Carl_奕然13 分钟前
【智能体】Agent的四种设计模式之:React(2026最新版)
javascript·人工智能·python·react.js·设计模式·语言模型
Thomas.Sir14 分钟前
第24课:TensorFlow|图像分类实战训练【手写数字、日常图像分类完整项目】
人工智能·分类·tensorflow
Herlie21 分钟前
2026,当AI不再是“玩具”:01Agent如何终结内容创作的“碎片化时代”?
人工智能
2601_9676598822 分钟前
AI重构流量入口,本地GEO服务正在成为一门新生意
人工智能
是翎23 分钟前
Vibe Coding零基础入门:六步工作流拆解
大数据·人工智能·学习·机器学习·数据挖掘