• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    opencv检测动态物体的实现

    之前我在超市看到当有物体经过时,监控的屏幕边缘会出现绿框。感觉蛮有意思的。来用opencv试试能不能实现类似的效果。

      我采用的检测动态物体的方法是,比较前后两帧图像,即当前画面与上一帧的画面出现了不同。我们把两帧画面进行比较。然后框选出运动的物体。我们还希望程序可以判断当前窗口到底有没有物体在运动。那么我们就需要添加一个状态。为了方便我们找到什么时间有物体移动,我打印出时间。

      当我们的程序检测到移动的物体时,会捕捉到它的轮廓,添加一个外接整矩形框,返回x,y的坐标。当不返回坐标时,则意味着没有物体运动,我们通过坐标值来是否有物体移动。并打印出当时的本地时间。

      源代码:

    import cv2
    import time
    import numpy as np
    
    def videos():
        cap = cv2.VideoCapture(1)
        #不设置是默认640*480,我们这里设置出来
        cap.set(3, 640)
        cap.set(4, 480)
    
        img_num = 0
        k = np.ones((3, 3), np.uint8)
    
        while True:
            success, img = cap.read()
            localtime = time.asctime(time.localtime(time.time()))
    
            if not img_num:
                # 这里是由于第一帧图片没有前一帧
                previous = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
            gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
            gray_diff = cv2.absdiff(gray, previous)  # 计算绝对值差
            # previous 是上一帧图片的灰度图
    
            thresh = cv2.threshold(gray_diff, 40, 255, cv2.THRESH_BINARY)[1]
            mask = cv2.medianBlur(thresh, 3)
    
            close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k)
    
            cnts = cv2.findContours(close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]
            for c in cnts:
                area = cv2.contourArea(c)
                if area > 50:
                    x, y, w, h = cv2.boundingRect(c)
                    cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
    
                    if x>0:
                        print("动",localtime)
    
            cv2.putText(img, localtime, (30, 30), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0, 0, 255), 2)
            cv2.imshow("x", close)
            cv2.imshow("Result", img)
            img_num += 1
    
            if cv2.waitKey(1)  0xFF == ord('q'):
                break
    
    videos()
    

      静:


      动:

      当有物体经过窗口时,控制台打印出了时间。这样便于我们在录制好的视频内查找。


     为了方便,我在窗口左上角加入了时间和日期。

    **注意!**必须把
    localtime = time.asctime(time.localtime(time.time()))
    放入主循环内,否则只返回调用的一瞬间的本地时间,不会程序持续。
    也不可以使用time.sleep()来控制时间变化,这会影响我们视频的帧率

      这个方法的弊端是当环境光线亮度变化过大时,返回的轮廓会产生变化,导致程序判断整个屏幕都在运动,这点仍需改进。

    到此这篇关于opencv检测动态物体的实现的文章就介绍到这了,更多相关opencv检测动态物体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • python+opencv实现动态物体识别
    • python+opencv实现动态物体追踪
    上一篇:Python爬虫中urllib3与urllib的区别是什么
    下一篇:理解python中装饰器的作用
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    opencv检测动态物体的实现 opencv,检测,动态,物体,的,