树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别
目录
一、完成摄像头的调用
二、利用python调用opencv库函数对图像进行处理
2.1 图像处理大体流程
2.2 opencv调用函数的参数以及含义
2.2.1 ret, img = cap.read() 读取帧图像
2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像
2.2.3 gray_diff_img = cv2.absdiff(gray_img, previous_img) 帧差法
2.2.4 cv2.threshold (src, thresh, maxval, type) 二值化处理
2.2.5 cv2.medianBlur(src, ksize) 中值滤波
2.2.6 np.ones(shape, dtype=None, order='C')
2.2.7 cv2.morphologyEx(src, op, kernel)
2.2.8 cv2.findContours(image,mode,method)
2.2.9 cv2.contourArea() 求轮廓面积
2.2.10 cv2.boundingRect() 返回轮廓框框坐标
2.2.11 cv2.rectangle() 坐标连线,框出轮廓
2.2.12 cv2.imshow() 窗口显示图像
三、处理代码
一、完成摄像头的调用
如果不会具体操作的请看
树莓派调用CSI摄像头进行实时监控
二、利用python调用opencv库函数对图像进行处理
2.1 图像处理大体流程
(1) 打开摄像头设备
(2) 图像进行帧处理(一帧一帧处理),while循环中,先读取摄像头一帧图像
(3) 灰度图像处理,判断上一帧图像是否为空。若为空,赋予一帧图像并进行图像灰度处理;若不为空,则也进行图像灰度处理。
(4) 帧差法,利用上一帧图像和这一帧图像作差值处理。
(5) 二值化图像处理,对进行帧差法后的图像作二值化处理。
(6) 中值滤波处理
(7) 闭运算,腐蚀,膨胀处理。
(8) 对运动图像进行轮廓检测,返回坐标集
(9) 利用坐标框选目标。
(10) 显示图像,将处理完的图像变为上一帧图像。
2.2 opencv调用函数的参数以及含义
2.2.1 ret, img = cap.read() 读取帧图像
cap 是你摄像头设备0捕获的摄像头图像数据( 例: cap = cv2.VideoCapture(0) );
read()是opencv库函数读取摄像头一帧图像,cap.read() 就是获取摄像头设备0读取的一帧图像;
img 就是摄像头设备0读取的一帧图像,图像格式为BGR;
ret 就是bool类型,读取成功返回True,失败则是Flase.
2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像
img:传入转换的图片。
cv2.COLOR_BGR2GRAY:将格式为BGR的图片转换为灰度图片。
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray就是转换成功的灰度图片
2.2.3 gray_diff_img = cv2.absdiff(gray_img, previous_img) 帧差法
cv2.absdiff(a,b) : a,b均为一帧图像。
比较二帧图像不同之处(例如:运动检测时,只有运动的物体会运动,而背景则不动,cv2.absdiff(a,b)得到的是去除背景的运动物体的图片)。gray_diff_img则是二帧处理后的一帧图像。
2.2.4 cv2.threshold (src, thresh, maxval, type) 二值化处理
src:传入的一帧图像。
thresh:阈值(数值范围0-255,根据光照强度选择)
maxval:填充色(数值范围0-255,二值化图像一般都选255)
type:如下图
thresh_img = cv2.threshold(gray_diff_img, 40, 255, cv2.THRESH_BINARY)
得到的二值化图像thresh_img
2.2.5 cv2.medianBlur(src, ksize) 中值滤波
src 是需要处理的图像。
ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中其邻域图像的高度和宽度。需要注意,核大小必须是比1大的奇数,比如3、5、7等。
例:mask_img = cv2.medianBlur(thresh_img, 3)
2.2.6 np.ones(shape, dtype=None, order='C')
shape:是一个int或一个int元组,用于定义数组的大小。
dtype:是一个可选参数,默认值为float。 它用于指定数组的数据类型,例如int。
order:该顺序定义是在内存中以行优先(C风格)还是列优先(Fortran风格)顺序存储多维数组。我们不用写,默认即可。
例:k = np.ones((3, 3), np.uint8)
大小为1的(1,1)的小矩阵为一个单位,构成3行3列大矩阵,类型为uint8。(具体干嘛用的,我也不是很清除,猜测大概就是表示图像大小)
2.2.7 cv2.morphologyEx(src, op, kernel)
src:是需要处理的图像。
op:
cv2.MORPH_OPEN:开运算,对图像先进行腐蚀再膨胀,等同于dilate(erode(src,kernal)),开运算对图像的边界进行平滑、去掉凸起等
cv2.MORPH_CLOSE:闭运算,对图像先进行膨胀在腐蚀,等同于erode(dilate(src,kernal)),闭运算用于填充图像内部的小空洞、填充图像的凹陷等
kernel:输入一个数组作为核,表示图像大小。(我也不是很懂)
例 close = cv2.morphologyEx(mask_img, cv2.MORPH_CLOSE, k)
2.2.8 cv2.findContours(image,mode,method)
image :代表输入的图片。注意输入的图片必须为二值图片。若输入的图片为彩色图片,必须先进行灰度化和二值化。
mode : 表示轮廓的检索模式,有4种:
cv2.RETR_EXTERNAL 表示只检测外轮廓。
cv2.RETR_LIST 检测的轮廓不建立等级关系。
cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE 建立一个等级树结构的轮廓。
method: 为轮廓的近似办法,有4种:
cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))<=1。
cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息。
cv2.CHAIN_APPROX_TC89_L1 和 cv2.CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法。
函数返回值contours:返回几个轮廓(返回几个运动物体框框),每个轮廓的单位是点集(即轮廓大小)
例:cnts = cv2.findContours(close_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
2.2.9 cv2.contourArea() 求轮廓面积
2.2.10 cv2.boundingRect() 返回轮廓框框坐标
x, y, w, h = cv2.boundingRect(c) ,x,y,w,h为轮廓的坐标长度,c为contours的子集
2.2.11 cv2.rectangle() 坐标连线,框出轮廓
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
图片,长方形框左上角坐标, 长方形框右下角坐标, 字体颜色,字体粗细
2.2.12 cv2.imshow() 窗口显示图像
cv2.imshow("name", img) "name" 为窗口名字,img为窗口显示图像。
三、处理代码
import cv2
import time
import numpy as npdef videos():cap = cv2.VideoCapture(0)cap.set(3, 640)cap.set(4, 480)cap.set(5,40)img_num = 0k = np.ones((3, 3), np.uint8) while True:ret, img = cap.read()if not img_num:previous = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)gray_diff = cv2.absdiff(gray, 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 > 200:x, y, w, h = cv2.boundingRect(c)cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)cv2.imshow("thresh_img", close)cv2.imshow("Result", img)img_num += 1if cv2.waitKey(1) & 0xFF == ord('q'):breakvideos()
左上角因为阳光问题所以出现一点白。
相关文章:

树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别
目录 一、完成摄像头的调用 二、利用python调用opencv库函数对图像进行处理 2.1 图像处理大体流程 2.2 opencv调用函数的参数以及含义 2.2.1 ret, img cap.read() 读取帧图像 2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像 2.2.3 gray_diff_img cv2.absdiff(g…...
Parameters(in)、Parameters(out) and Parameters(inout)
0前言 参数类型(Parameters)指的是函数参数在调用时所具有的性质,从而对函数的调用方式产生影响。在 C 语言中,存在三种不同类型的函数参数:Parameters(in)、Parameters(out) 和 Parameters(inout) 1定义 Parameter…...

jstat命令查看jvm内存情况及GC内存变化
命令格式 jstat [Options] pid [interval] [count] 参数说明: Options,选项,一般使用 -gc、-gccapacity查看gc情况 pid,VM的进程号,即当前运行的java进程号 interval,间隔时间(按该时间频率自动刷新当前内存…...

java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
画笔Graphics Java中提供了Graphics类,他是一个抽象的画笔,可以在Canvas组件(画布)上绘制丰富多彩的几何图和位图。 Graphics常用的画图方法如下: drawLine(): 绘制直线drawString(): 绘制字符串drawRect(): 绘制矩形drawRoundRect(): 绘制…...

HCIA-RS实验-STP和RSTP(1)
这篇文章开始前,先简单说下这2个协议; 本文介绍了STP和RSTP的基本原理、优缺点以及应用场景。STP和RSTP都是生成树协议,主要作用于避免网络中的环路,保证数据包能够正常转发。在实际应用中,需要根据实际情况选择合适的…...

Leetcodes刷题之删除链表的倒数N个结点和删除链表的中间的结点
吾心信其可行,则移山填海之难,终有成功之日。 --孙中山 目录 🍉一.删除链表的倒数N个结点 🌻1.双指针 🍁2.求链表的长度 🌸二.删除链表的中间的结点 🍉一.删除链…...

Java-数据结构-并查集<二>
一.并查集的简单介绍 二. 并查集的主要构成和实现方式 三.HashMap模板和数组模板 由于在下文的模板基本一致,不再每次都罗列,大体的模板如下,若有错误可以在leetcode找到对应的题目解答,已经附上连接。 HashMap class UnionFi…...
JSP网上教学资源共享系统(源代码+论文)
通过网上教学资源共享系统的建设,完成了对于操作系统课程的远程化授课。可以使学生不受时间空间的限制,通过网络对于这门课程进行学习。建立起了基于B/C的网络化教学系统。本网站采用当前最流行的JSP网络编程技术,可以实现数据的高效、动态、…...

QT C++入门学习(1) QT Creator安装和使用
Qt官方下载 Qt 官网有一个专门的资源下载网站,所有的开发环境和相关工具都可以从这里下载,具体地址是:http://download.qt.io/ 进入链接后,是一个文件目录,依次进入这个路径:archive/qt/5.12/5.12.9/qt-o…...

UE动画状态机的事件触发顺序测试
正常A状态过渡到B状态的事件顺序: 整个流程为: 调用B状态的On Become Relevant事件调用B状态的On Update事件调用A状态的Left State Event事件调用B状态的Entered State Event事件调用B状态的Start Transition Event事件调用B状态的End Transition Even…...
数学建模的搜索技巧
你真的会使用“度娘”吗?是不是在查找所需要的东西的时候,搜出来的信息价值并不是很大,跟着北海老师学习,如何更高效的使用百度去查询自己想要的,有用的资料! 搜索技巧 完全匹配搜索 : 查询词的外边加上双…...

学成在线笔记+踩坑(10)——课程搜索、课程发布时同步索引库。
导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题_java黑马笔记 目录 1 【检索模块】需求分析 1.1 全文检索介绍 1.2 业务流程 1.2.1、课程发布时索引库里新增一条记录 1.2.2、课程搜索 2 准…...

某应用虚拟化系统远程代码执行
漏洞简介 微步在线漏洞团队通过“X漏洞奖励计划”获取到瑞友天翼应用虚拟化系统远程代码执行漏洞情报(0day),攻击者可以通过该漏洞执行任意代码,导致系统被攻击与控制。瑞友天翼应用虚拟化系统是基于服务器计算架构的应用虚拟化平台,它将用户…...
solaris-Oracle11g于linux-mysql相连
Oracle11g(solaris64sparc)mysql(linux)实验 此实验目的,实现公司ebs R12 连mysql上的短信平台.预警和提示ebs中信息, 一,环境 主机名 ip 平台 数据库 dbname ebs234 192.168.1.234 …...

大厂齐出海:字节忙种草,网易爱社交
配图来自Canva可画 随着国内移动互联网红利逐渐触顶,互联网市场日趋饱和,国内各互联网企业之间的竞争便愈发激烈起来。在此背景下,广阔的海外市场就成为了腾讯、阿里、字节、京东、拼多多、百度、网易、快手、B站等互联网公司关注和争夺的重…...
几个实用的正则表达式
1到100之间的正整数正则 表达式:^[1-9]\d?$|^100$ 解释: ^表示匹配字符串开始位置 [1-9]表示数字1-9中的任意一个 \d表示任意一个数字 ?表示前面一个字符或子表达式出现0或1次 $表示匹配字符串结束位置 |表示或 最终的解释为:匹配满…...
python实战应用讲解-【numpy数组篇】常用函数(八)(附python示例代码)
目录 Python Numpy MaskedArray.cumprod()函数 Python Numpy MaskedArray.cumsum()函数 Python Numpy MaskedArray.default_fill_value()函数 Python Numpy MaskedArray.flatten()函数 Python Numpy MaskedArray.masked_equal()函数 Python Numpy MaskedArray.cumprod()函…...

Speech and Language Processing-之N-gram语言模型
正如一句老话所说,预测是困难的,尤其是预测未来。但是,如何预测一些看起来容易得多的事情,比如某人接下来要说的几句话后面可能跟着哪个单词。 希望你们大多数人都能总结出一个很可能的词是in,或者可能是over&#x…...

【AI】Python 安装时启用长路径支持
文章目录 场景:解释:关于文件长路径:计算方法: 场景: Python 安装时,会出现 Disable path length limit 的提示。 解释: 在 Windows 操作系统中,文件路径的长度是有限制的。在早期…...

深入理解Go语言中的接口编程【17】
文章目录 接口接口接口类型为什么要使用接口接口的定义实现接口的条件接口类型变量值接收者和指针接收者实现接口的区别值接收者实现接口指针接收者实现接口下面的代码是一个比较好的面试题 类型与接口的关系一个类型实现多个接口多个类型实现同一接口接口嵌套 空接口空接口的定…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?
在建筑行业,项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升,传统的管理模式已经难以满足现代工程的需求。过去,许多企业依赖手工记录、口头沟通和分散的信息管理,导致效率低下、成本失控、风险频发。例如&#…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...