此文章是自己在比赛时需要一个python语言来在视频流中识别圆形,发现关于此类代码很少,且较为陈旧,于是写了这篇博客,希望可以帮到有需要的朋友。

这个代码的功能为利用电脑自带的摄像头,实时拍摄且识别视频中出现的圆,有一定的缺陷,在背景不纯时可能会将非圆物体识别为圆,且在距离较远时识别率降低,笔者也会不断修改,改好之后会再次发布。

首先要运行这段代码需要有python自不必说,还需要下载opencv和numpy库,下载好后运行以下,那么就可以了。

此代码亦可实现对于指定直径的圆的识别,如果需要,可留言评论,笔者自会更改代码奉上。

import cv2
import numpy as np

# 初始化全局变量
prev_radius = None
prev_center = None

def detect_circles():
    global prev_radius, prev_center

    # 初始化电脑摄像头
    camera = cv2.VideoCapture(0)
    camera.set(3, 640)  # 设置摄像头宽度
    camera.set(4, 480)  # 设置摄像头高度

    while True:
        # 读取图像帧
        ret, frame = camera.read()
        if not ret:
            break

        # 图像预处理
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.medianBlur(gray, 5)
        edges = cv2.Canny(gray, 50, 150)

        # 圆形检测
        circles = cv2.HoughCircles(edges, cv2.HOUGH_GRADIENT, dp=1, minDist=50, param1=100, param2=30, minRadius=10,
                                   maxRadius=100)

        # 绘制检测到的圆形和圆心
        if circles is not None:
            circles = np.round(circles[0, :]).astype("int")

            # 计算移动平均半径和圆心位置
            if prev_radius is None and prev_center is None:
                prev_radius = circles[0][2]
                prev_center = (circles[0][0], circles[0][1])
            else:
                current_radius = circles[0][2]
                current_center = (circles[0][0], circles[0][1])
                alpha = 0.8 # 移动平均系数

                smoothed_radius = alpha * current_radius + (1 - alpha) * prev_radius
                smoothed_center = (
                    int(alpha * current_center[0] + (1 - alpha) * prev_center[0]),
                    int(alpha * current_center[1] + (1 - alpha) * prev_center[1])
                )

                prev_radius = smoothed_radius
                prev_center = smoothed_center

                # 绘制圆形
                cv2.circle(frame, smoothed_center, int(smoothed_radius), (0, 255, 0), 4)
                cv2.circle(frame, smoothed_center, 2, (0, 0, 255), 3)

        # 显示图像
        cv2.imshow("Circles Detection", frame)
        key = cv2.waitKey(1) & 0xFF

        # 按下 'q' 键退出循环
        if key == ord("q"):
            break

    # 释放资源
    camera.release()
    cv2.destroyAllWindows()


# 执行圆形检测
detect_circles()

Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