gpt4 book ai didi

python进阶:带你学习实时目标跟踪

转载 作者:我是一只小鸟 更新时间:2023-03-20 22:31:16 24 4
gpt4 key购买 nike

摘要: 本程序主要实现了python的opencv人工智能视觉模块的目标跟踪功能。

本文分享自华为云社区《 python进阶——人工智能实时目标跟踪,这一篇就够用了! 》,作者:lqj_本人 .

前言

本程序主要实现了python的opencv人工智能视觉模块的目标跟踪功能.

项目介绍

区域性锁定目标实时动态跟踪(适用 警方追捕,无人机锁定拍摄等) 。

首先先介绍几种AI视觉算法

特性:

1.BOOSTING:算法原理类似于Harr cascdes(AdaBoost),是一种很老的算法。这个算法速度慢并且不准.

2.MIL:比BOOSTING准一点 。

3.KCF:速度比BOOSTING和MIL更快,与BOOSTING和MIL一样不能很好的处理遮挡问题.

4.CSRT:比KCF更准一些,但是速度比KCF慢 。

5.MedianFlow:对于快速移动的目标和外形比那花迅速的目标效果不好 。

6.TLD:会产生朵的false-posittives 。

7.MOSSE:算法速度非常快,但是准确率比不上KCF和CSRT,在一些追求算法的速度场合很适用 。

8.GOTURN:OpenCV中自带的唯一一个基于深度学习的算法,运行短发需要提前下载好模型文件 。

分别对应的伴生的函数:

                            
                              kcf:cv2.legacy.TrackerKCF_create
csrt:cv2.legacy.TrackerCSRT_create
boosting:cv2.legacy.TrackerBoosting_create
mil:cv2.legacy.TrackerMIL_create
tld:cv2.legacy.TrackerTLD_create
medianflow:cv2.legacy.TrackerMedianFlow_create
mosse:cv2.legacy.TrackerMOSSE_create
                            
                          

详细代码讲解

导入cv模块 。

                            ret,frame =
                            
                               cap.read()
import cv2
                            
                          

使用csrt算法,引用伴生函数,并赋值给tracker 。

                            tracker = cv2.legacy.TrackerCSRT_create()
                          

读取视频流 。

                            cap = cv2.VideoCapture(
                            
                              '
                            
                            
                              11.mp4
                            
                            
                              '
                            
                            )
                          

先读取到第一帧 。

                            ret,frame = cap.read()
                          

使用selectROI(前景),画框将目标框起,并赋值给bbox 。

                            bbox = cv2.selectROI(
                            
                              '
                            
                            
                              A
                            
                            
                              '
                            
                            ,frame,fromCenter=False,showCrosshair=True)
                          

初始化tracker,将上面的两个值传入 。

                            tracker.init(frame,bbox)
                          

读取每一帧 。

                            ret,frame = cap.read()
                          

根据每一帧来更新tracker 。

                            ok,box = tracker.update(frame)
                          

若读取成功,就定位画框,并跟随 。

                            
                              if
                            
                            
                               ok :
        (x,y,w,h) 
                            
                            = [
                            
                              int
                            
                            (v) 
                            
                              for
                            
                             v 
                            
                              in
                            
                            
                               box]
        cv2.rectangle(frame,pt1
                            
                            =(
                            
                              int
                            
                            (x),
                            
                              int
                            
                            (y)),pt2=(
                            
                              int
                            
                            (x)+
                            
                              int
                            
                            (w),
                            
                              int
                            
                            (y)+
                            
                              int
                            
                            (h)),color=(
                            
                              0
                            
                            ,
                            
                              255
                            
                            ,
                            
                              0
                            
                            ),thickness=
                            
                              2
                            
                            )
                          

显示视频流 。

                            cv2.imshow(
                            
                              '
                            
                            
                              A
                            
                            
                              '
                            
                            , frame)
                          

等待50毫秒或按空格键退出 。

                            
                              if
                            
                             cv2.waitKey(
                            
                              50
                            
                            ) == ord(
                            
                              '
                            
                            
                              '
                            
                            
                              ):
    
                            
                            
                              break
                            
                          

释放视频流和释放窗口 。

                            
                              cap.release()
cv2.destroyAllWindows()
                            
                          

完整代码及注释:

                            
                              import cv2
tracker 
                            
                            =
                            
                               cv2.legacy.TrackerCSRT_create()#使用csrt算法,引用伴生函数,并赋值给tracker

cap 
                            
                            = cv2.VideoCapture(
                            
                              '
                            
                            
                              11.mp4
                            
                            
                              '
                            
                            
                              )#读取视频流

ret,frame 
                            
                            =
                            
                               cap.read()#先读取第一帧

