基于Python+OpenCV的特定零件方向检测方案咨询
基于OpenCV的零件朝向检测方案
完全可以通过OpenCV实现,核心思路是利用你提到的缺口朝向这一显著特征,结合轮廓分析来判别零件的TOP/BOTTOM状态,具体步骤如下:
步骤1:图像预处理
先对输入图像做灰度化和二值化处理,突出零件轮廓和缺口特征,消除无关干扰:
import cv2 import numpy as np # 读取图像 img = cv2.imread('your_image_path.png') # 灰度化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化(用OTSU自动阈值适配不同光照) _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
步骤2:定位单个零件区域
由于零件形状固定、拍摄角度一致,通过轮廓检测提取两个零件的外接矩形,分割出单个零件的ROI(感兴趣区域):
# 寻找轮廓 contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 过滤小轮廓,保留零件主体轮廓 part_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 1000] # 遍历轮廓提取每个零件的ROI part_rois = [] for cnt in part_contours: x, y, w, h = cv2.boundingRect(cnt) roi = binary[y:y+h, x:x+w] part_rois.append((roi, x, y, w, h))
步骤3:判别缺口朝向
针对每个零件ROI,分析缺口的相对位置:
- 筛选出ROI内的小轮廓(对应零件上的缺口)
- 计算缺口的重心位置,对比重心在零件区域内的垂直分布判断朝向
for idx, (roi, x, y, w, h) in enumerate(part_rois): # 寻找ROI内的小轮廓(缺口) gap_contours, _ = cv2.findContours(roi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) gap_contours = [cnt for cnt in gap_contours if cv2.contourArea(cnt) < 500] # 过滤噪声 if gap_contours: # 取面积最大的缺口轮廓 gap_cnt = max(gap_contours, key=cv2.contourArea) # 计算缺口重心 M = cv2.moments(gap_cnt) cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) # 缺口重心在上半区则为TOP,下半区为BOTTOM if cy < h/2: print(f"零件{idx+1}: TOP 位置") cv2.putText(img, 'TOP', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,0), 2) else: print(f"零件{idx+1}: BOTTOM 位置") cv2.putText(img, 'BOTTOM', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), 2) # 显示结果 cv2.imshow('Result', img) cv2.waitKey(0) cv2.destroyAllWindows()
优化建议
- 若轮廓提取受干扰,可改用双模板匹配:制作缺口朝上和朝下的两个模板,对每个零件ROI分别匹配,取得分更高的结果作为朝向判断依据。
- 光照变化大时,替换二值化步骤为
cv2.adaptiveThreshold,提升鲁棒性。
内容的提问来源于stack exchange,提问作者Moritz Pfennig
相关产品推荐
相关产品推荐

