opencv实战项目-停车位计数
手势识别系列文章目录
手势识别是一种人机交互技术,通过识别人的手势动作,从而实现对计算机、智能手机、智能电视等设备的操作和控制。
1. opencv实现手部追踪(定位手部关键点)
2.opencv实战项目 实现手势跟踪并返回位置信息(封装调用)
3.手势识别-手势音量控制(opencv)
4.opencv实战项目 手势识别-手势控制鼠标
5.opencv实战项目 手势识别-手部距离测量
6.opencv实战项目 手势识别-实现尺寸缩放效果
未完待续
目录
1.简介
2.代码思路
3.代码详解
代码需要用到opencv cvzone模块 pickle模块
1.简介
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉功能,旨在帮助开发者在各种应用领域中实现图像处理、分析和计算机视觉任务
-
功能丰富:OpenCV提供了广泛的图像处理、计算机视觉、机器学习和深度学习功能。这些功能包括图像增强、特征提取、对象检测、人脸识别、图像分割、运动跟踪等。
-
跨平台:OpenCV是跨平台的,可以在多种操作系统上运行,包括Windows、Linux、macOS等。
-
多语言支持:OpenCV支持多种编程语言,如C++、Python、Java等。这使得开发者可以使用自己熟悉的编程语言来使用OpenCV库。
-
高效优化:OpenCV库被优化用于高性能计算。它使用了硬件加速、并行处理和优化算法,以在各种硬件平台上提供高效的计算速度。
-
图像和视频处理:OpenCV支持从图像文件和摄像头中读取图像和视频数据。它可以进行图像预处理、过滤、几何变换、颜色空间转换等。
-
计算机视觉任务:OpenCV包括各种计算机视觉任务的算法和功能,如物体检测、人脸识别、手势识别、运动跟踪、目标追踪等。
-
深度学习集成:OpenCV也集成了一些深度学习框架,如TensorFlow和PyTorch,使得开发者可以结合深度学习模型来执行更复杂的视觉任务。
-
开源社区:OpenCV是一个活跃的开源项目,有着庞大的开发者社区。这意味着你可以找到大量的教程、示例代码和解决方案,帮助你解决各种视觉问题。
2.代码思路
-
视频输入与读取:
- 通过
cv2.VideoCapture
打开一个视频文件作为输入。 - 使用
cap.read()
读取视频的每一帧图像。
- 通过
-
图像预处理:
- 将每一帧图像转换为灰度图像,以简化后续处理。
- 对灰度图像应用高斯模糊,减少图像中的噪声。
- 使用自适应阈值方法将图像分割为前景(车辆)和背景(停车位)。
-
停车位检测(
checkParkingSpace
函数):- 针对预定义的停车位位置(从文件加载得到),在阈值图像中提取每个停车位的区域。
- 使用
cv2.countNonZero
计算每个停车位区域内非零(白色)像素的数量。这相当于计算了停车位区域内的白色像素数量,用于判断是否有车辆停放在该位置。 - 根据计算出的非零像素数量,判断停车位是否空闲。如果非零像素数量低于某个阈值(例如900),则认为停车位为空闲;否则认为停车位被占用。
- 在原始图像上,使用矩形框和文本标记出停车位的状态,以及区域内非零像素的数量。
-
结果显示:
- 在图像上绘制检测结果,使用不同的颜色标记空闲和占用的停车位,以及停车位区域内的像素数量信息。
- 在图像上绘制空闲停车位的总数量,以及总停车位数量。
-
循环处理:
- 循环处理视频的每一帧,重复上述步骤。
- 如果视频处理完毕,重置视频的位置,以便重新播放视频。
3.代码详解
import cv2
import pickle
import cvzone
import numpy as np# Video feed
cap = cv2.VideoCapture('carPark.mp4')with open('CarParkPos', 'rb') as f:posList = pickle.load(f)width, height = 107, 48def checkParkingSpace(imgPro):spaceCounter = 0for pos in posList:x, y = posimgCrop = imgPro[y:y + height, x:x + width]# cv2.imshow(str(x * y), imgCrop)count = cv2.countNonZero(imgCrop)if count < 900:color = (0, 255, 0)thickness = 5spaceCounter += 1else:color = (0, 0, 255)thickness = 2cv2.rectangle(img, pos, (pos[0] + width, pos[1] + height), color, thickness)cvzone.putTextRect(img, str(count), (x, y + height - 3), scale=1,thickness=2, offset=0, colorR=color)cvzone.putTextRect(img, f'Free: {spaceCounter}/{len(posList)}', (100, 50), scale=3,thickness=5, offset=20, colorR=(0,200,0))
while True:if cap.get(cv2.CAP_PROP_POS_FRAMES) == cap.get(cv2.CAP_PROP_FRAME_COUNT):cap.set(cv2.CAP_PROP_POS_FRAMES, 0)success, img = cap.read()imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)imgBlur = cv2.GaussianBlur(imgGray, (3, 3), 1)imgThreshold = cv2.adaptiveThreshold(imgBlur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY_INV, 25, 16)imgMedian = cv2.medianBlur(imgThreshold, 5)kernel = np.ones((3, 3), np.uint8)imgDilate = cv2.dilate(imgMedian, kernel, iterations=1)checkParkingSpace(imgDilate)cv2.imshow("Image", img)# cv2.imshow("ImageBlur", imgBlur)# cv2.imshow("ImageThres", imgMedian)cv2.waitKey(10)
代码讲解
-
导入所需的库:
cv2
:OpenCV库,用于图像处理和计算机视觉任务。pickle
:用于序列化和反序列化Python对象。cvzone
:这是一个基于OpenCV的库,用于在图像上绘制文本和形状。numpy
:用于数组操作和数学计算。
-
打开视频文件并读取停车位位置信息:
cap = cv2.VideoCapture('carPark.mp4')
:打开名为'carPark.mp4'的视频文件作为输入。with open('CarParkPos', 'rb') as f:
:使用二进制模式打开名为'CarParkPos'的文件,其中包含停车位的位置信息。posList = pickle.load(f)
:从文件中加载停车位位置信息,并将其存储在posList
变量中。
-
定义一个用于检查停车位空闲情况的函数
checkParkingSpace(imgPro)
:spaceCounter
用于计算空闲停车位的数量。- 循环遍历每个停车位的位置信息。
- 从输入图像中提取与当前停车位位置对应的区域,即
imgCrop
。 - 使用
cv2.countNonZero(imgCrop)
计算该区域中非零像素的数量(即白色像素数量)。 - 如果非零像素数量小于900,表示该停车位空闲,将矩形框和文本标记为绿色,计数器增加。
- 否则,表示停车位已被占用,将矩形框和文本标记为红色。
-
进入主循环:
- 循环用于处理视频帧。
- 首先检查是否已经到达视频的末尾,如果是,则将视频的位置重置到开头。
- 使用
cap.read()
读取视频的下一帧图像。 - 将图像转换为灰度图像,然后应用高斯模糊、自适应阈值等图像处理步骤,以提取停车位的信息。
- 调用之前定义的
checkParkingSpace()
函数,传入经过处理的图像。 - 在图像上绘制检测结果的矩形框和文本信息。
- 使用
cv2.imshow()
显示处理后的图像,并等待用户按键(cv2.waitKey(10)
)。
视频文件
链接:https://pan.baidu.com/s/1TiNlSBF6I1lHvEr2YIxlBA
提取码:8vw3
有遇到的问题欢迎评论区留言
相关文章:

