OpenCV实现多色小球形状识别与位置检测
本文介绍利用OpenCV进行图像处理,通过设置红绿蓝三色HSV阈值提取目标,结合轮廓查找与多边形近似算法识别三角形、圆形等形状,并计算其中心坐标。文章包含完整代码示例及运行效果说明,适用于平面几何图形的颜色与位置检测场景。
一、OpenCV简介
OpenCV是一个专注于图像处理、分析及机器视觉领域的开源函数库。
二、具体实施步骤
1. 引入必要的库文件
代码引入部分如下:
import cv2
import numpy as np2. 配置颜色阈值范围
相关代码配置如下:
#颜色阈值
low_red = np.array([100, 100, 60])
up_red = np.array([180, 255, 255])
low_green = np.array([35, 43, 46])
up_green = np.array([77, 255, 255])
low_blue = np.array([90, 110, 110])
up_blue = np.array([124, 255, 255])
#记录形状
xz = {}字典变量xz用于后续存储识别到的形状信息。
3. 图像加载与预处理流程
主程序处理代码如下:
if __name__ == '__main__':
image = cv2.imread('img_1.png')#读取图像
image = cv2.resize(image, (500, 500))#重新裁剪图像
#image = cv2.GaussianBlur(image, (11, 11), 0)#高斯滤波
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
color_read(hsv, image)#处理图片的函数
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()4. 图像核心处理函数定义
处理函数的具体实现代码如下:
def color_read(hsv, image):
global xz
blue = get_image(hsv, low_blue, up_blue)#使用获取颜色空间的函数进行颜色获取三种颜色
red = get_image(hsv, low_red, up_red)
green = get_image(hsv, low_green, up_green)
mask = blue + red + green
#寻找图像的轮廓
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
print('cnts:', len(cnts))
##先判断形状再画轮廓
for cnt in cnts:
area = cv2.contourArea(cnt)#计算轮廓的面积
print('area:', area)
if area > 1000:
epsilon = 0.04 * cv2.arcLength(cnt, True)#计算轮廓长度
approx = cv2.approxPolyDP(cnt, epsilon, True)#计算轮廓角点
corners = len(approx)
print(corners)
#根据角点的个数判断形状
if corners == 3:
a = '三角形'
b = approx[0][0][0] # 根据三角形的角点判断位置
xz[a] = b
area, trgl = cv2.minEnclosingTriangle(cnt)#寻找三角形的轮廓
# 绘制三角形轮廓
for i in range(0, 3):
cv2.line(image, tuple(trgl[i][0]), tuple(trgl[(i + 1) % 3][0]), (0, 255, 0), 2)
elif corners == 4:
a = '矩形'
b = approx[0][0][0]
xz[a] = b
x, y, w, h = cv2.boundingRect(cnt)#寻找矩形轮廓
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)#绘制矩形轮廓
else:
#圆形这里是处理的不好的地方所以我没有用变量x1和z,因为画出来的轮廓有点大
a = '圆'
b = approx[0][0][0]
xz[a] = b
((x1, y1), z) = cv2.minEnclosingCircle(cnt)#寻找圆形轮廓
x1 = int(x1)
y1 = int(y1)
z = int(z)
cv2.circle(image, (150, y1), 60, (0, 255, 0), 2)#绘制圆形轮廓5. 颜色空间提取函数封装
获取颜色空间的函数代码如下:
#获取图像hsv的方法
def get_image(hsv, low, up):
mask = cv2.inRange(hsv, low, up)#获取色彩空间
mask = cv2.erode(mask, None, 2)#腐蚀操作
mask = cv2.dilate(mask, None, 2)#膨胀操作
return mask6. 程序运行效果展示


由于原始拍摄图像质量有限,此处截取为小图展示,因涉及几何图形识别,效果可能受拍摄角度影响,平面场景下效果更佳。图二展示了字典xz的输出结果。
7. 完整代码汇总
#获取图像hsv的方法
import cv2
import numpy as np
#颜色阈值
low_red = np.array([100, 100, 60])
up_red = np.array([180, 255, 255])
low_green = np.array([35, 43, 46])
up_green = np.array([77, 255, 255])
low_blue = np.array([90, 110, 110])
up_blue = np.array([124, 255, 255])
#记录形状
xz = {}
#获取图像hsv的方法
def get_image(hsv, low, up):
mask = cv2.inRange(hsv, low, up)#获取色彩空间
mask = cv2.erode(mask, None, 2)#腐蚀操作
mask = cv2.dilate(mask, None, 2)#膨胀操作
return mask
#获取轮廓
def color_read(hsv, image):
global xz
blue = get_image(hsv, low_blue, up_blue)#使用获取颜色空间的函数进行颜色获取三种颜色
red = get_image(hsv, low_red, up_red)
green = get_image(hsv, low_green, up_green)
mask = blue + red + green
#寻找图像的轮廓
cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
print('cnts:', len(cnts))
##先判断形状再画轮廓
for cnt in cnts:
area = cv2.contourArea(cnt)#计算轮廓的面积
print('area:', area)
if area > 1000:
epsilon = 0.04 * cv2.arcLength(cnt, True)#计算轮廓长度
approx = cv2.approxPolyDP(cnt, epsilon, True)#计算轮廓角点
corners = len(approx)
print(corners)
#根据角点的个数判断形状
if corners == 3:
a = '三角形'
b = approx[0][0][0] # 根据三角形的角点判断位置
xz[a] = b
area, trgl = cv2.minEnclosingTriangle(cnt)#寻找三角形的轮廓
# 绘制三角形轮廓
for i in range(0, 3):
cv2.line(image, tuple(trgl[i][0]), tuple(trgl[(i + 1) % 3][0]), (0, 255, 0), 2)
elif corners == 4:
a = '矩形'
b = approx[0][0][0]
xz[a] = b
x, y, w, h = cv2.boundingRect(cnt)#寻找矩形轮廓
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)#绘制矩形轮廓
else:
a = '圆'
b = approx[0][0][0]
xz[a] = b
((x1, y1), z) = cv2.minEnclosingCircle(cnt)#寻找圆形轮廓
x1 = int(x1)
y1 = int(y1)
z = int(z)
cv2.circle(image, (150, y1), 60, (0, 255, 0), 2)#绘制圆形轮廓
if __name__ == '__main__':
image = cv2.imread('img_1.png')#读取图像
image = cv2.resize(image, (500, 500))#重新裁剪图像
#image = cv2.GaussianBlur(image, (11, 11), 0)#高斯滤波
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
color_read(hsv, image)#处理图片的函数
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
#对拿到的小球字典位置数据进行处理
xz[min(xz, key=xz.get)] = 1
xz[max(xz, key=xz.get)] = 3
xz[max(xz, key=xz.get)] = 2
xz = sorted(xz.items(), key=lambda x: x[1], reverse=False)
xz = dict(xz)
print(xz)总结
以上为代码的详细功能解析,旨在提供参考,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









