温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么用opencv判断多种颜色小球的形状及位置

发布时间:2022-11-11 09:21:24 来源:亿速云 阅读:75 作者:iii 栏目:开发技术

这篇文章主要介绍了怎么用opencv判断多种颜色小球的形状及位置的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用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.完整代码

    #获取图像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)

    关于“怎么用opencv判断多种颜色小球的形状及位置”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用opencv判断多种颜色小球的形状及位置”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI