如何在opencv 2.4.11 python中调整轮廓大小? (目标:对象提取)

时间:2015-07-27 04:16:17

标签: python opencv mask contour

我是opencv的新手,所以请原谅我的无知......

基本上:我的形象中有一个感兴趣的对象。我想提取它。

我的问题来自缩小原始图像以便于处理。我在较小的图像上找到了对象的轮廓。我真正想做的是使用有关该轮廓的信息从原始全尺寸图像中提取对象。

我真的只想到两种方法来做到这一点,但我不知道哪些方法在opencv中实际上有意义:

  1. 调整轮廓大小。然后在原始图像上绘制。
  2. (我使用的那个,没有成功......)使用轮廓创建一个蒙版。调整面具大小。然后将蒙版添加到原始图像。
  3. 我使用的是2号,但我认为面具有问题。已调整大小,不再包含轮廓。

    以下是我当前代码的重要部分:

    image = cv2.imread(path)
    orig = image.copy()
    ...
    
    #resize the image
    image = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
    ....
    
    #convert to gray scale
    ...
    
    #get contour
    (cnts, _) = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    ...
    screenCnt = cv2.approxPolyDP(c, 0.01 * peri, True) #<--the contour
    ...
    
    #create the mask
    mask = np.ones(image.shape,np.uint8)*255
    cv2.drawContours(mask,[screenCnt],0,(0,0,0),-1)
    cv2.imshow("Small mask",mask) #<--- looks good
    print(mask.shape) #<---returns a 3 element tuple
    cv2.waitKey(0)
    
    #now resize the mask
    mask_big = cv2.resize(mask,(0,0),fx=ratio,fy=300)
    cv2.imshow("Big mask",mask_big) #<--- ends up big, but all white (no contour)
    cv2.waitKey(0)
    

    我一直在没有运气的情况下搜索互联网,但我想我在这里缺少一些基本的东西。 万分感谢所有回答者!

1 个答案:

答案 0 :(得分:1)

我认为这是一个非常古老的问题。但是,我有一个相同的人,无法通过代码示例快速找到答案。这是示例(对于opencv 3.4)

_, contours, _ = cv2.findContours(mask.astype(np.uint8), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

coef_y = img_orig.shape[0] / img_resized.shape[0]
coef_x = img_orig.shape[1] / img_resized.shape[1]

for contour in contours:
    contour[:, :, 0] = contour[:, :, 0] * coef_x
    contour[:, :, 1] = contour[:, :,  1] * coef_y

    cv2.drawContours(img_orig, contour, -1, (0, 255, 0), 2)