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

运行结果

相关推荐
伏小白白白14 分钟前
【论文精度-2】求解车辆路径问题的神经组合优化算法:综合展望(Yubin Xiao,2025)
人工智能·算法·机器学习
应用市场17 分钟前
OpenCV编程入门:从零开始的计算机视觉之旅
人工智能·opencv·计算机视觉
星域智链36 分钟前
宠物智能用品:当毛孩子遇上 AI,是便利还是过度?
人工智能·科技·学习·宠物
taxunjishu1 小时前
DeviceNet 转 MODBUS TCP罗克韦尔 ControlLogix PLC 与上位机在汽车零部件涂装生产线漆膜厚度精准控制的通讯配置案例
人工智能·区块链·工业物联网·工业自动化·总线协议
说私域1 小时前
基于多模态AI技术的传统行业智能化升级路径研究——以开源AI大模型、AI智能名片与S2B2C商城小程序为例
人工智能·小程序·开源
囚生CY1 小时前
【速写】优化的深度与广度(Adam & Moun)
人工智能·python·算法
hqyjzsb1 小时前
2025年市场岗位能力重构与跨领域转型路径分析
c语言·人工智能·信息可视化·重构·媒体·改行学it·caie
爱学习的uu1 小时前
CURSOR最新使用指南及使用思路
人工智能·笔记·python·软件工程
叶凡要飞2 小时前
RTX5060Ti安装双系统ubuntu22.04各种踩坑点(黑屏,引导区修复、装驱动、server版本安装)
人工智能·python·yolo·ubuntu·机器学习·操作系统
叶庭云2 小时前
一文掌握 CodeX CLI 安装以及使用!
人工智能·openai·安装·使用教程·codex cli·编码智能体·vibe coding 终端