在本文中,我们将一起探索 OpenCV 库中一个非常有趣的应用 —— selectROI()。利用这个方法,我们可以通过在图像上手动框选区域,来指定我们感兴趣的范围。
> 语法:
>
>
>
> *cv2.selectROI(Window_name, source image)*
>
>
>
> 参数:
>
>
> – window_name: 显示选择过程的窗口名称。
> – source image: 需要选择 ROI(感兴趣区域)的源图像。
> – showCrosshair: 如果为真,选择矩形的中心十字线将会显示。
> – fromCenter: 如果为真,选择的中心点将与初始鼠标位置匹配。
在 OpenCV 中使用这个函数,我们可以精确地手动从图像中选出我们所需的感兴趣区域,进而对该特定区域执行许多任务。我们可以将那个特定区域作为输入传递给另一个任务,也可以使用坐标在区域上绘制跟踪图形(矩形),或者可以精确且自由地裁剪图像。
首先,我们需要导入所需的库,在这里也就是 OpenCV 和 NumPy。NumPy 库在这个程序中起着至关重要的作用,因为 OpenCV 使用 NumPy 作为底层支柱来进行所有的图像处理操作。
在对图像进行各种操作之前,显然我们需要先读取图像。将其存储在一个变量中,以便在后续的处理中访问它。
语法:
> cv2.imread(source image)
现在让我们进入真正的核心函数 —— selectROI()。基本上,这个函数允许我们在图像中选择一个感兴趣的范围(图像的特定区域)并在该区域执行不同的操作。在这个特定的示例中,我们将对图像进行裁剪以显示裁剪后的结果。
接下来我们将调用 INLINECODE433e3c81 函数并将图像作为参数传入。该函数会返回一个包含不同值的数组,其中包含了所选区域左上角点的坐标以及 ROI 的宽度和高度。我们要把它存储在一个名为 "r" 的变量中。基本上,它就是图像中选定矩形的左上角像素位置加上宽度和高度,输出数组的顺序为:[左上角X, 左上角_Y, 宽度, 高度]
toplefty = topleftrow = y1
topleftx = topleftcol = x1
> 注意: selectROI() 函数有其默认的输出行为,它会自动显示图像并让我们在图像中手动选择 ROI。我们还可以通过在函数中传递窗口名称参数来给该窗口命名。
函数控制操作: 在选择完 ROI 后,我们需要按下空格键或回车键来确认选定的区域。按下 C 键则取消选择。接下来,我们将使用这些坐标来选定位定的区域,将其裁剪出来并显示结果。若要使用 NumPy 数组裁剪图像,
语法:
> sourceimage[ startrow : endrow, startcol : end_col]
我们需要在其中传入图像像素的起始值和结束值。最后,我们将显示裁剪后的图像并销毁所有窗口。
程序代码: 用于选择和裁剪图像的程序。
Python3
CODEBLOCK_93a21bb2
#### 输出结果: