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

运行结果

相关推荐
LinQingYanga23 分钟前
极客时间多模态大模型训练营毕业总结(2026年2月8日)
人工智能
pccai-vip25 分钟前
过去24小时AI创业趋势分析
人工智能
SEO_juper25 分钟前
AI SEO实战:整合传统技术与AI生成搜索的优化框架
人工智能·chatgpt·facebook·seo·geo·aeo
pp起床26 分钟前
Gen_AI 补充内容 Logit Lens 和 Patchscopes
人工智能·深度学习·机器学习
方见华Richard28 分钟前
自指-认知几何架构 可行性边界白皮书(务实版)
人工智能·经验分享·交互·原型模式·空间计算
冬奇Lab33 分钟前
AI时代的"工具自由":我是如何进入细糠时代的
人工智能·ai编程
CODECOLLECT1 小时前
技术解析|MDM移动设备管理系统无终身买断制度的底层逻辑
人工智能
北京迅为1 小时前
《【北京迅为】itop-3568开发板NPU使用手册》- 第 7章 使用RKNN-Toolkit-lite2
linux·人工智能·嵌入式·npu
我是一只puppy1 小时前
使用AI进行代码审查
javascript·人工智能·git·安全·源代码管理
阿杰学AI1 小时前
AI核心知识91——大语言模型之 Transformer 架构(简洁且通俗易懂版)
人工智能·深度学习·ai·语言模型·自然语言处理·aigc·transformer