- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
允许用户在给定的图像上选择一个感兴趣区域(ROI)。
该功能创建一个窗口,并允许用户使用鼠标来选择一个 ROI。控制方式:使用空格键或回车键完成选择,使用 'c' 键取消选择(此时函数将返回一个零值的 cv::Rect)
cv::selectROI 是 OpenCV 中用于让用户交互式地选择图像中的一个矩形区域的函数。该函数允许用户通过鼠标在图像上绘制一个矩形框来选择一个区域。选择完成后,函数会返回所选区域的位置和大小。
注意
该函数使用 cv::setMouseCallback(windowName, ...) 为指定的窗口设置自己的鼠标回调。工作完成后,将为使用的窗口设置一个空的回调。
函数原型
cpp
Rect cv::selectROI
(
const String & windowName,
InputArray img,
bool showCrosshair = true,
bool fromCenter = false,
bool printNotice = true
)
参数
- 参数windowName 显示选择过程的窗口的名称。
- 参数wimg 用于选择 ROI 的图像。
- 参数wshowCrosshair 如果为真,则将显示选择矩形的十字光标。
- 参数wfromCenter 如果为真,则选择的中心将匹配初始鼠标位置。相反的情况下,选择矩形的一个角将对应于初始鼠标位置。
- 参数wprintNotice 如果为真,则将在控制台中打印选择 ROI 或取消选择的通知。
返回值
返回一个 cv::Rect 对象,包含了所选区域的位置和大小信息(x, y, width, height)。如果取消返回空。
代码示例
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 winname = "Select ROI";
cv::namedWindow( winname, cv::WINDOW_NORMAL );
// 显示图像
cv::imshow( winname, img );
// 选择 ROI
cv::Rect roi = cv::selectROI( winname, img, false, false );
// 打印所选区域的信息
std::cout << "Selected ROI: " << roi << std::endl;
// 在原图上画出所选区域的边界框
cv::rectangle( img, roi, cv::Scalar( 0, 255, 0 ), 2 );
// 显示带有边界框的图像
cv::imshow( winname, img );
cv::waitKey( 0 );
// 关闭所有窗口
cv::destroyAllWindows();
return 0;
}
运行结果
我们可以鼠标左键选中一个点,摁住不放就可以选自己想选的矩形框,选好了松开左键就可以了。