is there a why to measure different areas of black object in image ?
the goal is to detect if tube has a bobbin or not.
here's an image example(/upfiles/1605460381736981.jpg)
i have tried to use binary image that contains a known number of blobs that vary in shape and size, it doesn't seems to get good results.
here's my code
!/usr/bin/env python3
#!/usr/bin/env python3
import numpy as
np np
import
cv2 cv2
# Read input
image image
img =
cv2.imread('img2.jpg') cv2.imread('img_test/ok_bobino2.jpg')
# Convert from BGR to HSV color
space space
hsv =
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Get the saturation plane - all black/white/gray pixels are zero,
and and colored pixels are above
zero. zero.
s
=
= hsv[:, :,
1] 1]
# Apply threshold on s - use automatic threshold algorithm (use
THRESH_OTSU). THRESH_OTSU).
ret, thresh = cv2.threshold(s, 0,
255,
cv2.THRESH_BINARY+cv2.THRESH_OTSU) 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Find contours in thresh (find only the outer contour - only
the rectangle).
the rectangle).
contours
=
cv2.findContours(thresh,
cv2.RETR_EXTERNAL,
= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2] #
[-2]
[-2] indexing takes return value
before
before last (due to OpenCV
compatibility
issues). compatibility issues).
# Mark rectangle with green
line line
cv2.drawContours(img, contours,
-1, -1, (0, 255, 0),
2) 2)
# Assume there is only one contour, get the bounding rectangle of
the contour.
the contour.
x, y, w, h
=
cv2.boundingRect(contours[0]) = cv2.boundingRect(contours[0])
# Invert polarity of the pixels inside the rectangle (on thresh
image). image).
thresh[y:y+h, x:x+w] = 255
-
- thresh[y:y+h,
x:x+w] x:x+w]
# Find contours in thresh (find the
triangles). triangles).
contours
= cv2.findContours(thresh,
cv2.RETR_EXTERNAL,
= cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2] #
[-2]
[-2] indexing takes return value
before
before last (due to OpenCV
compatibility
issues). compatibility issues).
blank =
np.zeros(img.shape,
dtype=np.uint8) np.zeros(img.shape, dtype=np.uint8)
# Iterate triangle
contours contours
for c in
contours:
contours:
area = cv2.contourArea(c)
print("area ",area)
hull = cv2.convexHull(c)
cv2.drawContours(img, [hull], -1, (0, 0, 255), 1)
# Mark triangle with blue line
#cv2.drawContours(img, [c], -1, (255, 0, 0), 2)
#pass
# Show result (for
testing). testing).
cv2.imshow('img',
img) img)
cv2.imshow('thresh', thresh)
cv2.waitKey(0) cv2.destroyAllWindows() cv2.waitKey(0)
cv2.destroyAllWindows()
any suggestions or guide lines please !?
thanks in advance.