python opencv 检测移动物体并截图保存实例

最近在老家找工作,无奈老家工作真心太少,也没什么面试机会,不过之前面试一家公司,提了一个有意思的需求,检测河面没有有什么船只之类的物体,我当时第一反应是用opencv做识别,不过回家想想,河面相对的东西比较少,画面比较单一,只需要检测有没有移动的物体不就简单很多嘛,如果做街道垃圾检测的话可能就很复杂了,毕竟街道上行人,车辆,动物,很多干扰物,于是就花了一个小时写了一个小的demo,只需在程序同级目录创建一个img目录就可以了

# -*-coding:utf-8 -*-
__author__ = "ZJL"

import cv2
import time

# 保存截图
save_path = './img/'

# 定义摄像头对象,其参数0表示第一个摄像头
camera = cv2.VideoCapture(0)

# 判断视频是否打开
if (camera.isOpened()):
 print('Open')
else:
 print('摄像头未打开')

# 测试用,查看视频size
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
  int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('size:'+repr(size))

# 帧率
fps = 5
# 总是取前一帧做为背景(不用考虑环境影响)
pre_frame = None

while(1):
 start = time.time()
 # 读取视频流
 ret, frame = camera.read()
 # 转灰度图
 gray_lwpCV = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

 if not ret:
  break
 end = time.time()

 cv2.imshow("capture", frame)

 # 运动检测部分
 seconds = end - start
 if seconds < 1.0 / fps:
  time.sleep(1.0 / fps - seconds)
 gray_lwpCV = cv2.resize(gray_lwpCV, (500, 500))
 # 用高斯滤波进行模糊处理
 gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)

 # 如果没有背景图像就将当前帧当作背景图片
 if pre_frame is None:
  pre_frame = gray_lwpCV
 else:
  # absdiff把两幅图的差的绝对值输出到另一幅图上面来
  img_delta = cv2.absdiff(pre_frame, gray_lwpCV)
  #threshold阈值函数(原图像应该是灰度图,对像素值进行分类的阈值,当像素值高于(有时是小于)阈值时应该被赋予的新的像素值,阈值方法)
  thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]
  # 膨胀图像
  thresh = cv2.dilate(thresh, None, iterations=2)
  # findContours检测物体轮廓(寻找轮廓的图像,轮廓的检索模式,轮廓的近似办法)
  image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  for c in contours:
   # 设置敏感度
   # contourArea计算轮廓面积
   if cv2.contourArea(c) < 1000:
    continue
   else:
    print("出现目标物,请求核实")
    # 保存图像
    cv2.imwrite(save_path + str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) + '.jpg', frame)
    break
  pre_frame = gray_lwpCV

  if cv2.waitKey(1) & 0xFF == ord('q'):
   break

# release()释放摄像头
camera.release()
#destroyAllWindows()关闭所有图像窗口
cv2.destroyAllWindows()

想出现一个矩形框跟随移动物于是进行了改造,结果发现效果不是很理想,不能很好的框住移动目标,要么只框一部分,要么出现在移动目标附近,尴尬

# -*-coding:utf-8 -*-
__author__ = "ZJL"

import cv2
import time

# 保存截图
save_path = './img/'

# 定义摄像头对象,其参数0表示第一个摄像头
camera = cv2.VideoCapture(0)

# 判断视频是否打开
if (camera.isOpened()):
 print('Open')
else:
 print('摄像头未打开')

# 测试用,查看视频size
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
  int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('size:'+repr(size))

# 帧率
fps = 5
# 总是取前一帧做为背景(不用考虑环境影响)
pre_frame = None

while(1):
 start = time.time()
 # 读取视频流
 ret, frame = camera.read()
 # 转灰度图
 gray_lwpCV = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

 if not ret:
  break
 end = time.time()

 # 显示图像
 # cv2.imshow("capture", frame)

 # 运动检测部分
 seconds = end - start
 if seconds < 1.0 / fps:
  time.sleep(1.0 / fps - seconds)
 gray_lwpCV = cv2.resize(gray_lwpCV, (500, 500))
 # 用高斯滤波进行模糊处理
 gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)

 # 如果没有背景图像就将当前帧当作背景图片
 if pre_frame is None:
  pre_frame = gray_lwpCV
 else:
  # absdiff把两幅图的差的绝对值输出到另一幅图上面来
  img_delta = cv2.absdiff(pre_frame, gray_lwpCV)
  #threshold阈值函数(原图像应该是灰度图,对像素值进行分类的阈值,当像素值高于(有时是小于)阈值时应该被赋予的新的像素值,阈值方法)
  thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]
  # 膨胀图像
  thresh = cv2.dilate(thresh, None, iterations=2)
  # findContours检测物体轮廓(寻找轮廓的图像,轮廓的检索模式,轮廓的近似办法)
  image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  for c in contours:
   # 设置敏感度
   # contourArea计算轮廓面积
   if cv2.contourArea(c) < 1000:
    continue
   else:
    # 画出矩形框架,返回值x,y是矩阵左上点的坐标,w,h是矩阵的宽和高
    (x, y, w, h) = cv2.boundingRect(c)
    # rectangle(原图,(x,y)是矩阵的左上点坐标,(x+w,y+h)是矩阵的右下点坐标,(0,255,0)是画线对应的rgb颜色,2是所画的线的宽度)
    cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
    # putText 图片中加入文字
    cv2.putText(frame, "now time: {}".format(str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) ), (10, 20),
       cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)
    print("出现目标物,请求核实")
    # 保存图像
    cv2.imwrite(save_path + str(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))) + '.jpg', frame)
    break
  pre_frame = gray_lwpCV

  # 显示图像
  cv2.imshow("capture", frame)
  # cv2.imshow("Thresh", thresh)
  # 进行阀值化来显示图片中像素强度值有显著变化的区域的画面
  cv2.imshow("Frame Delta", img_delta)

 if cv2.waitKey(1) & 0xFF == ord('q'):
  break

# release()释放摄像头
camera.release()
#destroyAllWindows()关闭所有图像窗口
cv2.destroyAllWindows()

补充知识:基于python使用opencv监测视频指定区域是否有物体移动

缘由:车停车位,早上看到右后轮有很明显的干了的水渍,前一天下雨,车身其他位置没有如此显眼的水渍,不可能是前天雨水的水渍,仔细一看,从油箱盖一直往下,很明显,有某个X德的人故意尿在车上的,找物业拿到视频监控文件,自己看太费时间,于是。。。

思路:读取视频的关键帧,对比指定区域的数据,如果变化较大(排除环境光线变化),则有物体移动,截取当前帧保存备用。

行动:对于python处理视频不了解,找来找去,找到opencv,符合需求。

原来是个熊孩子小学生,上楼就到家了,这爹妈教也没管教说不能随地大小便么。

代码如下:

#!/usr/bin/env python
# coding: utf-8
# @author: sSWans
# @file: main.py
# @time: 2018/1/11 15:54

import os
import random
from _datetime import datetime

import cv2

path = 'F:\\111'

# 遍历目录下的视频文件
def get_files(fpath):
 files_list = []
 for i in os.listdir(fpath):
  files_list.append(os.path.join(fpath, i))
 return files_list

