如何在OpenCV / Python中创建可拖动/可调整的ROI?

时间:2014-02-11 07:54:19

标签: python opencv image-processing user-controls

在对图像执行处理算法之前,我需要用户点击一个圆圈以使用鼠标创建剪贴蒙版。此掩码将用于删除将导致我的算法失败的图像区域。

我如何允许用户:

  1. 拖动ROI(调整图像上的x-y位置)

  2. 通过拖动调整ROI的形状(即圆圈的大小)

  3. 将来我需要使用一些功能检测来选择ROI,但是现在我真的需要用户能够以一种对他们来说容易的方式定义ROI,

2 个答案:

答案 0 :(得分:2)

如果你安装了scikit-image,你可以使用以下方法进行矩形选择(虽然修改skimage代码来做一个圆圈而不是很难):

import matplotlib.pyplot as plt
from skimage import data
from skimage.viewer.canvastools import RectangleTool

f, ax = plt.subplots()
ax.imshow(data.camera(), interpolation='nearest', cmap='gray')

props = {'facecolor': '#000070',
         'edgecolor': 'white',
         'alpha': 0.3}
rect_tool = RectangleTool(ax, rect_props=props)

plt.show()
print("Final selection:")
rect_tool.callback_on_enter(rect_tool.extents)

按Enter键完成选择。

Rectangle Selector

答案 1 :(得分:1)

不能再支持Stefan给出的代码片段(当ax传递给RectangleTool时它会失败)。 RectangleTool仅将skimage查看器作为参数。这是一段改编自Stephan示例和skimage documentation的代码。它提供了一种检索ROI坐标的交互方式。

from pylab import *
from skimage import data
from skimage.viewer.canvastools import RectangleTool
from skimage.viewer import ImageViewer

im = data.camera()

def get_rect_coord(extents):
    global viewer,coord_list
    coord_list.append(extents)

def get_ROI(im):
    global viewer,coord_list

    selecting=True
    while selecting:
        viewer = ImageViewer(im)
        coord_list = []
        rect_tool = RectangleTool(viewer, on_enter=get_rect_coord) 
        print "Draw your selections, press ENTER to validate one and close the window when you are finished"
        viewer.show()
        finished=raw_input('Is the selection correct? [y]/n: ')
        if finished!='n':
            selecting=False
    return coord_list

a=get_ROI(im)
print a