OPENCV形状识别(及数量统计):用代码“看懂”世界!

之前有写过一期有关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的强大功能,也为你的图像识别项目提供了一个实用的模块。你可以根据实际需求进一步优化代码,比如调整二值化阈值、优化形状判断逻辑等,以提高识别的准确性和鲁棒性。

希望这篇文章对你有所帮助!如果你对这个项目感兴趣,或者有任何问题,欢迎在评论区留言交流。让我们一起用代码“看懂”这个世界!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

即安工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值