10

I'm trying the watershed algorithm using the following tutorial for OpenCV: https://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_watershed/py_watershed.html#watershed

I already fixed an error, now the code looks like this:

import numpy as np
import cv2
from matplotlib import pyplot as plt
from sys import argv

img = cv2.imread(argv[1])
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

# noise removal
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(thresh,cv2.MORPH_OPEN,kernel, iterations = 2)

# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations=3)

# Finding sure foreground area
dist_transform = cv2.distanceTransform(opening,cv2.cv.CV_DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.7*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)

# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers+1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0

markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]

cv2.imwrite("watershed_img.png",img)
cv2.imwrite("watershed_markers.png",markers)

When I try to run it, I receive the following error (the file name is "watersh.py"):

Traceback (most recent call last):
File "watersh.py", line 26, in <module>
ret, markers = cv2.connectedComponents(sure_fg)
AttributeError: 'module' object has no attribute 'connectedComponents'

I found that the function exists in the C++ library of OpenCV:

http://docs.opencv.org/trunk/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=connected

My question is, is there an implementation for it under another name or it doesn't exist at all in Python? If not, how can I solve the error?

edit: I'm using OpenCV 2.4.9

1 Answer 1

13

For anyone searching for this, the answer is that I had OpenCV 2.9 from Sourceforge, but I needed the 3.0 version from their repo on git for this function to work.

Sign up to request clarification or add additional context in comments.

2 Comments

does your opencv still behave as with cv2? or need to use cv3?
Is there a method that can be used with 2.9 that would effectively achieve the same goal? I don't want to spend an afternoon setting up 3.0 just to complete a tut...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.