前言
笔者今天几乎完成了去年电赛图像识别的部分,如果用opencv的话确实会简单不少,我们只需要识别外矩形框以及内矩形框的8个顶点,还有中心点以及激光点的坐标发送给stm32,基本就已经完成了这个题目视觉的部分,在之前笔者进行了opencv的入门,学习一段时间后做了银行卡号识别的项目才开始真正做这道题的图像,希望我的思路可以帮助到大家。
先展示一下效果

一、识别黑色电工胶带八个顶点(外边框4个内边框4个)
我们识别这个黑色边框的步骤主要就是以下几个步骤
1.图像灰度化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
2.Canny边缘检测
先二值化图像随后进行边缘检测
lurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 30, 60)
3.轮廓检测
我们需要消除图像中由噪声引起的小面积边缘轮廓。
# 轮廓检测
contours, _ = cv2.findContours(edges, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
# 去除面积小的轮廓
filtered_contours = [cnt for cnt in contours if cv2.contourArea(cnt) > 50] # 可根据实际情况调整阈值
4.近似多边形
rect_contours = []
for cnt in filtered_contours:
epsilon = 0.02 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)
if len(approx) == 4: # 近似为四边形(可能是矩形)
rect_contours.append(approx)
detected_rect_contours = rect_contours # 保存检测到的矩形轮廓
把近似成矩形的轮廓保留下来,其他的全部舍弃。
5.绘制矩形轮廓
# 绘制矩形轮廓
for i, rect_contour in enumerate(detected_rect_contours):
if i == index_to_delete or i == index_to_delete_2: # 如果是要删除的索引,跳过
continue
area = cv2.contourArea(rect_contour)
if area > 40000:
cv2.drawContours(frame, [rect_contour], -1, (255, 0, 0), 2) # 面积大于 40000 用蓝色绘制
else:
cv2.drawContours(frame, [rect_contour], -1, (0, 255, 0), 2) # 其他用绿色绘制
这里笔者把轮廓分成了两部分,一部分是外层的一部分是内层的,通过面积进行区分。

最低0.47元/天 解锁文章
1027





