opencv对多种颜色小球的形状及位置判断方式
更新时间:2022年11月11日 17:02 点击:276 作者:a鱼儿哥
一、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/116923
相关文章
- 这篇文章主要介绍了python-opencv-画外接矩形框的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-04
- 图片剪裁是常用的方法,那么如何通过4坐标剪裁图片,本文就详细的来介绍一下,感兴趣的小伙伴们可以参考一下...2021-06-04
- 这篇文章主要介绍了jQuery获得字体颜色16位码的方法,涉及jQuery样式操作及正则表达式使用技巧,非常简单实用,需要的朋友可以参考下...2016-02-23
- 这篇文章主要介绍了OpenCV如何去除图片中的阴影的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-29
- 这篇文章主要介绍了解决使用OpenCV中的imread()内存报错问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16
- 这篇文章主要为大家详细介绍了JavaScript实现颜色查看器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-13
- 这篇文章主要介绍了python OpenCV的相关资料,帮助大家更好的理解和学习使用python的opencv,感兴趣的朋友可以了解下...2021-03-31
- 这篇文章主要介绍了使用OpenCV去除面积较小的连通域,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-05
安卓利用按钮Button更改的字体大小、字体颜色、背景颜色代码
本文章来介绍在android开发中,我们通过button按钮来动态改变字体大小、字体颜色、背景颜色代码,有需要了解的朋友可参考参考。 实现的逻辑:通过遍历View的方式,判断Vi...2016-09-20详解pycharm的python包opencv(cv2)无代码提示问题的解决
这篇文章主要介绍了详解pycharm的python包opencv(cv2)无代码提示问题的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-29在C#中使用OpenCV(使用OpenCVSharp)的实现
这篇文章主要介绍了在C#中使用OpenCV(使用OpenCVSharp)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-15- 这篇文章主要为大家详细介绍了JavaScript实现鼠标经过表格行给出颜色标识,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-04-12
- 这篇文章主要介绍了PyCharm设置注释字体颜色以及是否倾斜的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-16
- 这篇文章主要介绍了R ggplot2 修改默认颜色的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-05-06
- 这篇文章主要为大家详细介绍了C++ opencv实现车道线识别,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-20
详解opencv中画圆circle函数和椭圆ellipse函数
这篇文章主要介绍了opencv中画圆circle函数和椭圆ellipse函数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-05-09- 这篇文章主要为大家详细介绍了Opencv LBPH人脸识别算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-04-25
- 凸包是一个计算几何中的概念,在图像处理过程中,我们常常需要寻找图像中包围某个物体的凸包,本文就使用OpenCV实现,感兴趣的可以了解一下...2021-06-08
python中的opencv和PIL(pillow)转化操作
这篇文章主要介绍了python中的opencv和PIL(pillow)转化操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-16- 这篇文章主要介绍了python基于opencv检测程序运行效率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-05-09