服务器之家

服务器之家 > 正文

opencv检测动态物体的实现

时间:2021-12-14 00:30     来源/作者:滑稽研究所

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

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

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

  源代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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()

  静:

opencv检测动态物体的实现

  动:

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

opencv检测动态物体的实现

opencv检测动态物体的实现

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

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

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

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

原文链接:https://blog.csdn.net/weixin_45067072/article/details/118885076

标签:

相关文章

热门资讯

yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
2021年耽改剧名单 2021要播出的59部耽改剧列表
2021年耽改剧名单 2021要播出的59部耽改剧列表 2021-03-05
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
返回顶部