opencv实战项目-停车位计数
手势识别系列文章目录 手势识别是一种人机交互技术,通过识别人的手势动作,从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪(定位手部关键点) 2.opencv实战项目 实现手势跟踪并返回位置信息&a…...

NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践
NLP文本匹配任务Text Matching [无监督训练]:SimCSE、ESimCSE、DiffCSE 项目实践 文本匹配多用于计算两个文本之间的相似度,该示例会基于 ESimCSE 实现一个无监督的文本匹配模型的训练流程。文本匹配多用于计算两段「自然文本」之间的「相似度」。 例如…...

复习vue3,简简单单记录
这里的知识是结合视频以及其他文章一起学习,仅用于个人复习记录 ref 和reactive ref 用于基本类型 reactive 用于引用类型 如果使用ref 传递对象,修改值时候需要写为obj.value.attr 方式修改属性值 如果使用reactive 处理对象,直接obj.att…...

【自用】云服务器 docker 环境下 HomeAssistant 安装 HACS 教程
一、进入 docker 中的 HomeAssistant 1.查找 HomeAssistant 的 CONTAINER ID 连接上云服务器(宿主机)后,终端内进入 root ,输入: docker ps找到了 docker 的 container ID 2.config HomeAssistant 输入下面的命令&…...

使用dockerfile手动构建JDK11镜像运行容器并校验
Docker官方维护镜像的公共仓库网站 Docker Hub 国内无法访问了,大部分镜像无法下载,准备逐步构建自己的镜像库。【转载aliyun官方-容器镜像服务 ACR】Docker常见问题 阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)是面…...

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路
🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…...

Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)
文章目录 1 前言2 st.line_chart:绘制线状图3 st.area_chart:绘制面积图4 st.bar_chart:绘制柱状图5 st.pyplot:绘制自定义图表6 结语 1 前言 在数据可视化的世界中,绘制清晰、易于理解的图表是非常关键的。Streamlit…...

其他行业跳槽转入计算机领域简单看法
其他行业跳槽转入计算机领域简单看法 本人选择从以下几个方向谈谈自己的想法和观点。 先看一下总体图,下面会详细分析 如何规划才能实现转码 自我评估和目标设定:首先,你需要评估自己的技能和兴趣,确定你希望在计算机领域从事…...

Unity制作一个简单的登入注册页面
1.创建Canvas组件 首先我们创建一个Canvas画布,我们再在Canvas画布底下创建一个空物体,取名为Resgister。把空物体的锚点设置为全屏撑开。 2.我们在Resgister空物体底下创建一个Image组件,改名为bg。我们也把它 的锚点设置为全屏撑开状态。接…...

常用游戏运营指标DAU、LTV及参考范围
文章目录 前言运营指标指标范围参考值留存指标的意义总结 前言 作为游戏人免不了听到 DAU 、UP值、留存 等名词,并且有些名词听起来还很像,特别是一款上线的游戏,这些游戏运营指标是衡量游戏业务绩效和用户参与度的重要数据,想做…...

标准模板库STL——deque和list
deque概述 deque属于顺序容器,称为双端队列容器 底层数据结构是动态二维数组,从整体上看,deque的内存不连续 初始数组第一维数量为2,必要时进行2倍扩容 每次第一维扩容后,原来数组第二维元素从新数组下标为OldSize/2的…...

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测
分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-BiGRU-Attention多特征分类预测,多特征输入模型&…...

C++ Primer Plus 第6版 读书笔记(10) 第十章 类与对象
第十章 类与对象 在面向对象编程中,类和对象是两个重要的概念。 类(Class)是一种用户自定义的数据类型,用于封装数据和操作。它是对象的模板或蓝图,描述了对象的属性(成员变量)和行为…...

基于C++ 的OpenCV绘制多边形,多边形多条边用不用的颜色绘制
使用基于C的OpenCV库来绘制多边形,并且为多边形的不同边使用不同的颜色,可以按照以下步骤进行操作: 首先,确保你已经安装了OpenCV库并配置好了你的开发环境。 导入必要的头文件: #include <opencv2/opencv.hpp&g…...

(六)、深度学习框架中的算子
1、深度学习框架算子的基本概念 深度学习框架中的算子(operator)是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件,实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元,它们…...

Redis实现共享Session
Redis实现共享Session 分布式系统中,sessiong共享有很多的解决方案,其中托管到缓存中应该是最常用的方案之一。 1、引入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM…...

