opencv边缘检测实时识别圆形

opencv识别圆形

opencv有内置函数可以识别物体形状,仅仅需要几行代码就能实现圆形实时检测

用opencv抓取摄像头图像

import cv2  # 载入opencv库
cap = cv2.VideoCapture(0)  # 此处cap即摄像头变量;内置摄像头为0,若有其他摄像头则依次为1,2,3,4,…
print(cap.isOpened())  # 检查摄像头是否处于打开状态,返回布尔值
cap.set(3, 640)
cap.set(4, 480)  # 设置摄像头拍摄的图像像素
while Ture:  # 写成死循环,使一直抓取摄像头图像
	ret, img = cap.read()  # 布尔变量,图像变量 = 摄像头变量.read();布尔变量为True,代表读取成功,False代表读取失败;读取的图像存储在img变量中
	cap.release()  # 关闭摄像头
	if cv2.waitKey(25) & 0xFF == ord('q'):
		break

用HoughCircles(霍夫圆)检测圆形

OpenCV使用了霍夫梯度法这个巧妙的方法,来使用边界的梯度信息,从而提升计算的效率。

cv2中进行霍夫圆环检测的函数:
cv2.HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
其中:
image:8位,单通道图像。如果使用彩色图像,需要先转换为灰度图像。
method:定义检测图像中圆的方法。目前唯一实现的方法是cv2.HOUGH_GRADIENT。
dp:累加器分辨率与图像分辨率的反比。dp获取越大,累加器数组越小。
minDist:检测到的圆的中心,(x,y)坐标之间的最小距离。如果minDist太小,则可能导致检测到多个相邻的圆。如果minDist太大,则可能导致很多圆检测不到。
param1:用于处理边缘检测的梯度值方法。
param2:cv2.HOUGH_GRADIENT方法的累加器阈值。阈值越小,检测到的圈子越多。
minRadius:半径的最小大小(以像素为单位)。
maxRadius:半径的最大大小(以像素为单位)。

import mtplotlib.pyplot as plt
gray = cv2.cvtColor(img, icv2.COLOR_BGR2GRAY)  # 灰度图像;opencv中有多种色彩空间,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab8种,使用中经常要遇到色彩空间的转化,以便生成mask图等;
circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 150, param1=100, param2=60, minRadius=50, maxRadius=20000)
circles = circles1[0, :, :]  # 提取为二维
circles = np.uint16(np.around(circles))  # 四舍五入,取整
for i in circles[:]:
    cv2.circle(img, (i[0], i[1]), i[2], (255, 0, 0), 5)  # 画圆
    cv2.circle(img, (i[0], i[1]), 2, (255, 0, 0), 10)  # 画圆心
    print('圆心坐标:\t', i[0], i[1])
plt.imshow(img)
plt.show()

完整代码

import cv2  # 载入opencv库
import mtplotlib.pyplot as plt
cap = cv2.VideoCapture(0)  # 此处cap即摄像头变量;内置摄像头为0,若有其他摄像头则依次为1,2,3,4,…
print(cap.isOpened())  # 检查摄像头是否处于打开状态,返回布尔值
cap.set(3, 640)
cap.set(4, 480)  # 设置摄像头拍摄的图像像素
while Ture:  # 写成死循环,使一直抓取摄像头图像
	ret, img = cap.read()  # 布尔变量,图像变量 = 摄像头变量.read();布尔变量为True,代表读取成功,False代表读取失败;读取的图像存储在img变量中
	gray = cv2.cvtColor(img, icv2.COLOR_BGR2GRAY)  # 灰度图像;opencv中有多种色彩空间,包括 RGB、HSI、HSL、HSV、HSB、YCrCb、CIE XYZ、CIE Lab8种,使用中经常要遇到色彩空间的转化,以便生成mask图等;
	circles1 = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 150, param1=100, param2=60, minRadius=50, maxRadius=20000)
	circles = circles1[0, :, :]  # 提取为二维
	circles = np.uint16(np.around(circles))  # 四舍五入,取整
	for i in circles[:]:
    	cv2.circle(img, (i[0], i[1]), i[2], (255, 0, 0), 5)  # 画圆
    	cv2.circle(img, (i[0], i[1]), 2, (255, 0, 0), 10)  # 画圆心
    	print('圆心坐标:\t', i[0], i[1])
	plt.imshow(img)
	plt.show()
	# cap.release()  # 关闭摄像头
	if cv2.waitKey(25) & 0xFF == ord('q'):
		break

猜你喜欢

转载自blog.csdn.net/weixin_43843657/article/details/88053356