Halcon中对应的例子为check_blister.hdev,用于检测药片包装中是否有错的药片或漏装的药片,检测效果如下:
Halcon实例的检测思路相对麻烦一点,大家有兴趣自己学习,这里介绍用OpenCV实现的思路:药片盘倾斜矫正 HSV颜色轮廓检测与删选判断
(1) 药片盘的倾斜矫正这里省略(具体方法可以通过计算药片盘一边的角度或者最小外接矩形的角度来矫正),这里倾斜很小,这步骤跳过;
(2) 先定位药片盘的位置,然后根据药片宽高和间距计算每个药片的位置,然后在对应的位置检测绿色药片,对绿色轮廓的宽和高分析,来判断是否为正常药片。
- 计算获取药片盘位置代码:
img=cv2.imread("./blister_01.png")
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thres = cv2.threshold(gray,0,255,cv2.THRESH_BINARY cv2.THRESH_OTSU)
contours,hierarchy = cv2.findContours(thres, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
x=y=w=h=0
for cnt in contours:
(x, y, w, h) = cv2.boundingRect(cnt)
if w > 300 and h > 300:
break
- 计算每个药片位置代码:
ROI = img[y:y h, x:x w]
width = 125
height = 50
col_space = 25
row_space = 20
isNG = False
index = 0
for i in range(0,5):
for j in range(0,3):
index = index 1
x1 = x 25 j*(width col_space)
y1 = y 25 i*(height row_space)
small_roi = img_copy[y1:y1 height 13,x1:x1 width 5]
- HSV颜色轮廓检测与判断代码:
hsv_img=cv2.cvtColor(small_roi,cv2.COLOR_BGR2HSV)
lower_hsv = np.array([0,20,135])
upper_hsv = np.array([70,255,255])
mask = cv2.inRange(hsv_img,lower_hsv,upper_hsv)#根据颜色范围删选
mask = cv2.medianBlur(mask, 5)#中值滤波
k1 = np.ones((9, 9),np.uint8)
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k1)#闭运算
contours2,hierarchy2 = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for cnt2 in contours2:
(x2, y2, w2, h2) = cv2.boundingRect(cnt2)
#print(x2, y2, w2, h2)
if w2 > 100 and h2 > 30:
cv2.rectangle(img,(x1,y1),(x1 width 5,y1 height 13),(0,255,0),2)
else:
cv2.rectangle(img,(x1,y1),(x1 width 5,y1 height 13),(0,0,255),2)
isNG = True
if len(contours2) < 1:
cv2.rectangle(img,(x1,y1),(x1 width 5,y1 height 13),(0,0,255),2)
isNG = True
这里我自己写了一个通过鼠标移动获取屏幕任意点的RGB和HSV只的小工具ColorPicker.exe,可以在这里下载,获取的HSV值可以直接填入OpenCV
链接:https://pan.baidu.com/s/13YMJEdu_18_AHnyUDhME0Q 提取码:utv8
最后的检测效果(结果 标号可以迅速定位复查):
如果对完整源码与工具源码感兴趣,欢迎加入知识星球获取,感谢。