网络通信原理UDP协议(第五十课)
UDP协议:用户数据包协议,无连接、不可靠,效率高 字段长度描述Source Port2字节标识哪个应用程序发送(发送进程)。Destination Port2字节标识哪个应用程序接收(接收进程)。Length2字节UDP首部加上UDP数据的字节数,最小为8。Checksum2字节覆盖UDP首部和UDP数据,是可…...

43、TCP报文(一)
本节内容开始,我们正式学习TCP协议中具体的一些原理。首先,最重要的内容仍然是这个协议的封装结构和首部格式,因为这里面牵扯到一些环环相扣的知识点,例如ACK、SYN等等,如果这些内容不能很好的理解,那么后续…...

【JavaScript】使用js实现滑块验证码功能与浏览器打印
滑块验证码 效果图: 实现思路: 根据滑块的最左侧点跟最右侧点, 是否在规定的距离内【页面最左侧为原点】,来判断是否通过 html代码: <!DOCTYPE html> <html><head><title>滑动图片验证码&…...

【使用群晖远程链接drive挂载电脑硬盘】
文章目录 前言1.群晖Synology Drive套件的安装1.1 安装Synology Drive套件1.2 设置Synology Drive套件1.3 局域网内电脑测试和使用 2.使用cpolar远程访问内网Synology Drive2.1 Cpolar云端设置2.2 Cpolar本地设置2.3 测试和使用 3. 结语 前言 群晖作为专业的数据存储中心&…...

easyx图形库基础4:贪吃蛇
贪吃蛇 一实现贪吃蛇:1.绘制网格:1.绘制蛇:3.控制蛇的默认移动向右:4.控制蛇的移动方向:5.生成食物6.判断蛇吃到食物并且长大。7.判断游戏结束:8.重置函数: 二整体代码: 一实现贪吃蛇…...

哈夫曼树(赫夫曼树、最优树)详解
目录 哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 什么是哈夫曼树 构建哈夫曼树的过程 哈弗曼树中结点结构 构建哈弗曼树的算法实现 哈夫曼树(赫夫曼树、最优树)详解 哈夫曼树相关的几个名词 路径:…...

智慧建筑工地平台,通过信息化技术、物联网、人工智能技术,实现对施工全过程的实时监控、数据分析、智能管理和优化调控
智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本…...

Springboot 实践(8)springboot集成Oauth2.0授权包,对接spring security接口
此文之前,项目已经添加了数据库DAO服务接口、资源访问目录、以及数据访问的html页面,同时项目集成了spring security,并替换了登录授权页面;但是,系统用户存储代码之中,而且只注册了admin和user两个用户。在…...

OpenCV-Python中的图像处理-GrabCut算法交互式前景提取
OpenCV-Python中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…...

leetcode原题 后继者:找出二叉搜索树中指定节点的“下一个”节点
题目: 设计一个算法,找出二叉搜索树中指定节点的“下一个”节点(也即中序后继)。 如果指定节点没有对应的“下一个”节点,则返回null。 示例: 输入: root [2,1,3], p 1 2 / \ 1 3 输出: 2 解题思路…...

pyqt5 QlineEdit 如何设置只能输入数字
在 PyQt(Python中的一个GUI库)中,可以使用QLineEdit小部件的setValidator()方法来限制用户输入的内容。要让QLineEdit只能输入数字,你可以使用QIntValidator或QDoubleValidator。下面是一个示例代码,展示如何设置只能输…...

ubuntu中安装python
最简单方便的是 apt 使用第三方的 ppa 源,然后直接 apt 安装 python3.9 安装 software-properties-common 获取add-apt-repository命令:apt install -y software-properties-common添加第三方的 ppa 源:add-apt-repository ppa:deadsnakes/p…...

LeetCode150道面试经典题-- 快乐数(简单)
1.题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果这个过程 结果为 1&am…...

科研论文配图----第一章笔记
第一章笔记 科研论文的绘制基础 科研论文配图的分类与构成 根据呈现方式,科研论文配图可分为线性图、灰度图、照片彩图和综合配图 4 种类型。 其中,线性图是主要和常用的配图类型,也是本书重点介绍的配图类型。 科研论文配图的格式和尺寸 格…...