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

 更新时间:2022年11月10日 10:57:05   作者:a鱼儿哥  
在这段时间参加了一个竞赛,写下了这个代码,但是总感觉有一些地方是不完善!这是一个关于使用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)

总结

这是这个代码的详细和功能介绍,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python的mysql数据库建立表与插入数据操作示例

    python的mysql数据库建立表与插入数据操作示例

    这篇文章主要介绍了python的mysql数据库建立表与插入数据操作,结合实例形式分析了python操作mysql数据库建立表与插入数据相关实现技巧,需要的朋友可以参考下
    2019-09-09
  • python高级之元类的用法总结

    python高级之元类的用法总结

    元类是Python中最高级别的编程概念之一,用于创建类的类,虽然元类在日常Python编程中并不常见,但它们提供了无限的可能性来改变类的行为,从而使元编程成为可能,这篇文章主要给大家介绍了关于python高级之元类的相关资料,需要的朋友可以参考下
    2024-08-08
  • 对numpy中的数组条件筛选功能详解

    对numpy中的数组条件筛选功能详解

    今天小编就为大家分享一篇对numpy中的数组条件筛选功能详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍

    Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍

    这篇文章主要介绍了Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍,需要的朋友可以参考下
    2014-06-06
  • django框架CSRF防护原理与用法分析

    django框架CSRF防护原理与用法分析

    这篇文章主要介绍了django框架CSRF防护原理与用法,结合实例形式分析了Django框架CSRF防护的概念、原理、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-07-07
  • Python数据可视化之画图

    Python数据可视化之画图

    今天小编就为大家分享一篇关于Python数据可视化之画图,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 浅谈Python的正则表达式

    浅谈Python的正则表达式

    这篇文章主要介绍了浅谈Python的正则表达式,正则表达式本身是独立于编程语言的知识,但是它又依附于编程语言,需要的朋友可以参考下
    2023-04-04
  • 实例详解Matlab 与 Python 的区别

    实例详解Matlab 与 Python 的区别

    Python是一种面向对象的解释型计算机程序设计语言。这篇文章主要介绍了Matlab 与 Python 的区别及优势,感兴趣的朋友跟随小编一起看看吧
    2019-04-04
  • 解决Django migrate不能发现app.models的表问题

    解决Django migrate不能发现app.models的表问题

    今天小编就为大家分享一篇解决Django migrate不能发现app.models的表问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python 处理数字,把大于上限的数字置零实现方法

    python 处理数字,把大于上限的数字置零实现方法

    今天小编就为大家分享一篇python 处理数字,把大于上限的数字置零实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01

最新评论