# calculating the area dimension in image

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

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

import numpy as np
import cv2

# Convert from BGR to HSV color space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Get the saturation plane - all black/white/gray pixels are zero, and colored pixels are above zero.
s = hsv[:, :, 1]

# Apply threshold on s - use automatic threshold algorithm (use THRESH_OTSU).
ret, thresh = cv2.threshold(s, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Find contours in thresh (find only the outer contour - only the rectangle).
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2]  # [-2] indexing takes return value before last (due to OpenCV compatibility issues).

# Mark rectangle with green line
cv2.drawContours(img, contours, -1, (0, 255, 0), 2)

# Assume there is only one contour, get the bounding rectangle of the contour.
x, y, w, h = cv2.boundingRect(contours[0])

# Invert polarity of the pixels inside the rectangle (on thresh image).
thresh[y:y+h, x:x+w] = 255 - thresh[y:y+h, x:x+w]

# Find contours in thresh (find the triangles).
contours = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)[-2]  # [-2] indexing takes return value before last (due to OpenCV compatibility issues).

blank = np.zeros(img.shape, dtype=np.uint8)

# Iterate triangle contours
for c in 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).
cv2.imshow('img', img)
cv2.imshow('thresh', thresh)
cv2.waitKey(0)
cv2.destroyAllWindows()


edit retag close merge delete

any help ?

( 2020-11-12 09:37:40 -0500 )edit

explain what you mean by "measure". in general, explain what the problem is, and what the goal is, and what you did. post code and images.

( 2020-11-15 09:04:14 -0500 )edit

i have edited my question. i it clear enough now ?

( 2020-11-15 11:20:50 -0500 )edit

okay, that thing on the cable you describe is a ferrite bead https://en.wikipedia.org/wiki/Ferrite... do you only need to evaluate its presence/absence on a fixed close crop, or do you need to find where such a bead is on a picture of a piece of cable?

( 2020-11-15 11:44:53 -0500 )edit

sorry i didn't knew it really name. thanks for correction. actually i need to evaluate the presence/absence of the ferrite bead on the cable. what should i do Please? thanks in advance.

( 2020-11-15 12:28:46 -0500 )edit

please post a camera picture from the situation you actually have to deal with. I'm trying to determine how many unknowns you have to deal with. you posted two close crops of a bead. if you had those pictures already, evaluation would be easy. if you do NOT know where to look for the bead, that adds complexity. if the cable is just thrown on a table, that is a lot harder than handling straight cable.

( 2020-11-15 16:45:09 -0500 )edit

is it clear enough now ? i hope it helps !

( 2020-11-16 01:50:04 -0500 )edit
2

your task seems to be "automated optical inspection". a cable arranged any which way, on a cluttered work desk, in arbitrary lighting, is no way to do that. you have two options: (1) fix everything so the image analysis part becomes feasible (2) incur orders of magnitude more difficulty in the analysis part, which would require very powerful but computationally expensive methods such as Deep Learning

( 2020-11-16 07:00:48 -0500 )edit

U wanna to measurng black cable and second image..u wanna to measuring black spike?

( 2020-11-16 07:45:59 -0500 )edit

yes i do ! any suggestions ?

( 2020-11-16 09:51:04 -0500 )edit