繁体   English   中英

opencv python中的运动跟踪

[英]Motion Tracking in opencv python

所以我一直在尝试制作一个运动跟踪器来跟踪视频中移动的狗(自上而下录制)检索显示狗的裁剪视频并忽略背景的其余部分。

我首先试图与对象跟踪使用可用算法中的OpenCV 3从(BOOSTING,MIL,KCF,TLD MEDIANFLOW,GOTURN(返回一个错误,没能解决它尚未)) 这个链接和我甚至试图对运动的基本算法通过减去第一帧进行跟踪,但没有一个给出好的结果。 链接

我更喜欢带有预设矩形框的代码,一旦检测到该矩形框,它就会围绕运动区域。 像这个视频中的东西

我对 OPENCV 不是很熟悉,但我相信单运动跟踪不应该是一个问题,因为已经做了很多工作。 我应该考虑其他库/API 还是可以遵循更好的代码/教程来完成这项工作? 我的观点是稍后将其与神经网络一起使用(这就是我尝试使用 python/opencv 解决它的原因)

感谢您的任何帮助/建议

编辑:

我删除了以前的代码以使帖子更干净。

此外,根据我得到的反馈和进一步的研究,我能够修改一些代码以使其接近我想要的结果。 但是,我仍然有一个恼人的跟踪问题。 似乎第一帧会影响其余的跟踪,因为即使在狗移动之后,它也会继续检测它的第一个位置。 我试图使用标志将跟踪限制为仅 1 个操作,但检测变得一团糟。 这是显示结果的代码和图片:

jimport imutils
import time
import cv2

previousFrame = None

def searchForMovement(cnts, frame, min_area):

    text = "Undetected"

    flag = 0

    for c in cnts:
        # if the contour is too small, ignore it
        if cv2.contourArea(c) < min_area:
            continue

        #Use the flag to prevent the detection of other motions in the video
        if flag == 0:
            (x, y, w, h) = cv2.boundingRect(c)

            #print("x y w h")
            #print(x,y,w,h) 
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
            text = "Detected"
            flag = 1

    return frame, text

def trackMotion(ret,frame, gaussian_kernel, sensitivity_value, min_area):


    if ret:

        # Convert to grayscale and blur it for better frame difference
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (gaussian_kernel, gaussian_kernel), 0)



        global previousFrame

        if previousFrame is None:
            previousFrame = gray
            return frame, "Uninitialized", frame, frame



        frameDiff = cv2.absdiff(previousFrame, gray)
        thresh = cv2.threshold(frameDiff, sensitivity_value, 255, cv2.THRESH_BINARY)[1]

        thresh = cv2.dilate(thresh, None, iterations=2)
        _, cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

        frame, text = searchForMovement(cnts, frame, min_area)
        #previousFrame = gray

    return frame, text, thresh, frameDiff




if __name__ == '__main__':

    video = "Track.avi"
    video0 = "Track.mp4"
    video1= "Ntest1.avi"
    video2= "Ntest2.avi"

    camera = cv2.VideoCapture(video1)
    time.sleep(0.25)
    min_area = 5000 #int(sys.argv[1])

    cv2.namedWindow("Security Camera Feed")


    while camera.isOpened():

        gaussian_kernel = 27
        sensitivity_value = 5
        min_area = 2500

        ret, frame = camera.read()

        #Check if the next camera read is not null
        if ret:
            frame, text, thresh, frameDiff = trackMotion(ret,frame, gaussian_kernel, sensitivity_value, min_area)

        else:
            print("Video Finished")
            break


        cv2.namedWindow('Thresh',cv2.WINDOW_NORMAL)
        cv2.namedWindow('Frame Difference',cv2.WINDOW_NORMAL)
        cv2.namedWindow('Security Camera Feed',cv2.WINDOW_NORMAL)

        cv2.resizeWindow('Thresh', 800,600)
        cv2.resizeWindow('Frame Difference', 800,600)
        cv2.resizeWindow('Security Camera Feed', 800,600)
      # uncomment to see the tresh and framedifference displays                  
        cv2.imshow("Thresh", thresh)
        cv2.imshow("Frame Difference", frameDiff)



        cv2.putText(frame, text, (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
        cv2.imshow("Security Camera Feed", frame)

        key = cv2.waitKey(3) & 0xFF
        if key == 27 or key == ord('q'):
            print("Bye")
            break

    camera.release()
cv2.destroyAllWindows()

这张图片显示了第一帧如何仍然影响帧差异结果,这迫使框在没有运动的情况下覆盖区域。

结果显示帧差和视频显示

这显示了当运动被忽略时错误检测到不再存在的运动(与视频的第二帧和第一帧的帧差异)的情况。 当我允许多个跟踪时,它同时跟踪两个,这仍然是错误的,因为它检测到一个空白区域。

在此处输入图片说明

有没有人知道代码错误或缺少的地方? 我一直在尝试,但无法使其正常工作。

提前谢谢你!!

为了包括运动检测,我在 NPM Registry 和 docker hub 上创建了通用组件这会检测客户端网络摄像头(React app)上的运动,并在基于开放 CV 的 Python 中使用服务器,因此客户端只捕获网络摄像头图像,服务器使用 OPENCV 分析这些图像确定是否有动作 客户端可以指定一个回调函数,每次有动作时服务器都会调用该函数 服务器只是一个 docker 映像,您可以将其拉取并运行并指定其 URL 到客户端

NPM 注册表(客户端)

注册表链接:

https://www.npmjs.com/settings/kunalpimparkhede/packages

命令

npm install motion-detector-client

Docker 镜像(服务器)

链接

https://hub.docker.com/r/kunalpimparkhede/motiondetectorwebcam

命令

docker pull kunalpimparkhede/motiondetectorwebcam

您只需要编写以下代码即可进行运动检测

用法:

import MotionDetectingClient from './MotionDetectingClient';

<MotionDetectingClient server="http://0.0.0.0:8080" callback={handleMovement}/>

function handleMovement(pixels) 
{
console.log("Movement By Pixel="+pixels)
}

在服务器端:只需在端口 8080 上启动 docker 服务器:

docker run --name motion-detector-server-app -P 8080:5000 motion-detector-server-app

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM