之前有写过一期有关openmv的识别,那个时候我大一还不会稍微厉害一点的单片机,还是一个嵌入式小白,借着openmv的官方文档完成的项目需求,现在看其实还是挺热泪盈眶的
从一个普通高中生上到一个普通大学,从初中怀疑到高中绝望到大学无助,但是仍然努力,就像那个谁说的,当我经历过黑夜后还是坚信光明,哈哈,所以没什么大不了的,好好得生活,可能我不是一个聪明的人,但没准可以成为想要的人得到一个想要的生活呢,而且现在不也是在好好生活吗,如果你也是一个和我相像的人,请不要自暴自弃,累了就休息一下听首歌放松放松,加油陌生人
下面开始正题:
在图像识别的世界里,形状识别一直是个热门话题。最近,我又在捣鼓图像识别的项目,但这次不想再用老一套的方法了。为了体现自己的进步,我决定采用USB摄像头与飞腾派(假设是一种开发板)连接,通过蓝牙传输给手机,让手机端不仅能接收数据,还能作为发送端进行交互。今天,就先来聊聊这个项目里最核心的部分——OpenCV形状识别及数量统计。
我使用的usb摄像头:
一定要注意这个摄像头带有畸变,有的是-10%有的是-17%有的是0%
我的是-10%,要消除畸变,请到我的主页里面看,附上了代码的可以直接使用,只需要调一下参数
一、项目背景
在许多实际应用场景中,能够快速准确地识别图像中的形状并统计其数量是非常有价值的。比如在工业生产中,可以用来检测零件的形状和数量;在安防监控中,可以识别特定物体的出现次数。而OpenCV作为一个强大的开源计算机视觉库,提供了丰富的功能来实现这些目标。
二、环境搭建
在开始之前,确保你的开发环境已经搭建好。你需要安装OpenCV库,如果你使用的是Python,可以通过以下命令快速安装:
pip install opencv-python
同时,确保你的USB摄像头能够被系统识别,并且飞腾派(或者其他开发板)能够正常运行Python代码。
三、形状识别及数量统计代码实现
3.1 读取摄像头图像
首先,我们需要从USB摄像头中读取图像。OpenCV提供了非常方便的接口来实现这一点:
import cv2
# 初始化摄像头
cap = cv2.VideoCapture(0)
# 检查摄像头是否成功打开
if not cap.isOpened():
print("无法打开摄像头")
exit()
# 读取一帧图像
ret, frame = cap.read()
# 显示图像
cv2.imshow('frame', frame)
# 等待按键并释放摄像头资源
cv2.waitKey(0)
cap.release()
cv2.destroyAllWindows()
3.2 图像预处理
为了更好地识别形状,我们需要对图像进行预处理。通常包括灰度化、二值化和去噪等操作:
# 将图像转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用高斯模糊去噪
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
# 二值化处理
_, thresh = cv2.threshold(blurred, 60, 255, cv2.THRESH_BINARY)
3.3 形状识别与数量统计
接下来,我们使用OpenCV的轮廓检测功能来识别形状,并统计不同形状的数量:
# 寻找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 初始化形状计数器
shape_counts = {"circle": 0, "rectangle": 0, "triangle": 0}
# 遍历轮廓
for cnt in contours:
# 计算轮廓的周长
peri = cv2.arcLength(cnt, True)
# 近似轮廓
approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
# 根据轮廓的边数判断形状
if len(approx) == 3:
shape = "triangle"
elif len(approx) == 4:
shape = "rectangle"
else:
shape = "circle"
# 绘制轮廓并标记形状
cv2.drawContours(frame, [cnt], -1, (0, 255, 0), 2)
cv2.putText(frame, shape, (cnt[0][0][0], cnt[0][0][1]), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)
# 更新形状计数器
shape_counts[shape] += 1
# 显示结果
print("Shape counts:", shape_counts)
cv2.imshow('shapes', frame)
cv2.waitKey(0)
cv2.destroyAllWindows()
四、结果展示
运行上述代码后,你将看到摄像头捕获的图像中,不同的形状被成功识别并标记了出来。同时,控制台会输出每种形状的数量统计结果。通过这种方式,你可以轻松地实现对图像中形状的识别和数量统计。
五、总结
通过OpenCV实现形状识别及数量统计并不难,关键在于掌握图像预处理和轮廓检测的技巧。这个项目不仅展示了OpenCV的强大功能,也为你的图像识别项目提供了一个实用的模块。你可以根据实际需求进一步优化代码,比如调整二值化阈值、优化形状判断逻辑等,以提高识别的准确性和鲁棒性。
希望这篇文章对你有所帮助!如果你对这个项目感兴趣,或者有任何问题,欢迎在评论区留言交流。让我们一起用代码“看懂”这个世界!