Mr.Sheep
Mr.Sheep

Reputation: 1398

OpenCV 3.0 active contour (snake) algorithm

Current situation: I would like to detect rectangles (or squares) inside an image, where the contours of these rectangles are not solid consistent. Like a chessboard, where the outer contours have wholes.

Possible Solution: I am trying to implement an active contour algorithm, which should help me to detect the outside contour of the object. I know some points outside of the object, which could be used to shrink and fit the points as long as the object fits in it.

Search: I have found the cvSnakeImage Function of an older openCV version, which is not maintained and should not be used any more. I have found an active contour C++ implementation, which also uses an older openCV and the boost library. I have tried but was not able to build the code. HiDiYANG/ActiveContour

Question: Is there a current implementation of the active contour algorithm available in OpenCV? Is there a best implementation available, where I should invest time to understand the implementation?

Example Image: I have the first image with the the points on the grey border and would like to get the red rectangle (second image).

Example Image enter image description here

Upvotes: 2

Views: 7291

Answers (1)

ganesh kumar
ganesh kumar

Reputation: 21

For the image you have uplaoded, simple union over bounding boxes of contours should give you the result you desired. 'bb_union' is a function you need to write for yourself.

import cv2

img = cv2.imread('path to your image') # BGR image
im = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
im = 255 - im # your contours are black, so invert the image
_, contours, hierarchy = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
bb = None
for cnt in contours:
    rect = cv2. boundingRect(cnt)
    if (bb is None):
        bb = rect
        continue
    bb = bb_union(rect, bb)
cv2.rectangle(img, bb, (0,0,255), 2)

Upvotes: 1

Related Questions