# 视频处理
def process(file, fname):
 # camera = cv2.VideoCapture(0) # 参数0表示第一个摄像头
 camera = cv2.VideoCapture(file)
 # 参数设置,监测矩形区域
 rectangleX = 880 # 矩形最左点x坐标
 rectangleXCols = 0 # 矩形x轴上的长度
 rectangleY = 650 # 矩形最上点y坐标
 rectangleYCols = 100 # 矩形y轴上的长度
 KeyFrame = 17 # 取关键帧的间隔数,根据视频的帧率设置,我的视频是16FPS
 counter = 1 # 取帧计数器
 pre_frame = None # 总是取视频流前一帧做为背景相对下一帧进行比较

 # 判断视频是否打开
 if not camera.isOpened():
  print('视频文件打开失败!')

 width = int(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
 height = int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
 print('视频尺寸(高,宽):', height, width)

 if rectangleXCols == 0:
  rectangleXCols = width - rectangleX
 if rectangleYCols == 0:
  rectangleYCols = height - rectangleY
 start_time = datetime.now()
 print('{} 开始处理文件: {}'.format(start_time.strftime('%H:%M:%S'), fname))
 while True:
  grabbed, frame_lwpCV = camera.read() # 读取视频流
  if grabbed:
   if counter % KeyFrame == 0:
    # if not grabbed:
    #  print('{} 完成处理文件: {} 。。。 '.format(datetime.now().strftime('%H:%M:%S'),fname))
    #  break
    gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY) # 转灰度图
    gray_lwpCV = gray_lwpCV[rectangleY:rectangleY + rectangleYCols, rectangleX:rectangleX + rectangleXCols]
    lwpCV_box = cv2.rectangle(frame_lwpCV, (rectangleX, rectangleY),
           (rectangleX + rectangleXCols, rectangleY + rectangleYCols), (0, 255, 0),
           2) # 用绿色矩形框显示监测区域
    # cv2.imshow('lwpCVWindow', frame_lwpCV) # 显示视频播放窗口,开启消耗时间大概是3倍
    gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
    if pre_frame is None:
     pre_frame = gray_lwpCV
    else:
     img_delta = cv2.absdiff(pre_frame, gray_lwpCV)
     thresh = cv2.threshold(img_delta, 25, 255, cv2.THRESH_BINARY)[1]
     thresh = cv2.dilate(thresh, None, iterations=2)
     image, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL,
                 cv2.CHAIN_APPROX_SIMPLE)
     for x in contours:
      if cv2.contourArea(x) < 1000: # 设置敏感度
       continue
      else:
       cv2.imwrite(
        'image/' + fname + '_' + datetime.now().strftime('%H%M%S') + '_' + str(
         random.randrange(0, 9999)) + '.jpg',
        frame_lwpCV)
       # print("监测到移动物体。。。 ", datetime.now().strftime('%H:%M:%S'))
       break
     pre_frame = gray_lwpCV
   counter += 1
   key = cv2.waitKey(1) & 0xFF
   if key == ord('q'):
    break
  else:
   end_time = datetime.now()
   print('{} 完成处理文件: {} 耗时:{}'.format(end_time.strftime('%H:%M:%S'), fname, end_time - start_time))
   break
 camera.release()
 # cv2.destroyAllWindows() # 与上面的imshow对应

for file in get_files(path):
 fname = file.split('\\')[-1].replace('.mp4', '')
 process(file, fname)

以上这篇python opencv 检测移动物体并截图保存实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2020-03-09

opencv python在视屏上截图功能的实现

