基于物体颜色的目标检测与跟踪(代码片段)

有品位的小丑 有品位的小丑     2023-01-11     377

关键词:

目录

一、项目内容

(1)利用摄像头,根据物体颜色,实现目标检测
(2)根据目标移动轨迹,绘制跟踪路径
(3)参考OpenCV中文官方文档(http://woshicver.com/),了解opencv在python中的应用
(4)思维导图:

二、项目分析

目标检测与跟踪项目是利用opencv2模块,通过颜色选择器提取出需要跟踪的颜色在HSV颜色空间中的具体数值范围,将提出出的数值以列表形式输入主函数参数里,再调用摄像头探测的该颜色的物体并计算出物体中心点,进行跟踪并绘制出其移动轨迹。

三、主要使用模块

① OpenCV 是其支持多语言、跨平台,功能强大。OpenCV-Python为OpenCV提供了Python接口,旨在解决计算机视觉问题的Python专用库。使得使用者在Python中能够调用C/C++,在保证易读性和运行效率的前提下,实现所需的功能。
② NumPy是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示矩阵),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。

四、选用HSV颜色空间

① HSI与 HSV非常相似,仅用亮度替代了明度。二者区别在于,一种纯色的明度等于白色的明度,而纯色的亮度等于中度灰的亮度。
② RGB和CMY颜色空间都是面向硬件的,而HSV颜色空间是面向用户的。 HSV模型对应于圆柱坐标系的一个圆锤形子集。圆锤的顶面对应于V=1,代表的颜色较亮。色调H由绕V轴的旋转角给定,红色对应于角度0°,绿色对应于角度120°,蓝色对应于角度240°。每一种颜色和它的补色相差180°
③ HSV的色相范围为[0,179],饱和度范围为[0,255],值范围为[0,255]

五、代码实现与分析

1. 颜色选择器:

该部分主要功能是用于选择跟踪物体的HSV颜色范围值并提取出来

1、导入代码需要使用的第三方库:cv2和numpy。

2、利用VideoCapture函数调用电脑摄像头,并设置视频流中帧的宽度和高度以及图像的亮度。

3、定义回调函数:
回调函数主要是为了降低函数之间调用的耦合性,即模块及模块之间信息或参数依赖的程度,从而实现解耦。

4、创建名为“HSV”的窗口,并设置其长宽。

5、设置窗口滑动条,设置数值上下界,以及滑块初始位置:

涉及两个函数,分别是:cv2.createTrackbar()和cv2.getTrackbarPos(),前者可用于创建一个可以调整数值的滑动条,后者用于更新当前滑块在轨迹的位置。
createTrackbar(参数1,参数2,参数3,参数4,参数5)
getTrackbarPos(参数1,参数2,参数3,参数4,参数5)
参数1:滑动条轨迹名
参数2:滑动条依附的窗口名
参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值
参数4:轨迹的最大值
参数5:回调函数

6、利用循环,读取视频每一帧,并将其转变为HSV颜色模型,调节滑动块数值,分别将调节的HSV最小值和最大值转换为一个一维数组。

7、创建掩膜,利用上一步得到的一维数组设置HSV的阈值。

8、将掩膜和图像逐像素相加,并将掩膜转换为BGR颜色模型。

9、按水平方向堆叠,利用hstack函数将原图,掩膜和前两者相加后的视频帧显示出来。

10、完成所有操作后,释放系统资源。

相关代码:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
cap.set(3, 200)  # 宽
cap.set(4, 200)   # 高
cap.set(10, 1000)   # 亮度

def nothing(a):
    pass

cv.namedWindow('HSV')
cv.resizeWindow('HSV', 640, 280)
cv.createTrackbar('H_min', 'HSV', 0, 179, nothing)
cv.createTrackbar('S_min', 'HSV', 0, 255, nothing)
cv.createTrackbar('V_min', 'HSV', 0, 255, nothing)
cv.createTrackbar('H_max', 'HSV', 179, 179, nothing)
cv.createTrackbar('S_max', 'HSV', 255, 255, nothing)
cv.createTrackbar('V_max', 'HSV', 255, 255, nothing)
ret = True
while ret == True:
    ret, img = cap.read() # 读取帧
    imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)

    h_min = cv.getTrackbarPos('H_min', 'HSV')
    s_min = cv.getTrackbarPos('S_min', 'HSV')
    v_min = cv.getTrackbarPos('V_min', 'HSV')
    h_max = cv.getTrackbarPos('H_max', 'HSV')
    s_max = cv.getTrackbarPos('S_max', 'HSV')
    v_max = cv.getTrackbarPos('V_max', 'HSV')
    print([h_min, s_min, v_min, h_max, s_max, v_max])
# 选取颜色范围
    lower = np.array([h_min, s_min, v_min])  # 转换为一维数组
    upper = np.array([h_max, s_max, v_max])
    mask = cv.inRange(imgHSV, lower, upper) # 设置HSV的阈值
    result = cv.bitwise_and(img, img, mask=mask) # 将掩膜和图像逐像素相加
    mask = cv.cvtColor(mask, cv.COLOR_GRAY2BGR)
    show = np.hstack([img, mask, result]) # 按水平方向(列顺序)堆叠数组构成一个新的数组堆叠的数组需要具有相同的维度
    cv.imshow('show', show)
    if cv.waitKey(1)& 0xFF == ord('q'):
        break
# 完成所有操作后,释放捕获器
cap.release()
cv.destroyAllWindows()

2. 实现检测并跟踪绘制移动轨迹:

利用颜色选择器所提取的数值,对摄像头所检测到的对应物体进行跟踪并绘制其移动轨迹

1、创建列表,用于存放颜色选择器得到的HSV数值以及设置对应的用于绘制移动轨迹的RGB颜色数值。

2、将列表里对应的HSV最小值和最大值转换为一个一维数组,并创建掩膜。

3、利用findContours函数找出图像轮廓
contours, hierarchy = cv.findContours(参数1,参数2,参数3)
参数1:单通道图像矩阵,
参数2:cv.RETR_EXTERNAL只检测最外围轮廓,包含在外围轮廓内的内围轮廓被忽略
参数3:cv.CHAIN_APPROX_NONE 保存物体边界上所有连续的轮廓点到contours向量内

4、计算轮廓面积,并判断面积大于500时,利用drawContours()函数画出图像轮廓。

5、利用boundingRect函数计算轮廓最外面的矩形边框,并计算出矩形的中心点坐标值。

6、通过返回的中心点坐标值,在视频帧的对应位置画出来

7、利用循环,更新视频流帧中每帧中心点位置,形成目标移动轨迹

相关核心代码:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
cap.set(3, 800)  # 宽
cap.set(4, 600)   # 高
cap.set(10, 1000)   # 亮度
# 通过颜色选择器提取的颜色:橙,紫,绿
"""mycolors = [[5, 107, 0, 19, 255, 255],
            [133, 56, 0, 159, 156, 255],
            [57, 76, 0, 100, 255, 255],
            [90, 48, 0, 118, 255, 255]]
mycolorvalues = [[51, 153, 255],
                 [255, 0, 255],
                 [0, 255, 0],
                 [255, 0, 0]]"""
mycolors = [[0, 24, 41, 27, 186, 198]]
mycolorvalues = [[51, 153, 255]]
mypoints = [] # [x, y, color_id]
def findcolor(img, mycolors, mycolorvalues):
    imgHSV = cv.cvtColor(img, cv.COLOR_BGR2HSV)
    count = 0
    newpoints = []
    for color in mycolors:
        lower = np.array(color[0:3])
        upper = np.array(color[3:6])
        mask = cv.inRange(imgHSV, lower, upper)
        # getContours(mask)
        x, y = getContours(mask)
        cv.circle(imgresult, (x, y), 5, mycolorvalues[count], cv.FILLED) # 图片,中心点,半径,颜色,cv.FILLED为填充
        if x != 0 and y != 0:
            newpoints.append([x, y, count])
        count += 1
        # print(getContours(mask))
        # cv.imshow(str(color), mask)
    return newpoints

def getContours(img):
    contours, hierarchy = cv.findContours(img, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_NONE) # 找出图像轮廓
    x, y, w, h = 0, 0, 0, 0
    for cnt in contours:
        area = cv.contourArea(cnt) # 计算轮廓面积
        if area > 500:
            cv.drawContours(imgresult, cnt, -1, (255, 0, 0), cv.FILLED) # 画出图像轮廓
            peri = cv.arcLength(cnt, True) # 计算轮廓周长 参数2:表示轮廓是否封闭
            approx = cv.approxPolyDP(cnt, 0.02*peri, True)
            x, y, w, h = cv.boundingRect(approx)
    return x+w//2, y+h//2

def drawoncanvas(mypoints, mycolorvalues):
    for point in mypoints:
        cv.circle(imgresult, (point[0], point[1]), 5, mycolorvalues[point[2]], cv.FILLED)
while True:
    success, img = cap.read()
    imgresult = img.copy()
    newpoints = findcolor(img, mycolors, mycolorvalues)
    if len(newpoints) != 0:
        for newp in newpoints:
            mypoints.append(newp)
    if len(mypoints) != 0:
        drawoncanvas(mypoints, mycolorvalues)

    cv.imshow("Video", imgresult)

    if cv.waitKey(1) & 0xFF == ord('q'):
        break
cap.release()
cv.destroyAllWindows()

六、测试结果

(1)首先利用颜色选择器选出手机黑屏状态下的颜色,将得到的HSV数值加入主函数mycolors参数列表中([51, 17, 29, 163, 251, 69]),并在mycolorvalues参数中添加跟踪点的bgr颜色值([0, 0, 255])

(2)运行主函数,由图可知,蓝色区域为跟踪物体,红色为物体中心点,随着物体移动,红色中心点连成一条线,即物体移动轨迹:
初始态:

手机移动的轨迹:

(3)再次利用颜色选择器选出天猫精灵的颜色,将得到的HSV数值加入主函数mycolors参数列表中([170, 104, 89, 179, 255, 255]),并在mycolorvalues参数中添加跟踪点的bgr颜色值([0, 255, 0])

(4)运行主函数,此次将上述的两样物体同时展示,下图可知此程序也能很好的实现多物体检测与跟踪。检测结果容易受摄像头中其他同颜色的事物所影响,后续还需要继续加以改进。

运动对象检测和描述

运动图像检测基于背景减法目标跟踪,背景分割器:KNN、MOG2和GMGBasicmotiondetectionandtrackingwithPythonandOpenCV使用背景减除进行目标检测用OpenCV实现多目标追踪(C++/Python)通过形态学改善图像过滤,追踪人脸,检测前景/背景区域和深度... 查看详情

目标跟踪基于kalman滤波跟踪视频运动目标matlab代码(代码片段)

1简介在智能监控系统中,通过帧差法对运动物体的识别,定位,利用卡尔曼滤波算法对目标运动进行预测,跟踪,从而控制摄像头转动,跟踪目标物,使目标物体始终出现监控画面的中心.在此采用卡尔曼滤算法,进行目标运动的预估,利用M... 查看详情

目标跟踪基于matlabkalman目标跟踪含matlab源码1119期(代码片段)

一、简介运动物体跟踪实际上就是对运动物体位置的测量和估计,和称小兔兔体重一样,我们也有两个渠道可以知道运动物体的位置,一个是我们观察到的,目标A在的某一帧图像的某个坐标点,另一个是我们... 查看详情

[ai开发]基于深度学习的视频多目标跟踪实现

据我目前了解掌握,多目标跟踪大概有两种方式:Option1基于初始化帧的跟踪,在视频第一帧中选择你的目标,之后交给跟踪算法去实现目标的跟踪。这种方式基本上只能跟踪你第一帧选中的目标,如果后续帧中出现了新的物体... 查看详情

目标检测与识别车辆信息原理与实践详解(代码片段)

...域,它的任务是从图像或视频中找到并标注出其中的目标物体。而识别车辆信息则是在目标检测的基础上,对于车辆进行进一步的分析和识别,例如车辆的类型、颜色、速度等等。目标检测与识别车辆信息的实现,通常涉及到以... 查看详情

基于区域的目标检测(代码片段)

目标检测,即在一幅图里框出某个目标位置.有2个任务.定位出目标的边界框识别出边界框内的物体的类别Sliding-windowdetectors一种暴力的目标检测方法就是使用滑动窗口,从左到右,从上到下扫描图片,然后用分类器识别窗口中的目标.... 查看详情

目标跟踪算法

...目标的区域变大,最终有可能导致目标跟踪丢失。  2)基于Kalman滤波的目标跟踪,该方法是认为物体的运动模型服从高斯模型,来对目标的运动状态进行预测,然后通过与观察模型进行对比,根据误差来更新运动目标的状态,... 查看详情

目标检测与跟踪的研究热点以及发展趋势

...先验知识,降低复杂的背景环境以及场景中与目标相似的物体的干扰;同样地,对目标的准确描述有助于提升检测与跟踪算法的准确性与鲁棒性.总之,尝试研究结合背景信息和前景目标信息的分析方法,融合场景信息与目标状态,将有... 查看详情

opencv项目实战目标检测:自动检测出现的所有动态目标(代码片段)

...与标量之间的每个元素的绝对差。2.2、轮廓检测+绘制物体轮廓+绘制矩阵轮廓2.3、连续窗口显示2.4、读取视频,显示视频,保存视频三、项目实战:实时动态目标检测实时动态目标检测一、项目思路1、获取视频... 查看详情

目标跟踪与检测技术介绍

基于有限集统计学理论的目标跟踪技术研究综述杨威,付耀文,龙建乾,... - 《电子学报》 - 2012 - 被引量: 31有限集统计学理论为杂波背景下的目标跟踪问题提供了一种工程友好的理论工具.对近年来基... 查看详情

视觉跟踪综述

...数视觉系统中不可或缺的环节。在二维视频跟踪算法中,基于目标颜色信息或基于目标运动信息等方法是常用的跟踪方法。从以往的研究中我们发现,大多数普通摄像头(彩色摄像头)下非基于背景建模的跟踪算法都极易受光照... 查看详情

基于混合高斯模型与帧差法结合的目标跟踪算法matlab仿真(代码片段)

目录一、理论基础二、核心程序三、仿真测试结果一、理论基础目标检测:混合高斯模型与帧差法结合的算法,与单独的混合高斯模型算法作对比,体现前者的优越性3、要求和结果:对比改进前后的算法,可... 查看详情

基于混合高斯模型与帧差法结合的目标跟踪算法matlab仿真(代码片段)

目录一、理论基础二、核心程序三、仿真测试结果一、理论基础目标检测:混合高斯模型与帧差法结合的算法,与单独的混合高斯模型算法作对比,体现前者的优越性3、要求和结果:对比改进前后的算法,可... 查看详情

高空无人机视角下的路口车辆与行人检测跟踪与轨迹刻画(代码片段)

...与轨迹刻画】背景需求可参考的方法1、opencv+python实现目标跟踪的方法:主要代码①main.py②items.py检测效果2、dlib库单目标检测方法3、深度学习方法代码效果推荐相关目标追踪的博文背景需求背景:项目需要在高空视... 查看详情

目标检测anchor-free分支:基于关键点的目标检测(代码片段)

目标检测Anchor-free分支:基于关键点的目标检测(最新网络全面超越YOLOv3)https://blog.csdn.net/qiu931110/article/details/89430747目标检测领域最近有个较新的方向:基于关键点进行目标物体检测。该策略的代表算法为:CornerNet和CenterNet。... 查看详情

机器视觉识别技术有些啥种类

...技术包括以下几种常见的类型:形状匹配:通过比较目标物体的形状和已知形状的样本,识别出目标物体的种类。颜色识别:通过对目标物体的颜色进行分析和比较,识别出目标物体的种类或状态。纹理分析:通过对目标物体表... 查看详情

论文解读sortdeep-sort多目标跟踪算法(代码片段)

前言基于视觉的目标跟踪在智能监控、动作与行为分析、自动驾驶等领域都有重要的应用。例如,在自动驾驶系统中,目标跟踪算法要对运动的车、行人、其他物体的运动进行跟踪,对它们的未来的位置、速度等信息... 查看详情

目标检测与跟踪(行人双向计数)

目标检测与跟踪(行人双向计数)本项目基于yolov5检测,基于deepsort追踪,采用撞线计数,再根据前后帧人的坐标位置判断行走方向,检测展示效果:(图片来源均来自我室友)欢迎评论留言。 查看详情