精华内容
下载资源
问答
  • python物体追踪opencv
    2020-11-29 06:42:08

    简单几行就可以实现对动态物体的追踪,足见opencv在图像处理上的强大。

    python代码:

    import cv2

    import numpy as np

    camera=cv2.VideoCapture(0)

    firstframe=None

    while True:

    ret,frame = camera.read()

    if not ret:

    break

    gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)

    gray=cv2.GaussianBlur(gray,(21,21),0)

    if firstframe is None:

    firstframe=gray

    continue

    frameDelta = cv2.absdiff(firstframe,gray)

    thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]

    thresh = cv2.dilate(thresh, None, iterations=2)

    # cnts= cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    x,y,w,h=cv2.boundingRect(thresh)

    frame=cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),2)

    cv2.imshow("frame", frame)

    cv2.imshow("Thresh", thresh)

    cv2.imshow("frame2", frameDelta)

    key = cv2.waitKey(1)&0xFF

    if key == ord("q"):

    break

    camera.release()

    cv2.destroyAllWindows()

    效果图

    201819101339530.gif?20180910145

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    本文标题: python+opencv实现动态物体追踪

    本文地址: http://www.cppcns.com/jiaoben/python/217145.html

    更多相关内容
  • OpenCV杂谈_08 一. 需要做的前期准备 ...一段提前录制好的用于物体检测、追踪的视频(要求:摄像头是保持静止不动的) 一个用的顺手的IDE(本人推荐Pycharm) 二. 源码如下 main.py 文件 ...

    OpenCV杂谈_08


    一. 需要做的前期准备

    1. 环境配置:
      Python版本:3.9.0
      功能包:opencv-python(4.5.2.52)、math(自带)
    2. 一段提前录制好的用于物体检测、追踪的视频(要求:摄像头是保持静止不动的)
    3. 一个用的顺手的IDE(本人推荐Pycharm)

    二. 源码如下

    1. main.py 文件
    import cv2
    from tracker import *
    
    # 进行追踪
    tracker = EuclideanDistTracker()  # 这个函数通过获取同一物体不同时刻的boundingbox的坐标从而实现对其的追踪
    
    # 导入想要进行tracking的视频,要求拍摄视频的过程中摄像头是保持静止状态的
    cap = cv2.VideoCapture("highway.mp4")
    
    # 从导入的视频中找到正在移动的物体
    object_detector = cv2.createBackgroundSubtractorMOG2(history=100, varThreshold=40)  # 对参数进行调整则会改变捕捉移动物体的精准性
    
    while True:
        ret, frame = cap.read()
        height, width, _ =frame.shape  # 得出视频画面的大小,从而去方便计算出感兴趣区域所在的位置
        print(height, width)  # 720,1280
    
        # 设置一个感兴趣区域,让处理(对物体的detection和tracking)只关注于感兴趣区域,从而减少一些计算量也让检测变得简单一些
        roi = frame[340: 720, 500: 800]
    
        # 物体检测  (根据需要可以将该部分代码换成比如行人检测、汽车检测等等)
        mask = object_detector.apply(roi)  # 通过加一个蒙版,更加清晰的显示出移动中的物体,即只留下白色的移动的物体。
        _, mask = cv2.threshold(mask, 254, 255, cv2.THRESH_BINARY)  # 去除移动物体被检测到的时候所附带的阴影(阴影为灰色)
        contours, _ = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 找到视频中物体的轮廓
        detections = []  # 用于存放boundingbox的起始点坐标、宽、高
        for cnt in contours:
            # 计算出每个轮廓内部的面积,并根据面积的大小去除那些不必要的噪声(比如树、草等等)
            area = cv2.contourArea(cnt)
            if area > 100:
                # cv2.drawContours(roi, [cnt], -1, (0, 255, 0), 2)  # 画出移动物体的轮廓
                x, y, w, h = cv2.boundingRect(cnt)
                detections.append([x, y, w, h])
    
    
        # 物体追踪
        boxer_ids = tracker.update(detections)  # 同一个物体会有相同的ID
        # print(boxer_ids)
        for box_id in boxer_ids:
            x, y, w, h, id = box_id
            cv2.putText(roi, "Obj" + str(id), (x, y - 15), cv2.FONT_ITALIC, 0.7, (255, 0, 0), 2)
            cv2.rectangle(roi, (x, y), (x + w, y + h), (0, 255, 0), 2)  # 根据移动物体的轮廓添加boundingbox
    
        print(detections)
        cv2.imshow("Frame", frame)  # 打印结果
        # cv2.imshow("Mask", mask)  # 打印出蒙版
        # cv2.imshow("ROI", roi)  # 打印出你想要的ROI在哪
        key = cv2.waitKey(30)
        if key == 27:
            break
    
    cap.release()
    cv2.destroyAllWindows()
    
    1. tracker.py文件
    import math
    
    
    class EuclideanDistTracker:
        def __init__(self):
            # Store the center positions of the objects
            self.center_points = {}
            # Keep the count of the IDs
            # each time a new object id detected, the count will increase by one
            self.id_count = 0
    
    
        def update(self, objects_rect):
            # Objects boxes and ids
            objects_bbs_ids = []
    
            # Get center point of new object
            for rect in objects_rect:
                x, y, w, h = rect
                cx = (x + x + w) // 2
                cy = (y + y + h) // 2
    
                # Find out if that object was detected already
                same_object_detected = False
                for id, pt in self.center_points.items():
                    dist = math.hypot(cx - pt[0], cy - pt[1])
    
                    if dist < 25:
                        self.center_points[id] = (cx, cy)
                        print(self.center_points)
                        objects_bbs_ids.append([x, y, w, h, id])
                        same_object_detected = True
                        break
    
                # New object is detected we assign the ID to that object
                if same_object_detected is False:
                    self.center_points[self.id_count] = (cx, cy)
                    objects_bbs_ids.append([x, y, w, h, self.id_count])
                    self.id_count += 1
    
            # Clean the dictionary by center points to remove IDS not used anymore
            new_center_points = {}
            for obj_bb_id in objects_bbs_ids:
                _, _, _, _, object_id = obj_bb_id
                center = self.center_points[object_id]
                new_center_points[object_id] = center
    
            # Update dictionary with IDs not used removed
            self.center_points = new_center_points.copy()
            return objects_bbs_ids
    

    三. 结果展示

    by demo

    四. 感悟与分享

    1. 可以看出来由于物体的检测方法是根据视频中谁在运动而进行挑选的,因此在准确度上有些许问题且无法获得物体的分类信息,而且为了减少计算量而设置了ROI区域,而并非是全画面的物体检测与追踪。未来如果想实现相对高精度的检测与追踪,则需要调用Cascade文件来进行物体检测,从而实现较高精度的且附带分类信息的识别、追踪结果。
    2. 参考课程及推荐:https://www.youtube.com/watch?v=O3b8lVF93jU(内容为英文,且需要翻墙)

    如有问题,敬请指正。欢迎转载,但请注明出处。
    展开全文
  • 主要为大家详细介绍了OpenCV3.0+Python3.6实现特定颜色的物体追踪,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • opencv-python运动物体位置追踪实验一.预备知识介绍①此实验的代码与颜色轨迹描绘实验的代码非常类似,本质还是通过颜色识别追踪运动物体的实时位置②cnt
  • opencv OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、...
  • 代码链接:python+opencv+meanshift算法实现物体跟踪 效果如下: (输入一段视频,调整代码中的 r,h,c,w 四个参数确定到水瓶的位置,你也可以输入自己的视频并尝试调整参数使得方框初始包含想要跟踪的物体) 1. ...

    代码链接:python+opencv+meanshift算法实现物体跟踪
    效果如下: (输入一段视频,调整代码中的 r,h,c,w 四个参数确定到水瓶的位置,你也可以输入自己的视频并尝试调整参数使得方框初始包含想要跟踪的物体)
    请添加图片描述
    请添加图片描述

    1. Mean shift算法实现原理

    Mean Shift算法原理其实和聚类很相似,是一个迭代的过程,即先算出当前点的偏移均值,将该点移动到该偏移均值,以此为新的起始点,继续移动,直到满足最终的条件。
    (1)设想在一个有N个样本点的特征空间,初始确定一个中心点center;
    (2)计算在设置的半径为D的圆形空间内所有的点(xi)与中心点center的向量;
    (3)计算整个圆形空间内所有向量的平均值,得到一个偏移均值
    (4)将中心点center移动到偏移均值位置;
    (5)重复移动,直到满足一定条件结束。
    Meanshift背后的直觉很简单,假设你有点的集合。(它可以是像素分布,例如直方图反投影)。你会得到一个小窗口(可能是一个圆形),并且必须将该窗口移到最大像素密度(或最大点数)的区域。如下图所示:
    在这里插入图片描述
    初始窗口以蓝色圆圈显示,名称为“C1”。其原始中心以蓝色矩形标记,名称为“C1_o”。但是,如果找到该窗口内点的质心,则会得到点“C1_r”(标记为蓝色小圆圈),它是窗口的真实质心。当然,它们不匹配。因此,移动窗口,使新窗口的圆与上一个质心匹配。再次找到新的质心。很可能不会匹配。因此,再次移动它,并继续迭代,以使窗口的中心及其质心落在同一位置(或在很小的期望误差内)。因此,最终您获得的是一个具有最大像素分布的窗口。它带有一个绿色圆圈,名为“C2”。正如您在图像中看到的,它具有最大的点数。

    2. 直方图反投影

    它用于图像分割或在图像中查找感兴趣的对象。简而言之,它创建的图像大小与输入图像相同(但只有一个通道),其中每个像素对应于该像素属于我们物体的概率。用更简单的话来说,与其余部分相比,输出图像将在可能有对象的区域具有更多的白色值。

    写的比较简单,其实很多东西看完代码就懂了,看再多原理有时候不如看代码(个人感觉)。最后,放上代码链接:
    python+opencv+meanshift算法实现物体跟踪

    展开全文
  • 本文实例为大家分享了python+opencv实现移动侦测的具体代码,供大家参考,具体内容如下 1.帧差法原理 移动侦测即是根据视频每帧或者几帧之间像素的差异,对差异值设置阈值,筛选大于阈值的像素点,做掩模图即可选出...
  • Python+OpenCV颜色识别 物体追踪

    千次阅读 2021-02-13 22:57:20
    Python+OpenCV颜色识别 物体追踪 对于颜色识别和imutils包的用法请浏览我得另一篇博客:OpenCV学习笔记 文章目录Python+OpenCV颜色识别 物体追踪代码原理代码最终效果图 代码原理 这是个比较简单的代码。代码实现的...

    Python+OpenCV颜色识别 物体追踪

    对于颜色识别和imutils包的用法请浏览我得另一篇博客:OpenCV学习笔记

    个人博客原址:OpenCV颜色识别 物体追踪

    代码原理

    这是个比较简单的代码。代码实现的就是简单的物体追踪,将物体用方框框出。

    简单来讲就是先进行颜色识别,正确识别到物体后获取物体的外接矩形再画出外接矩形即可。

    详细的解释可以看代码注释,应该是容易理解的。

    代码

    import cv2
    import numpy as np
    import imutils
    from imutils import contours
    
    # 颜色阈值
    lower = np.array([130, 62, 72])
    upper = np.array([170, 255, 148])
    # 内核
    kernel = np.ones((5, 5), np.uint8)
    # 打开摄像头
    vc = cv2.VideoCapture(0)
    if vc.isOpened():
        flag, frame = vc.read()
        # 翻转图像
        # 这一步可以忽略,博主的摄像头是反着的
        # 所以加上这句话可以让摄像头的图像正过来
        frame = imutils.rotate(frame, 180)
        cv2.imshow("frame", frame)
    else:
        flag = False
    while flag:
        flag, frame = vc.read()
        # 翻转图像
        frame = imutils.rotate(frame, 180)
        draw_frame = frame.copy()
        if frame is None:
            break
        if flag is True:
            '''下面对摄像头读取到的图像进行处理,这个步骤是比较重要的'''
            # 转换颜色空间HSV
            frame_hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
            # 颜色识别
            img = cv2.inRange(frame_hsv, lower, upper)
            # 膨胀操作
            dilation = cv2.dilate(img, kernel, iterations=1)
            # 闭操作
            closing = cv2.morphologyEx(dilation, cv2.MORPH_CLOSE, kernel)
            # 高斯滤波
            closing = cv2.GaussianBlur(closing, (5, 5), 0)
            # 边缘检测
            edges = cv2.Canny(closing, 10, 20)
            '''上面进行那么多操作就是为了得到更好的目标图形,具体效果因环境而异'''
            # 寻找轮廓
            cnts, _ = cv2.findContours(
                edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
            # 判断轮廓数量也就是判断是否寻找到轮廓,如果没有找到轮廓就不继续进行操作
            if len(cnts) > 0:
                # 存放轮廓面积的列表
                s = []
                # 存放最大轮廓的索引
                max_index = 0
                # 获得排序后的轮廓列表以及每个轮廓对应的外接矩形
                (cnts, boundingRects) = contours.sort_contours(cnts)
                # 寻找面积最大的轮廓的索引
                for cnt in cnts:
                    s.append(cv2.contourArea(cnt))
                max_index = s.index(max(s))
                # 根据面积最大轮廓的索引找到它的外接矩形的信息
                (x, y, w, h) = boundingRects[max_index]
                # 画矩形
                frame_out = cv2.rectangle(
                             draw_frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
            cv2.imshow("frame", draw_frame)
            if cv2.waitKey(10) == 27:
                break
    vc.release()
    cv2.destroyAllWindows()
    

    具体解释都在代码注释里面了,下面我要提一些注意的地方。

    1. 获得过图像之后可能需要进行一系列的形态学操作,这样可以让获得的图像更加接近目的图像。这些操作虽然不是必需的但如果正常取得的图像效果不好的时候可以加上。
    2. 函数contours.sort_contoursimutils.rotateimutils包里面的,使用起来比较方便,具体用法可以看博主的另一篇博客:OpenCV学习笔记。外接矩形也可以通过cv2.boundingRect函数获得。
    3. 代码中博主是以轮廓的最大面积为条件画的图,但这个条件应该根据自己想要的效果而定。这里除了寻找最大面积以外还可以寻找最大周长、最长的边之类的。

    最终效果图

    最终效果图

    展开全文
  • Python-opencv颜色物体跟踪程序: 1.首先我们得找到物体颜色的HSV是多少,这样我们物体识别更准确 如何找到HSV: (1)首先用同一个摄像头拍照我们所需跟踪物品的照片 import cv2 cap = cv2.VideoCapture(0) while(1...
  • 基于opencv实现追踪物体的功能
  • 在应用方面,dlib大多数情况下用于人脸检测与人脸识别,然而,dlib还可以用于物体追踪,通过调用Python API中的dlib.correlation_tracker类可以实现一个初步的跟踪结果,具体分为以下四步: (1) 使用dlib.correla
  • Python-openCV物体追踪

    千次阅读 2020-01-03 22:11:50
    使用Python+opencv物体追踪,也是采用了颜色追踪的方法 利用将一副图像从BGR转换到HSV,可以利用这一个点来提取某个特定颜色的物体。在HSV颜色空间中要比BGR空间中更容易显示特定颜色。在我们的程式中,我们提取的...
  • python+opencv追踪物体

    2020-11-29 06:42:09
    程序功能:鼠标选取一个视频中的物体,自动追踪物体,并显示物体左右移动的方向#!/usr/bin/env pythonimport cv2.cv as cvbx=0lx=0def is_rect_nonzero(r):(_,_,w,h) = rreturn (w > 0) and (h > 0)class ...
  • from collections import deque import numpy as np #import imutils import cv2 import time ...#初始化追踪点的列表 mybuffer = 64 pts = deque(maxlen=mybuffer) #打开摄像头 camera = cv2.Vide.
  • 不同与之前的背景分割的追踪方法,MeanShift从背景以及前景物体两方面进行建模。 在程序一开始设定感兴趣的区域,并初始化滑动窗口用于后续的绘制。利用计算的直方图进行反映射,越亮的区域表示感兴趣的区域(即...
  • 使用opencv_traincascade 分类器的训练模型包括两个主要阶段:于HAAR或LBP模型的训练阶段和检测阶段。本文档概述了训练自己的弱分类器的级联所需的功能。当前指南将逐步完成所有不同阶段:收集训练数据,准备训练...
  • 随着人工智能的不断发展,OpenCv这门技术也越来越重要,很多人都开始学习OpenCv,本文就介绍了如何进行OpenCv中的目标追踪。 提示:以下是本篇文章正文内容,下面案例可供参考 一、目标追踪是什么? 目标追踪:在...
  • python 识别物体跟踪

    2018-04-26 13:38:22
    python 识别物体跟踪,需要OPENCV的支持。可以利用视频流或者USB本地摄像机。
  • Python3 Opencv 帧差法 运动物体追踪

    千次阅读 2021-12-10 19:35:41
    Python3 Opencv 运动物体追踪 绘制所有的边框 微信公众号:【流星蝴蝶没有剑】回台回复:121863562
  • 使用PythonOpenCV转换颜色空间,追踪对象的轨迹

    千次阅读 多人点赞 2021-07-07 17:09:01
    使用PythonOpenCV转换颜色空间,追踪对象的轨迹

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,329
精华内容 531
关键字:

python物体追踪opencv