OpenCV简介 OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法. OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口.该库也有大量的Python.Java and MATLAB/OCTAVE(版本

python使用openCV遍历文件夹里所有视频文件并保存成图片

如果你在文件夹里有很多视频,并且文件夹里还有文件夹,文件夹里的文件夹也有视频,怎么能逐个读取并且保存..所以我写了个代码用了os,walk,这个可以遍历所有文件夹里的文件和文件夹 import os import cv2 cut_frame = 250 # 多少帧截一次,自己设置就行 save_path = "C:\文献与资料\手持红外\图片" for root, dirs, files in os.walk(r"C:\文献与资料\手持红外"): # 这里就填文件夹

Python Opencv实现图像轮廓识别功能

本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

python+OpenCV实现车牌号码识别

基于python+OpenCV的车牌号码识别,供大家参考,具体内容如下 车牌识别行业已具备一定的市场规模,在电子警察.公路卡口.停车场.商业管理.汽修服务等领域已取得了部分应用.一个典型的车辆牌照识别系统一般包括以下4个部分:车辆图像获取.车牌定位.车牌字符分割和车牌字符识别 1.车牌定位的主要工作是从获取的车辆图像中找到汽车牌照所在位置,并把车牌从该区域中准确地分割出来 这里所采用的是利用车牌的颜色(黄色.蓝色.绿色) 来进行定位 #定位车牌 def color_position(img,ou

python Opencv计算图像相似度过程解析

这篇文章主要介绍了python Opencv计算图像相似度过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.相关概念 一般我们人区分谁是谁,给物品分类,都是通过各种特征去辨别的,比如黑长直.大白腿.樱桃唇.瓜子脸.王麻子脸上有麻子,隔壁老王和儿子很像,但是儿子下巴涨了一颗痣和他妈一模一样,让你确定这是你儿子. 还有其他物品.什么桌子带腿.镜子反光能在里面倒影出东西,各种各样的特征,我们通过学习.归纳,自然而然能够很快识别分类出新物品.

Python编程实现的图片识别功能示例

本文实例讲述了Python编程实现的图片识别功能.分享给大家供大家参考,具体如下: 1. 安装PIL,官方没有WIN64位,Pillow替代 pip install Pillow-2.7.0-cp27-none-win_amd64.whl 2. 安装Pytesser 下载pytesser_v0.0.1.zip,解压后复制进Python27\Lib\site-packges\pytesser路径下,无pytesser则新建 在Python27\Lib\site-packges\pytesser中新

python opencv实现图像边缘检测

本文利用python opencv进行图像的边缘检测,一般要经过如下几个步骤: 1.去噪 如cv2.GaussianBlur()等函数: 2.计算图像梯度 图像梯度表达的是各个像素点之间,像素值大小的变化幅度大小,变化较大,则可以认为是出于边缘位置,最多可简化为如下形式: 3.非极大值抑制 在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点.对每一个像素进行检查,看这个点的梯度是不是周围具有相同梯度方向的点中最大的.如下图所示: 4.滞后阈值 现在要确定那些边界才是真正的

python opencv对图像进行旋转且不裁剪图片的实现方法

最近在做深度学习时需要用到图像处理相关的操作,在度娘上找到的图片旋转方法千篇一律,旋转完成的图片都不是原始大小,很苦恼,于是google到歪果仁的网站扒拉了一个方法,亲测好用,再次嫌弃天下文章一大抄的现象,虽然我也是抄歪果仁的. 废话不多说了,直接贴代码了. def rotate_bound(image, angle): # grab the dimensions of the image and then determine the # center (h, w) = image.shape[

Python图像处理之图片文字识别功能(OCR)

OCR与Tesseract介绍 将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR).可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制. Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司).Tesseract 是目前公认最优秀.最精确的开源OCR 系统. 除 了极高的精确度,Tesseract 也具有很高的灵活性.它可

python opencv实现证件照换底功能

本文实例为大家分享了python opencv实现证件照换底功能的具体代码,供大家参考,具体内容如下 思路:先转到HSV空间,利用颜色提取背景制作掩模版mask,然后通过按位操作提取人像和制作新背景,最后叠加背景和人像得到换底后照片 代码 #-*-coding:utf-8-*- import cv2 import numpy as np def cvtBackground(path,color): """ 功能:给证件照更换背景色(常用背景色红.白.蓝) 输入参数:path:

Python+OpenCV实现图像融合的原理及代码

根据导师作业安排,在学习数字图像处理(刚萨雷斯版)第六章 彩色图像处理 中的彩色模型后,导师安排了一个比较有趣的作业: 融合原理为: 1 注意:遥感原RGB图image和灰度图Grayimage为测试用的输入图像: 2 步骤:(1)将RGB转换为HSV空间(H:色调,S:饱和度,V:明度): (2)用Gray图像诶换掉HSV中的V: (3)替换后的HSV转换回RGB空间即可得到结果. 书上只介绍了HSI彩色模型,并没有说到HSV,所以需要网上查找资料. Python代码如下: import cv

Python OpenCV处理图像之滤镜和图像运算

本文实例为大家分享了Python OpenCV处理图像之滤镜和图像运算的具体代码,供大家参考,具体内容如下 0x01. 滤镜 喜欢自拍的人肯定都知道滤镜了,下面代码尝试使用一些简单的滤镜,包括图片的平滑处理.灰度化.二值化等: import cv2.cv as cv image=cv.LoadImage('img/lena.jpg', cv.CV_LOAD_IMAGE_COLOR) #Load the image cv.ShowImage("Original", image) grey