触点数字孪生,揭秘它的独特魅力
623
2022-09-25
树莓派运动追踪
对于 OpenCV 的运动检测我们有两种方法,在树莓派上,我们尝试使用简单的二帧法,即: 指定某一帧为比较帧(通常为视频的第一帧)然后将视频中的每一帧与比较帧进行比较,将发生 变化的像素识别出来,这种方法的优点是计算量小。其实,做到现在,大家也应该发现了:树莓 派的自身性能无法支持 OpenCV 以平滑的方式进行庞大数据集的处理。树莓派能够顺畅的运行这 种二帧法是我们选择它的理由。 首先我们需要先下载必要的包,终端输入:pip install imutilsch 我们先上源码,对源码进行解读便于理解。 程序的源码位于
# -*- coding: utf-8 -*-""" Created on Tue Nov 6 01:18:45 2020 @author: longfuSun"""from imutils.video import VideoStreamimport argparseimport datetimeimport imutilsimport timeimport cv2 # 使用参数解释器简化对参数的控制ap = argparse.ArgumentParser()ap.add_argument("-v", "--video", help="path to the video file")ap.add_argument("-a", "--min-area", type=int, default=500, help="minimum area size")args = vars(ap.parse_args()) # 我们将使用usb摄像头,而不是自带picam,picam的配置方法请看教程if args.get("video", None) is None: vs = VideoStream(src=0).start() time.sleep(2.0) #如果没有找到camera,查看是否本地有videoelse: vs = cv2.VideoCapture(args["video"])# 初始化firstFrame = Nonewhile True: #把第一帧设置为比较帧 frame = vs.read() frame = frame if args.get("video", None) is None else frame[1] text = "Unoccupied" if frame is None: break # 重定义frame的大小,灰度图转换 frame = imutils.resize(frame, width=500) gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (21, 21), 0) if firstFrame is None: firstFrame = gray continue # 计算第一针和当前帧的差 frameDelta = cv2.absdiff(firstFrame, gray) thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1] #对图像进行膨胀,找到差值所在位置 thresh = cv2.dilate(thresh, None, iterations=2) cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = cnts[0] if imutils.is_cv2() else cnts[1] for c in cnts: # 过滤过小的领域 if cv2.contourArea(c) < args["min_area"]: continue (x, y, w, h) = cv2.boundingRect(c) cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2) text = "Occupied" # 时间戳,显示在视频上 cv2.putText(frame, "Room Status: {}".format(text), (10, 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2) cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"), (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35, (0, 0, 255), 1) cv2.imshow("Security Feed", frame) cv2.imshow("Thresh", thresh) cv2.imshow("Frame Delta", frameDelta) key = cv2.waitKey(1) & 0xFF if key == ord("q"): break vs.stop() if args.get("video", None) is None else vs.release()cv2.destroyAllWindows()
argparse是一个Python模块:命令行选项、参数和子命令解析器。
argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。 使用流程
1、创建解析器
parser = argparse.ArgumentParser(description='Process some integers.')
使用 argparse 的第一步是创建一个 ArgumentParser 对象。ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息。
2、添加参数
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。
3、解析参数
>>> parser.parse_args(['--sum', '7', '-1', '42'])Namespace(accumulate=
ArgumentParser 通过 parse_args() 方法解析参数。 ArgumentParser 对象
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
prog - 程序的名称(默认:sys.argv[0]) usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成) description - 在参数帮助文档之前显示的文本(默认值:无) epilog - 在参数帮助文档之后显示的文本(默认值:无) parents - 一个 ArgumentParser 对象的列表,它们的参数也应包含在内 formatter_class - 用于自定义帮助文档输出格式的类 prefix_chars - 可选参数的前缀字符集合(默认值:’-’) fromfile_prefix_chars - 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合(默认值:None) argument_default - 参数的全局默认值(默认值: None) conflict_handler - 解决冲突选项的策略(通常是不必要的) add_help - 为解析器添加一个 -h/–help 选项(默认值: True) allow_abbrev - 如果缩写是无歧义的,则允许缩写长选项 (默认值:True)add_argument() 方法
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。 action - 当参数在命令行中出现时使用的动作基本类型。 nargs - 命令行参数应当消耗的数目。 const - 被一些 action 和 nargs 选择所需求的常数。 default - 当参数未在命令行中出现时使用的值。 type - 命令行参数应当被转换成的类型。 choices - 可用的参数的容器。 required - 此命令行选项是否可省略 (仅选项可用)。 help - 一个此选项作用的简单描述。 metavar - 在使用方法消息中使用的参数值示例。 dest - 被添加到 parse_args() 所返回对象上的属性名。
实验的效果如下,在出现新目标时,能清晰的锁定目标
如图所示,在短时间,当整体环境不发生变化时,能够准确的找到运动物体目标。将发生变化的 像素识别出来,这种方法非常容易实现,但是有很明显的缺点。很多时候设置比较帧进行运算的 方法无法满足商业上的需求,不够灵活。因为,随着时间的推移光照强度,气候,能见度都会发 生频繁的变化。我们需要一种有一定学习能力或者算法的解决方案来更智能的区分运动目标和背 景环境。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。