此文章是自己在比赛时需要一个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()

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: