我正在一个项目中寻找金属环上的缺陷零件。我成功地找到了表面上的缺陷零件,但是我无法检测到金属环内表面上的凸起。
我本想通过内外表面之间的距离来确定误差,但是我不知道如何计算两个轮廓之间的距离。
sucsess, frame = capture.read()
kernel = np.ones((1,1),np.uint8)
blur = cv2.bilateralFilter(frame,6,140,160)
threshold = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,21,16)
closing = cv2.morphologyEx(threshold,cv2.MORPH_CLOSE,kernel)
erosion = cv2.erode(closing,kernel,iterations =0)
contours, hierarchy = cv2.findContours(erosion,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
area = cv2.contourArea(cnt)
if area > 72000 and area < 80000:
cv2.drawContours(frame,cnt,-1,(0,0,0),3)
for cnt2 in contours:
area2 = cv2.contourArea(cnt2)
if area2 > 30 and area2 < 200:
cv2.drawContours(frame,cnt2,-1,(0,0,0),3)
cv2.imshow("frame",frame)
cv2.imshow("Erosion",erosion)
cv2.waitKey(0)
这是我的代码。第一幅图像是我正在寻找的对象,第二幅图像是腐蚀的输出。
我的主要问题是我无法检测到内半径内的任何突起。
欢迎任何建议和帮助。
答案 0 :(得分:1)
我本想通过内外表面之间的距离来确定误差,但是我不知道如何计算两个轮廓之间的距离。
一种方法是同时获取两个轮廓并计算质心,从而为您提供标称的中心点。然后从这一点开始,将光线投射出360度,并计算与内部和外部轮廓的相交点。 (例如,以欧几里德距离为最近的点。)然后,在内表面和外表面上都有两个相应的半径,因此可以从外表面减去内表面来获得环的厚度。使用与您需要的精度成比例的角度增量来全面地进行计算。厚度的标准偏差始终是突起的量度(数字越小越好!)。
我的主要问题是我无法检测到内半径内的任何突起。
如果只对内半径感兴趣,另一种方法是从内表面获取提取的轮廓,然后再次计算质心以找到名义参考点。取从该中心到轮廓上每个点的平均距离,即可得到理想的拟合圆。计算从该理想圆到实际轮廓上每个最近点的距离,这可以使您测量出扰动。