opencv对多种颜色小球的形状及位置判断方式
作者:a鱼儿哥 发布时间:2022-12-18 22:47:50
标签:opencv,颜色,小球,形状,位置
一、opencv是什么?
OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库.
二、使用步骤
1.引入库
代码如下:
import cv2
import numpy as np
2.设置颜色阈值
代码如下:
#颜色阈值
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 mask
6.运行效果
图片之前拍的不是很好所以我截成了小图,图片拍的是几何图所以效果不太好,如果是平面的可能会好一点,图二是打印字典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)
来源:https://blog.csdn.net/weixin_46155589/article/details/116923081


猜你喜欢
- 获取nc数据的相关信息from netCDF4 import Datasetimport numpy as npimport pandas
- 本文实例讲述了Python实现阿拉伯数字和罗马数字的互相转换功能。分享给大家供大家参考,具体如下:前面一篇介绍了《Java实现的求解经典罗马
- 一、下载MySQL登录MySQL官网下载MSI Installer:点击“Dnownload”点击“No thanks, just star
- seed() 设置生成随机数用的整数起始值。调用任何其他random模块函数之前调用这个函数。语法以下是seed()方法的语法:
- 先吐槽一下opencv 3.1.0的版本cv2.sift和surf就不能用了 看解释是说 什么 "non-free",,
- 做开发总得用到数据吧,Linux作为服务器,总得有一个数据库来存储测试用的数据,所以呢,这里附上CentOS6、7安装MySQL5.7的教程
- 近年来流行 Ajax,而 Ajax 的本质就是 XMLHttpRequest,是客户端 XMLHttpRequest 对象的使用。相对于 A
- 在MySQL服务器启动时,它检查其命令行的操作,来查看它是否应该执行登录并打开相应的日志文件(如果应该的话)。可以让服务器生成两种主要类型的
- MaxDB和MySQL是独立的数据库管理服务器。系统间的协同性是可能的,通过相应的方式,系统能够彼此交换数据。要想在MaxDB和MySQL之
- python使用qq邮箱(个人邮箱)发送邮件需开启qq邮箱的SMTP服务在设置中开启pop3/SMTP服务,返回的密码就是之后代码中登录使用
- 什么是内存管理机制python中创建的对象的时候,首先会去申请内存地址,然后对对象进行初始化,所有对象都会维护在一个叫做refchain的双
- 在讲解 seek() 函数和 tell() 函数之前,首先来了解一下什么是文件指针。我们知道,使用 open() 函数打开文件并读取文件中的
- 1. MyISAM底层存储(非聚集索引方式)与InnoDB底层存储(聚集索引方式)1.1 MyISAM底层存储(非聚集索引方式)Myisam
- 语法格式:row_number() over(partition by 分组列 order by 排序列 desc)row_num
- 上传html文件内容如下:操作步骤<html><head><meta http-equiv="con
- 1. 采用工作区设置默认解释器的方式(推荐)下载完vscode,并安装python支持之后。使用vscode打开一个空文件夹。点击左侧的运行
- python取余运算符是什么?python取余运算符是%,即表示取模,返回除法的余数。假设变量: a=10,b=20:那么b % a 输出结
- 基本用法#初始化%h为空数组 %h={};#用数组初始化%h为a=>1,b=>2 %h=('a',1
- 先来看javascript的直接写在了input上 <input name="pwuser" type="
- replaceChild(a,b)是用来替换文档中的已有元素的 参数a:要插入的节点, 参数b:要替换的节点 var oDiv = docu