- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
允许用户在给定的图像上选择多个 ROI。
该函数创建一个窗口,并允许用户使用鼠标来选择多个 ROI。控制方式:使用空格键或回车键完成当前的选择并开始一个新的选择,使用 ESC 键终止多个 ROI 的选择过程。
注意
该函数使用 cv::setMouseCallback(windowName, …) 为指定的窗口设置自己的鼠标回调。工作完成后,将为使用的窗口设置一个空的回调。
函数原型
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 或取消选择的通知。
代码示例
#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;
}