bbox 
                            
                            = cv2.selectROI(
                            
                              '
                            
                            
                              A
                            
                            
                              '
                            
                            ,frame,fromCenter=False,showCrosshair=
                            
                              True)#使用selectROI(前景),画框将目标框起,并赋值给bbox

tracker.init(frame,bbox)#初始化tracker,将上面的两个值传入


                            
                            
                              while
                            
                            
                               True:
    ret,frame 
                            
                            =
                            
                               cap.read()#读取每一帧

    ok,box 
                            
                            =
                            
                               tracker.update(frame)#根据每一帧来跟新tracker

    # 若读取成功,我们就定位画框,并跟随
    
                            
                            
                              if
                            
                            
                               ok :
        (x,y,w,h) 
                            
                            = [
                            
                              int
                            
                            (v) 
                            
                              for
                            
                             v 
                            
                              in
                            
                            
                               box]
        cv2.rectangle(frame,pt1
                            
                            =(
                            
                              int
                            
                            (x),
                            
                              int
                            
                            (y)),pt2=(
                            
                              int
                            
                            (x)+
                            
                              int
                            
                            (w),
                            
                              int
                            
                            (y)+
                            
                              int
                            
                            (h)),color=(
                            
                              0
                            
                            ,
                            
                              255
                            
                            ,
                            
                              0
                            
                            ),thickness=
                            
                              2
                            
                            
                              )

    cv2.imshow(
                            
                            
                              '
                            
                            
                              A
                            
                            
                              '
                            
                            
                              , frame)#显示视频流

    
                            
                            
                              if
                            
                             cv2.waitKey(
                            
                              50
                            
                            ) == ord(
                            
                              '
                            
                            
                              '
                            
                            
                              ):#等待50毫秒或键盘按空格键退出
        
                            
                            
                              break
                            
                            
                              

# 释放视频流,释放窗口
cap.release()
cv2.destroyAllWindows()
                            
                          

结果演示 。

动图封面
 

区域性全部实时动态目标跟踪(适用夜视跟踪,范围性观察等)

思路构建 。

1.先将实时摄像流或录制视频流,灰度转化并高斯模糊 。

2.用二值化算法将流中的物体轮廓扩充 。

3.分别先读到第一帧和第二帧,让其对比 。

4.寻找对比后,流的轮廓位置,并开启简易模式 。

5.过滤物体的矩阵轮廓将其定位绘出 。

详细代码讲解 。

导入cv模块 。

                            import cv2
                          

将视频流转换并让其高斯模糊 。

                            gray =
                            
                               cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
blur 
                            
                            = cv2.GaussianBlur(gray,(
                            
                              5
                            
                            ,
                            
                              5
                            
                            ),
                            
                              0
                            
                            )
                          

二值化扩充 。

                            _,thresh = cv2.threshold(blur,
                            
                              20
                            
                            ,
                            
                              255
                            
                            
                              ,cv2.THRESH_BINARY)
dilated 
                            
                            = cv2.dilate(thresh,None,iterations=
                            
                              3
                            
                            
                              )

                            
                            
                              return
                            
                             dilated
                          

读取视频流或实时摄像流 。

                            cap = cv2.VideoCapture(
                            
                              '
                            
                            
                              11.mp4
                            
                            
                              '
                            
                            )
                          

读取第一帧 。

                            ret,frame1 = cap.read()
                          

读取第二帧 。

                            ret,frame2 = cap.read()
                          

判断cap是否为打开状态 。

                            
                              while
                            
                             cap.isOpened():
                          

若为打开,则第一帧与第二帧比较 。

                            diff =
                            
                               cv2.absdiff(frame1,frame2)
mask 
                            
                            = filter_img(diff)
                          

寻找比较后的物体轮廓,并开启简易模式 。

                            contours,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
                          

使用方框将视频流中的物体框出,得到矩阵的宽高 。

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

若矩阵的面积小于10(根据视频流中物体的大小来定义),直接无视 。

                            
                              if
                            
                             cv2.contourArea(contour) < 
                            
                              10
                            
                            :
                          

将过滤的物体的矩阵轮廓绘出(一定要用int整形) 。

                            cv2.rectangle(frame1,pt1=(
                            
                              int
                            
                            (x),
                            
                              int
                            
                            (y)),pt2=(
                            
                              int
                            
                            (x)+
                            
                              int
                            
                            (w),
                            
                              int
                            
                            (y)+
                            
                              int
                            
                            (h)),color=(
                            
                              0
                            
                            ,
                            
                              255
                            
                            ,
                            
                              0
                            
                            ),thickness=
                            
                              1
                            
                            )
                          

将第一帧显示 。

                            cv2.imshow(
                            
                              '
                            
                            
                              A
                            
                            
                              '
                            
                            ,frame1)
                          

