opencv对多种颜色小球的形状及位置判断方式

作者:a鱼儿哥 时间:2022-12-18 22:47:50 

一、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.运行效果

opencv对多种颜色小球的形状及位置判断方式

opencv对多种颜色小球的形状及位置判断方式

图片之前拍的不是很好所以我截成了小图,图片拍的是几何图所以效果不太好,如果是平面的可能会好一点,图二是打印字典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

标签:opencv,颜色,小球,形状,位置
0
投稿

猜你喜欢

  • go语言中排序sort的使用方法示例

    2023-09-01 00:07:22
  • Python如何读取、写入CSV数据

    2022-02-17 14:03:31
  • ASP.NET Core中的Configuration配置一

    2024-06-05 09:32:59
  • centos下安装mysql服务器的方法

    2024-01-21 06:51:54
  • 开发人员一定要加入收藏夹的网站 推荐

    2023-09-14 23:24:43
  • python 如何在 Matplotlib 中绘制垂直线

    2021-05-29 05:38:10
  • 常见数据库系统比较 Oracle数据库

    2010-07-28 12:44:00
  • js格式化金额可选是否带千分位以及保留精度

    2023-10-06 04:03:14
  • python实现多线程的方式及多条命令并发执行

    2023-08-09 11:37:20
  • Python 列表去重去除空字符的例子

    2021-07-11 02:49:14
  • python3第三方爬虫库BeautifulSoup4安装教程

    2023-05-10 21:11:57
  • ubuntu下磁盘空间不足导致mysql无法启动的解决方法

    2024-01-26 00:56:44
  • 最新Listary v5.00.2843注册码 亲测可用

    2022-07-04 22:20:43
  • Python:format格式化字符串详解

    2021-02-11 19:23:58
  • 戴着锁链跳舞

    2009-08-20 13:06:00
  • 解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题

    2021-05-13 00:29:01
  • pycharm下打开、执行并调试scrapy爬虫程序的方法

    2022-08-07 09:30:52
  • 聊一聊JS中的prototype

    2024-05-02 16:20:18
  • 使用python切片实现二维数组复制示例

    2021-11-02 22:24:41
  • Python 中的lambda匿名函数和三元运算符

    2023-04-21 05:22:18
  • asp之家 网络编程 m.aspxhome.com