Opencv小应用(一)——实现类似OpenMv中颜色识别的调节阈值的功能

Opencv小应用(一)——实现类似OpenMv中颜色识别的调节阈值的功能


前言

在实现颜色识别的时候,图形经常是转换成HSV格式的,因为HSV格式相较于RGB来说,阈值的设置等有更优的效果,且如果要识别颜色,使用RGB需要调节三个参数,比较麻烦,且效果受光线等影响较大,故都采用HSV格式来进行颜色识别,但颜色识别中,往往需要调节阈值,本文就将利用opencv实现调节阈值的功能。

一、OpenMv中的颜色识别功能

用过OpenMv的都知道,Openmv中的颜色识别,寻找色块功能十分的方便,且强大,里面有一个十分方便调节阈值的功能,如下。

 而Opencv中轨迹栏,cv.getTrackbarPoscv.createTrackbar即可实现此功能

二、Opencv代码

其实整体实现思路是十分简单的

要做颜色识别,就是设定一两个阈值,将转换为HSV格式的图使用cv.inRange来做三通道的mask,最后将这个mask和原图做与操作即可。

而我们要实现的就是把cv.inRange里面的参数,换成轨迹栏的参数即,我把整个代码封装成一个类方便使用了。

import cv2 as cv
import numpy as np


# 需要输入图像,和对应需要寻找的颜色的阈值
class Trace_Colors:
    def __init__(self, image, lparam=None, hparam=None):
        self.image =image
        self.lparam = lparam
        self.hparam = hparam

    def nothing(self, x):
        pass
    
    # 当用find_threshold调整好阈值,输入阈值后使用
    def find(self):
        hsv_img = cv.cvtColor(self.image, cv.COLOR_BGR2HSV)   # 转换位HSV格式
        mask = cv.inRange(hsv_img, self.lparam, self.hparam)
        res = cv.bitwise_and(self.image, self.image, mask=mask)
        return res

    # 调整阈值
    def find_threshold(self):
        
        # 创建轨迹栏
        cv.namedWindow('Tracking')
        cv.createTrackbar('LH', 'Tracking', 0, 255, self.nothing)
        cv.createTrackbar('UH', 'Tracking', 255, 255, self.nothing)
        cv.createTrackbar('LS', 'Tracking', 0, 255, self.nothing)
        cv.createTrackbar('US', 'Tracking', 255, 255, self.nothing)
        cv.createTrackbar('LV', 'Tracking', 0, 255, self.nothing)
        cv.createTrackbar('UV', 'Tracking', 255, 255, self.nothing)
        while True:
            # 轨迹栏参数定义
            lh = cv.getTrackbarPos('LH', 'Tracking')
            uh = cv.getTrackbarPos('UH', 'Tracking')
            ls = cv.getTrackbarPos('LS', 'Tracking')
            us = cv.getTrackbarPos('US', 'Tracking')
            lv = cv.getTrackbarPos('LV', 'Tracking')
            uv = cv.getTrackbarPos('UV', 'Tracking')

            lower_param = np.array([lh, ls, lv])
            upper_param = np.array([uh, us, uv])
            hsv_img = cv.cvtColor(self.image, cv.COLOR_BGR2HSV)  # 转换位HSV格式

            mask = cv.inRange(hsv_img, lower_param, upper_param) # 创建mask   
            res = cv.bitwise_and(self.image, self.image, mask=mask)

            cv.imshow('res', res)
            if cv.waitKey(1) == 27 or cv.waitKey(1) == ord('q'):
                cv.destroyAllWindows()
                break

image = cv.imread('Image/colorballs.png')
trace = Trace_Colors(image)
trace.find_threshold()

 整体效果如下,我们就可以通过这个界面,找到自己需要的阈值,然后记录下来,进行下一步的识别。 

Guess you like

Origin blog.csdn.net/lzzzzzzm/article/details/119730786