将上面赋值的mask显示 。

                            cv2.imshow(
                            
                              '
                            
                            
                              B
                            
                            
                              '
                            
                            ,mask)
                          

实现前后帧对比,并定位物体运动轨迹 。

1.将第二帧赋值给第一帧 。

                            frame1 = frame2
                          

2.再将cap读到的赋值给第二帧() 。

                            ret,frame2 = cap.read()
                          

等待50毫秒或者按空格结束 。

                            
                              if
                            
                             cv2.waitKey(
                            
                              50
                            
                            ) == ord(
                            
                              '
                            
                            
                              '
                            
                            
                              ):
    
                            
                            
                              break
                            
                          

释放视频流及释放窗口 。

                            
                              cap.release()
cv2.destroyAllWindows()
                            
                          

完整代码及注释:

                            
                              import cv2
def filter_img(frame):
    #将视频流转换灰度并让其高斯模糊
    gray 
                            
                            =
                            
                               cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    blur 
                            
                            = cv2.GaussianBlur(gray,(
                            
                              5
                            
                            ,
                            
                              5
                            
                            ),
                            
                              0
                            
                            
                              )
    #二值化将其扩充
    _,thresh 
                            
                            = cv2.threshold(blur,
                            
                              20
                            
                            ,
                            
                              255
                            
                            
                              ,cv2.THRESH_BINARY)
    dilated 
                            
                            = cv2.dilate(thresh,None,iterations=
                            
                              3
                            
                            
                              )
    
                            
                            
                              return
                            
                            
                               dilated
# 读取视频流
cap 
                            
                            = cv2.VideoCapture(
                            
                              '
                            
                            
                              11.mp4
                            
                            
                              '
                            
                            
                              )

ret,frame1 
                            
                            =
                            
                               cap.read()#读到第一帧
ret,frame2 
                            
                            =
                            
                               cap.read()#读到第二帧


                            
                            
                              while
                            
                            
                               cap.isOpened():#判断cap是否打开
    diff 
                            
                            =
                            
                               cv2.absdiff(frame1,frame2)#若打开,则第一帧和第二帧作比较

    mask 
                            
                            =
                            
                               filter_img(diff)

    contours,_ 
                            
                            =
                            
                               cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)#寻找视频流的轮廓,简单模式

    #用方框将视频流中的物体用矩形框出
    
                            
                            
                              for
                            
                             contour 
                            
                              in
                            
                            
                               contours:
        (x,y,w,h) 
                            
                            =
                            
                               cv2.boundingRect(contour)#得到矩阵的宽高
        
                            
                            
                              if
                            
                             cv2.contourArea(contour) < 
                            
                              10
                            
                            
                              :#若矩阵的面积小于200,就无视(太小了)
            
                            
                            
                              continue
                            
                            
                              
        cv2.rectangle(frame1,pt1
                            
                            =(
                            
                              int
                            
                            (x),
                            
                              int
                            
                            (y)),pt2=(
                            
                              int
                            
                            (x)+
                            
                              int
                            
                            (w),
                            
                              int
                            
                            (y)+
                            
                              int
                            
                            (h)),color=(
                            
                              0
                            
                            ,
                            
                              255
                            
                            ,
                            
                              0
                            
                            ),thickness=
                            
                              1
                            
                            
                              )#将过滤的物体的矩阵轮廓绘出

    # cv2.drawContours(frame1,contours,
                            
                            -
                            
                              1
                            
                            ,(
                            
                              0
                            
                            ,
                            
                              255
                            
                            ,
                            
                              0
                            
                            ),
                            
                              2
                            
                            
                              )#将视频流中的物体轮廓画出

    cv2.imshow(
                            
                            
                              '
                            
                            
                              A
                            
                            
                              '
                            
                            
                              ,frame1)#将第一帧显示
    cv2.imshow(
                            
                            
                              '
                            
                            
                              B
                            
                            
                              '
                            
                            
                              ,mask)#将mask也显示

    frame1 
                            
                            =
                            
                               frame2#将第二帧赋值给第一帧
    ret,frame2 
                            
                            =
                            
                               cap.read()#再将cap读到的赋值给第二帧

    
                            
                            
                              if
                            
                             cv2.waitKey(
                            
                              50
                            
                            ) == ord(
                            
                              '
                            
                            
                              '
                            
                            
                              ):#等待五十毫秒或者按空格结束
        
                            
                            
                              break
                            
                            
                              
#销毁cap流
cap.release()
#释放窗口
cv2.destroyAllWindows()
                            
                          

结果显示

动图封面
 

点击关注,第一时间了解华为云新鲜技术~ 。

最后此篇关于python进阶:带你学习实时目标跟踪的文章就讲到这里了,如果你想了解更多关于python进阶:带你学习实时目标跟踪的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com