0

我想检测夹具中的卡簧。如果卡环不存在,它应该给出消息“卡环不存在”。

在这种情况下,虽然我的卡环是蓝色的,但我使用了蓝色检测。但是我想知道如果卡环是黑色的可以做什么,因为最难识别黑色的卡环。

请找到输入图像:

这里有弹性挡圈 在此处输入图像描述

这里没有卡环

在此处输入图像描述

请找到弹环检测的代码。我也想知道如果检测到卡环以打印“ok”消息,我可以用蒙版图像做什么。

import cv2
import numpy as np
import imutils
from imutils import contours
img = cv2.imread('BALL1.jpg')
img=cv2.resize(img,(1000,640))
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

lower_range = np.array([110,50,50])
upper_range = np.array([130,255,255])

mask = cv2.inRange(hsv, lower_range, upper_range)

cv2.imshow('image', img)
cv2.imshow('mask', mask)
while(True):
   k = cv2.waitKey(5) & 0xFF
   if k == 27:
      break



cv2.destroyAllWindows()

请找到相同的输出屏幕截图。

i/p 图像

在此处输入图像描述

蒙版图像

在此处输入图像描述

我应用了二值化,但无法从中获得清晰的结果。请找到输出的代码和ss。

import cv2

# read the image file
img = cv2.imread('BALL1.jpg', 2)
img=cv2.resize(img,(1000,640))

ret, bw_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

# converting to its binary form
bw = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)

cv2.imshow("Binary", bw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

下面是检索到的输出的 ss

在此处输入图像描述

4

2 回答 2

1

应用于饱和分量的二值化会产生有趣的结果。

在此处输入图像描述

对比

在此处输入图像描述

但是卡环需要保持着色。

于 2022-02-28T09:39:52.420 回答
0

@YvesDaoust 提供的解决方案为解决问题提供了很好的见解。

@YvesDaoust 建议的饱和通道阈值,然后是形态闭合,最大连通分量提取解决了这个特定问题。

请注意,此解决方案不适用于所有照明条件、分辨率、旋转、颜色等……
但它可能适用于类似条件。

资源

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import cv2
import numpy as np

img = cv2.imread("input2.jpg")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
s = hsv[...,1]

th = 100
s[s<th]=0

op = cv2.MORPH_CLOSE
morph_elem = cv2.MORPH_ELLIPSE
morph_size = 5
element = cv2.getStructuringElement(morph_elem, (2*morph_size + 1, 2*morph_size+1), (morph_size, morph_size))
mph = cv2.morphologyEx(s, op, element)

# Reference: https://stackoverflow.com/a/47057324
def lcc (image):
    image = image.astype('uint8')
    nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(image, connectivity=4)
    sizes = stats[:, -1]

    max_label = 1
    max_size = sizes[1]
    for i in range(2, nb_components):
        if sizes[i] > max_size:
            max_label = i
            max_size = sizes[i]

    img2 = np.zeros(output.shape)
    img2[output == max_label] = 255
    img2 = img2.astype(np.uint8)
    return img2

mask = lcc(mph)

thresh = 20000000

if np.sum(mask) < thresh:
    print("circlip not present")
    res = img
else: 
    res = cv2.bitwise_and(img,img,mask = mask)

cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", res)
cv2.waitKey(0)
于 2022-02-28T21:15:46.523 回答