会色彩追踪的视觉技术(Python实现)

会色彩追踪的视觉技术

功能描述

依据用户选择的特定颜色,进行物体时时追踪,并进行矩形框标准,获取相角度、长宽等信息。

模块功能

import cv2 # 视觉处理模块
import numpy as np # 数据处理模块

设计思路

将图像有原始的RGB色彩模式转换为HSV色彩模式,通过设置色调(H),饱和度(S),明度(V)参数得到相应的物体颜色蒙版(MASK),再通过阈值调节、形态学操作等获取较为精确的轮廓(CONTOURS),依据opencv中关于轮廓的应用,获取相关轮廓信息,并进行图像标注(MARK)。

RGB
HSV
MASK
CONTOURS
MARK
SHOW

代码实现

import cv2
import numpy as np


def nothing(e):
    pass


def color_finder(frame, flag_write=True):
	# 获取初始化参数
    size = (cv2.getTrackbarPos('size', 'parameters') + 1) / 10
    H_U = cv2.getTrackbarPos('H_U', 'parameters')
    S_U = cv2.getTrackbarPos('S_U', 'parameters')
    V_U = cv2.getTrackbarPos('V_U', 'parameters')
    H_L = cv2.getTrackbarPos('H_L', 'parameters')
    S_L = cv2.getTrackbarPos('S_L', 'parameters')
    V_L = cv2.getTrackbarPos('V_L', 'parameters')
    THR = cv2.getTrackbarPos('threshold', 'parameters')
    C_k_size = cv2.getTrackbarPos('C_kernal', 'parameters')
    O_k_size = cv2.getTrackbarPos('O_kernal', 'parameters')
    O_Iter = cv2.getTrackbarPos('O_Iter', 'parameters')
    C_Iter = cv2.getTrackbarPos('C_Iter', 'parameters')
    # 图像翻转
    # frame = cv2.flip(frame, 1)
    frame = cv2.resize(frame, (0, 0), fx=size, fy=size)
    # 色彩空间转换
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 灰度图
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# HSV空间
    # 色彩追踪阈值
    lower_blue = np.array([H_L, S_L, V_L])
    upper_blue = np.array([H_U, S_U, V_U])
    # 定义卷积核大小,数据类型
    C_kernel = np.ones((C_k_size, C_k_size), np.uint8)
    O_kernel = np.ones((O_k_size, O_k_size), np.uint8)
    # C_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (C_k_size, C_k_size))
    # O_kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (O_k_size, O_k_size))
    # 色彩阈值过滤
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
    # 高斯模糊
    mask = cv2.GaussianBlur(mask, (15, 15), 0)
    # 高斯边缘阈值
    _, mask = cv2.threshold(mask, THR, 255, cv2.THRESH_TOZERO)
    # 形态学操作(开,闭)操作
    mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, O_kernel, iterations=O_Iter)
    mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, C_kernel, iterations=C_Iter)
    # mask = cv2.bitwise_not(mask)
    # 逻辑运算(或运算)
    res = cv2.bitwise_or(frame, frame, mask=mask)
    # 轮廓查找
    contours, her = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # cv2.drawContours(res, contours, -1, (0, 0, 255), 1)
    if contours != []:
        for i in range(len(contours)):
        	# 轮廓最小矩形框
            rect = cv2.minAreaRect(contours[i])
            # 最小矩形框点集合
            box = cv2.boxPoints(rect)
            box = np.int0(box)
            if flag_write == True:
            	# 绘制轮廓
                cv2.drawContours(res, [box], 0, (0, 0, 255), 2)
                # 标志矩形框角度,长宽等信息
                cv2.putText(res, text=f'ID:{i}  A:{rect[2]:.2f} ,W:{rect[1][0]:.2f},h:{rect[1][1]:.2f} ',
                            org=tuple(np.int0(rect[0])),
                            fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.5, color=(255, 255, 0), thickness=2)
            else:
                cv2.drawContours(frame, [box], 0, (0, 0, 255), 2)
                cv2.putText(frame, text=f'ID:{i}  A:{rect[2]:.2f} ,W:{rect[1][0]:.2f},h:{rect[1][1]:.2f} ',
                            org=tuple(np.int0(rect[0])),
                            fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=0.5, color=(255, 255, 0), thickness=2)
    if flag_write == True:
        # cv2.imshow('gray', gray)
        # cv2.imshow('hsv', hsv)
        cv2.imshow('mask', mask)
        cv2.imshow('res', res)
        # cv2.imshow('frame', frame)


if __name__ == '__main__':
	# 定义参数选项
    cv2.namedWindow('parameters', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('parameters', 1000, 500) 
    cv2.createTrackbar('size', 'parameters', 0, 10, nothing)#图像尺寸
    cv2.createTrackbar('H_L', 'parameters', 0, 180, nothing)#色调低值
    cv2.createTrackbar('H_U', 'parameters', 0, 180, nothing)#色调高值
    cv2.createTrackbar('S_L', 'parameters', 0, 255, nothing)#饱和度低值
    cv2.createTrackbar('S_U', 'parameters', 0, 255, nothing)#饱和度高值
    cv2.createTrackbar('V_L', 'parameters', 0, 255, nothing)#明度低值
    cv2.createTrackbar('V_U', 'parameters', 0, 255, nothing)#明度高值
    cv2.createTrackbar('threshold', 'parameters', 0, 255, nothing)#边缘阈值
    cv2.createTrackbar('C_kernal', 'parameters', 0, 200, nothing)#形态学闭操作,卷积核大小
    cv2.createTrackbar('C_Iter', 'parameters', 1, 10, nothing)#形态学闭操作,卷积次数
    cv2.createTrackbar('O_kernal', 'parameters', 0, 200, nothing)##形态学开操作,卷积核大小
    cv2.createTrackbar('O_Iter', 'parameters', 1, 10, nothing)#形态学开操作,卷积次数
    cv2.setTrackbarPos('H_U', 'parameters', 255)#设置默认参数
    cv2.setTrackbarPos('S_U', 'parameters', 255)#设置默认参数
    cv2.setTrackbarPos('V_U', 'parameters', 255)#设置默认参数
    cv2.setTrackbarPos('C_kernal', 'parameters', 1)#设置默认参数
    cv2.setTrackbarPos('O_kernal', 'parameters', 1)#设置默认参数
    cap = cv2.VideoCapture(0)
    while cap.isOpened():
        _, frame = cap.read()
        color_finder(frame)
        if cv2.waitKey(5) == 27:
            break
    cap.release()
    cv2.destroyAllWindows()

UI示例

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值