赞
踩
在实现颜色识别的时候,图形经常是转换成HSV格式的,因为HSV格式相较于RGB来说,阈值的设置等有更优的效果,且如果要识别颜色,使用RGB需要调节三个参数,比较麻烦,且效果受光线等影响较大,故都采用HSV格式来进行颜色识别,但颜色识别中,往往需要调节阈值,本文就将利用opencv实现调节阈值的功能。
用过OpenMv的都知道,Openmv中的颜色识别,寻找色块功能十分的方便,且强大,里面有一个十分方便调节阈值的功能,如下。
而Opencv中轨迹栏,cv.getTrackbarPos,cv.createTrackbar即可实现此功能
其实整体实现思路是十分简单的
要做颜色识别,就是设定一两个阈值,将转换为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()
整体效果如下,我们就可以通过这个界面,找到自己需要的阈值,然后记录下来,进行下一步的识别。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。