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

目录
  • 一、opencv是什么?
  • 二、使用步骤
    • 1.引入库
    • 2.设置颜色阈值
    • 3.对图片进行加载和处理
    • 4.处理图片的函数
    • 5.获取颜色空间函数
    • 6.运行效果
    • 7.完整代码
  • 总结

一、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)

总结

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

(0)

相关推荐

  • python利用opencv实现颜色检测

    本文实例为大家分享了python利用opencv实现颜色检测的具体代码,供大家参考,具体内容如下 需要实现倒车辅助标记检测的功能,倒车辅助标记颜色已经确定了,所以不需要使用深度学习的方法,那样成本太高了,直接可以使用颜色检测的方法. 1.首先需要确定待检测目标的HSV值 import cv2 img = cv2.imread('l3.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) hsv = cv2.cvtColor(img, cv2.COL

  • OpenCV形状检测的示例详解

    目录 1.基于OpenCV的形状检测Python版本 1.1.定义我们的形状检测器类ShapeDetector 1.2.基于OpenCV的形状检测器 2.基于OpenCV的形状检测C++版本 2.1代码实现 2.2主要函数解析 2.3结果展示 1.基于OpenCV的形状检测Python版本 目录结构 1.1.定义我们的形状检测器类ShapeDetector 开始定义我们的 ShapeDetector 类.我们将跳过这里的 init 构造函数,因为不需要初始化任何东西. # 导入必要的包 impo

  • 通过OpenCV实现对指定颜色的物体追踪

    本文实现对特定颜色的物体追踪,我实验用的是绿萝的树叶. 新建脚本ball_tracking.py,加入代码: import argparse from collections import deque import cv2 import numpy as np 导入必要的包,然后定义一些函数 def grab_contours(cnts): # 如果 cv2.findContours 返回的轮廓元组的长度为"2",那么我们使用的是 OpenCV v2.4.v4-beta 或 v4-of

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

    目录 一.opencv是什么? 二.使用步骤 1.引入库 2.设置颜色阈值 3.对图片进行加载和处理 4.处理图片的函数 5.获取颜色空间函数 6.运行效果 7.完整代码 总结 一.opencv是什么? OpenCV是一个用于图像处理.分析.机器视觉方面的开源函数库. 二.使用步骤 1.引入库 代码如下: import cv2 import numpy as np 2.设置颜色阈值 代码如下: #颜色阈值 low_red = np.array([100, 100, 60]) up_red = n

  • 如何利用OpenCV进行特征(颜色、形状)提取

    目录 图像处理 1. 颜色 2. 形状 总结 图像处理 图像处理所做的只是从图像中提取有用的信息,从而减少数据量,但保留描述图像特征的像素. 下面从图像中提取颜色.形状和纹理特征的方法开始 1. 颜色 每次处理图像项目时,图像的色彩空间都会成为最先探索的地方,而我们最常用的就是RGB色彩空间.那么接下来使用OpenCV,我们可以将图像的颜色空间转换为HSV.LAB.灰度.YCrCb.CMYK等. a. HSV(色相饱和度值) 色调H:描述主波长,是指定颜色的通道 饱和度S:描述色调/颜色的纯度/

  • Python+OpenCV实现基于颜色的目标识别

    目录 任务 主要代码 效果展示 学习了一点opencv的知识于是找了个小项目来实践一下.这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正. 任务 让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标. 因为场地固定,背景单一,所以省下来很多操作和处理.于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体:第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体. 因为摄像头是装在四足机器人(它的

  • js+HTML5实现canvas多种颜色渐变效果的方法

    本文实例讲述了js+HTML5实现canvas多种颜色渐变效果的方法.分享给大家供大家参考.具体实现方法如下: <!DOCTYPE html> <html> <body> <canvas id="myCanvas" width="200" height="100" style="border:1px solid #c3c3c3;"> Your browser does not s

  • python opencv检测目标颜色的实例讲解

    实例如下所示: # -*- coding:utf-8 -*- __author__ = 'kingking' __version__ = '1.0' __date__ = '14/07/2017' import cv2 import numpy as np import time if __name__ == '__main__': Img = cv2.imread('example.png')#读入一幅图像 kernel_2 = np.ones((2,2),np.uint8)#2x2的卷积核

  • windows下Pycharm安装opencv的多种方法

    之前在默认环境中用pip安装过一次opencv,当时就是参考比人方法弄,稀里糊涂的,然后今天想在自己别的环境下(tensorflow)下安装终于弄懂了一些,暂时发现了几种安装的方法,特此记录下. 方法1:在Pycharm自带的库中下载(暂且这么叫吧,如下图) 这个方法我也是看别人说的,自己还没试过,描述也没介绍版本啥的,所以个人也不推荐- 方法2: 就是opencv官网介绍的安装方法,但是有些需要改,这里把步骤说明下: 1)先下载win版本的opencv并extract,然后在opencv\bu

  • opencv 实现特定颜色线条提取与定位操作

    本篇文章通过调用opencv里的函数简单的实现了对图像里特定颜色提取与定位,以此为基础,我们可以实现对特定颜色物体的前景分割与定位,或者特定颜色线条的提取与定位 主要步骤: 将RGB图像转化为HSV,H表示色调(度数表示0-180),S表示饱和度(取值0-255),V表示亮度(取值0-255),不同的颜色有着不同的取值范围,一般给出如下: 设定待提取颜色的HSV范围值,然后调用inRange函数实现对颜色空间的提取,该函数会将除目标颜色外的其余颜色为黑色背景,仅保留该颜色为前景 cv2.inRa

  • 浅谈python opencv对图像颜色通道进行加减操作溢出

    由于opencv读入图片数据类型是uint8类型,直接加减会导致数据溢出现象 (1)用Numpy操作 可以先将图片数据类型转换成int类型进行计算, data=np.array(image,dtype='int') 经过处理后(如:遍历,将大于255的置为255,小于0的置为0) 再将图片还原成uint8类型 data=np.array(image,dtype='uint8') 注意: (1)如果直接相加,那么 当像素值 > 255时,结果为对256取模的结果,例如:(240+66) % 256

  • python+opencv实现文字颜色识别与标定功能

    最近接了一个比较简单的图像处理的单子,花了一点时间随便写了一下: 数据集客户没有是自己随便创建的: 程序如下: """ Code creation time:September 11, 2021 Author:PanBo Realize function:It mainly realizes the recognition and calibration of fonts with different colors """ import nump

  • opencv python 对指针仪表读数识别的两种方式

    我尝试了两种方式 用opencv 对指针仪表进行读数识别, 1. 先模板匹配,然后边缘检测 + 霍夫直线 2. 按轮廓大小过滤,然后边缘检测 + 霍夫直线 两种方式对光线都非常敏感 其中第一种的应用范围更广,背景复杂一点也能识别到 个人比较喜欢这种方式 第二种的限制多一点,对背景.光线条件要求比较高 对于固定位置,且明暗变化不大的情况下,这种方式还是很有效的 先说第一个方案,第二个方式就不说了 第一种方式:模板匹配,然后边缘检测 + 霍夫直线 if __name__ == "__main__&q

随机推荐