opencv实战项目-停车位计数

news2025/1/18 17:16:34

手势识别系列文章目录
手势识别是一种人机交互技术,通过识别人的手势动作,从而实现对计算机、智能手机、智能电视等设备的操作和控制。

1.  opencv实现手部追踪(定位手部关键点)

2.opencv实战项目 实现手势跟踪并返回位置信息(封装调用)

3.手势识别-手势音量控制(opencv)

4.opencv实战项目 手势识别-手势控制鼠标

5.opencv实战项目 手势识别-手部距离测量

6.opencv实战项目 手势识别-实现尺寸缩放效果

未完待续
 

目录

1.简介

2.代码思路

 3.代码详解


 

opencv 的图像结果

 

代码需要用到opencv  cvzone模块   pickle模块

1.简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉功能,旨在帮助开发者在各种应用领域中实现图像处理、分析和计算机视觉任务

  1. 功能丰富:OpenCV提供了广泛的图像处理、计算机视觉、机器学习和深度学习功能。这些功能包括图像增强、特征提取、对象检测、人脸识别、图像分割、运动跟踪等。

  2. 跨平台:OpenCV是跨平台的,可以在多种操作系统上运行,包括Windows、Linux、macOS等。

  3. 多语言支持:OpenCV支持多种编程语言,如C++、Python、Java等。这使得开发者可以使用自己熟悉的编程语言来使用OpenCV库。

  4. 高效优化:OpenCV库被优化用于高性能计算。它使用了硬件加速、并行处理和优化算法,以在各种硬件平台上提供高效的计算速度。

  5. 图像和视频处理:OpenCV支持从图像文件和摄像头中读取图像和视频数据。它可以进行图像预处理、过滤、几何变换、颜色空间转换等。

  6. 计算机视觉任务:OpenCV包括各种计算机视觉任务的算法和功能,如物体检测、人脸识别、手势识别、运动跟踪、目标追踪等。

  7. 深度学习集成:OpenCV也集成了一些深度学习框架,如TensorFlow和PyTorch,使得开发者可以结合深度学习模型来执行更复杂的视觉任务。

  8. 开源社区:OpenCV是一个活跃的开源项目,有着庞大的开发者社区。这意味着你可以找到大量的教程、示例代码和解决方案,帮助你解决各种视觉问题。

     

2.代码思路

  1. 视频输入与读取

    • 通过cv2.VideoCapture打开一个视频文件作为输入。
    • 使用cap.read()读取视频的每一帧图像。
  2. 图像预处理

    • 将每一帧图像转换为灰度图像,以简化后续处理。
    • 对灰度图像应用高斯模糊,减少图像中的噪声。
    • 使用自适应阈值方法将图像分割为前景(车辆)和背景(停车位)。
  3. 停车位检测checkParkingSpace函数):

    • 针对预定义的停车位位置(从文件加载得到),在阈值图像中提取每个停车位的区域。
    • 使用cv2.countNonZero计算每个停车位区域内非零(白色)像素的数量。这相当于计算了停车位区域内的白色像素数量,用于判断是否有车辆停放在该位置。
    • 根据计算出的非零像素数量,判断停车位是否空闲。如果非零像素数量低于某个阈值(例如900),则认为停车位为空闲;否则认为停车位被占用。
    • 在原始图像上,使用矩形框和文本标记出停车位的状态,以及区域内非零像素的数量。
  4. 结果显示

    • 在图像上绘制检测结果,使用不同的颜色标记空闲和占用的停车位,以及停车位区域内的像素数量信息。
    • 在图像上绘制空闲停车位的总数量,以及总停车位数量。
  5. 循环处理

    • 循环处理视频的每一帧,重复上述步骤。
    • 如果视频处理完毕,重置视频的位置,以便重新播放视频。

 

 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, 48


def checkParkingSpace(imgPro):
    spaceCounter = 0

    for pos in posList:
        x, y = pos

        imgCrop = 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 = 5
            spaceCounter += 1
        else:
            color = (0, 0, 255)
            thickness = 2

        cv2.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)

代码讲解

  1. 导入所需的库:

    • cv2:OpenCV库,用于图像处理和计算机视觉任务。
    • pickle:用于序列化和反序列化Python对象。
    • cvzone:这是一个基于OpenCV的库,用于在图像上绘制文本和形状。
    • numpy:用于数组操作和数学计算。
  2. 打开视频文件并读取停车位位置信息:

    • cap = cv2.VideoCapture('carPark.mp4'):打开名为'carPark.mp4'的视频文件作为输入。
    • with open('CarParkPos', 'rb') as f::使用二进制模式打开名为'CarParkPos'的文件,其中包含停车位的位置信息。
    • posList = pickle.load(f):从文件中加载停车位位置信息,并将其存储在posList变量中。
  3. 定义一个用于检查停车位空闲情况的函数checkParkingSpace(imgPro)

    • spaceCounter用于计算空闲停车位的数量。
    • 循环遍历每个停车位的位置信息。
    • 从输入图像中提取与当前停车位位置对应的区域,即imgCrop
    • 使用cv2.countNonZero(imgCrop)计算该区域中非零像素的数量(即白色像素数量)。
    • 如果非零像素数量小于900,表示该停车位空闲,将矩形框和文本标记为绿色,计数器增加。
    • 否则,表示停车位已被占用,将矩形框和文本标记为红色。
  4. 进入主循环:

    • 循环用于处理视频帧。
    • 首先检查是否已经到达视频的末尾,如果是,则将视频的位置重置到开头。
    • 使用cap.read()读取视频的下一帧图像。
    • 将图像转换为灰度图像,然后应用高斯模糊、自适应阈值等图像处理步骤,以提取停车位的信息。
    • 调用之前定义的checkParkingSpace()函数,传入经过处理的图像。
    • 在图像上绘制检测结果的矩形框和文本信息。
    • 使用cv2.imshow()显示处理后的图像,并等待用户按键(cv2.waitKey(10))。

视频文件

链接:https://pan.baidu.com/s/1TiNlSBF6I1lHvEr2YIxlBA 
提取码:8vw3

有遇到的问题欢迎评论区留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896118.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端基础(JavaScript语法)

前言&#xff1a;今天学习JavaScript的基本语法&#xff0c;包括变量、函数、对象、数组。 目录 JavaScript 变量 函数 对象 数组 JavaScript 变量 定义变量 判断语句 判断等于&#xff1a; 判断不等于&#xff1a;! if else语句 if(vavb){ console.log("…

Harmony OS教程学习笔记

基础知识 1.如何修改程序启动的第一个页面&#xff1f; 不想使用创建的默认的页面&#xff0c;这时需要修改启动页面&#xff0c;修改的地方在EntryAbility文件中的onWindowStageCreate方法中。 onWindowStageCreate(windowStage: window.WindowStage) {// Main window is cr…

解决无法访问 Github 问题

GitHub作为程序员访问最频繁的网站&#xff0c;程序员们经常需要访问 Github找开源项目、学习新框架、管理自己的个人开源项目等等。 github加速器 因为GitHub属于国外的网站&#xff0c;直接访问的话&#xff0c;速度非常慢&#xff0c;甚至访问不了&#xff0c; 今天给大家…

centos下使用jemalloc解决Mysql内存泄漏问题

参考&#xff1a; MySQL bug&#xff1a;https://bugs.mysql.com/bug.php?id83047&tdsourcetags_pcqq_aiomsg https://github.com/jemalloc/jemalloc/blob/dev/INSTALL.md &#xff08;1&#xff09;ptmalloc 是glibc的内存分配管理 &#xff08;2&#xff09;tcmalloc…

如何批量修改图片名为不同名称

如何批量修改图片名为不同名称&#xff1f;当今社会&#xff0c;因为人们都养成了随手拍照的习惯&#xff0c;所以拥有上千上万张照片的相册已经司空见惯不足为奇。然而&#xff0c;我们在保存这些照片时往往都会碰到一个大难题——电脑中的图片名称千奇百怪&#xff0c;让整个…

打开软件提示mfc100u.dll缺失是什么意思?要怎么处理?

当你打开某个软件或者运行游戏&#xff0c;系统提示mfc100u.dll丢失&#xff0c;此时这个软件或者游戏根本无法运行。其实&#xff0c;mfc100u.dll是动态库文件&#xff0c;它是VS2010编译的软件所产生的&#xff0c;如果电脑运行程序时提示缺少mfc100u.dll文件&#xff0c;程序…

由“美”出发 听艺术家林曦关于美育与智慧的探讨

不久前&#xff0c;林曦老师与我们的老朋友「十点读书」进行了一次线上直播&#xff0c;有关林曦老师十余年的书法教学&#xff0c;和传统美育的心得&#xff0c;以及因此诞生的新书《无用之美》。      这一次的直播&#xff0c;由“美”的主题出发&#xff0c;延伸出美育…

微服务参数透传实现

说明&#xff1a;在微服务架构中&#xff0c;用户身份经网关验证后&#xff0c;我们可以将用户信息&#xff0c;如ID加入到请求头上。后面的微服务中&#xff0c;可以设置一个拦截器&#xff0c;拦截请求&#xff0c;获取请求头上的用户ID&#xff0c;加入到ThreadLocal中。 最…

Spring【学习记录一】

Spring内容解释 早期的Spring仅指代Spring Framework&#xff0c;后来基于Spring Framework孵化出大量的项目&#xff0c;Spring的含义变成了指代Spring家族 Spring Framework是Spring家族所有成员的基础&#xff0c;想要学透Spring&#xff0c;就必须要掌握Spring Framework…

电脑提示concrt140.dll丢失或找不到怎么恢复

现在系统在安装的时候为了简化包体会将一些组件给删除了&#xff0c;这样会造成在运行某些程序的时候&#xff0c;出现组件丢失的提示。例如concrt140.dll丢失&#xff0c;如果不及时处理&#xff0c;会导致系统中不少程序无法正常使用&#xff0c;那么要如何处理这个问题呢&am…

SpringBoot案例-员工管理-删除员工

查看页面原型&#xff0c;明确需求 页面原型 有批量删除和删除单个数据 需求 查看接口文档 接口文档的链接如下&#xff1a; 【腾讯文档】SpringBoot案例所需文档 https://docs.qq.com/doc/DUkRiTWVaUmFVck9N 思路分析 删除单个数据&#xff0c;将要删除的员工信息的id传…

消息中间件主要作用

首先我们想一下&#xff0c;两个公司之间如果有互相调用接口的业务需求&#xff0c;如果没有引入中间件技术&#xff0c;是怎么实现的呢&#xff1f; 用户发起请求给系统A&#xff0c;系统A接到请求直接调用系统B&#xff0c;系统B返回结果后&#xff0c;系统A才能返回结果给用…

YOLOv5、YOLOv8改进:S2注意力机制

目录 1.简介 2.YOLOv5改进 2.1增加以下S2-MLPv2.yaml文件 2.2common.py配置 2.3yolo.py配置 1.简介 S2-MLPv2注意力机制 最近&#xff0c;出现了基于 MLP 的视觉主干。与 CNN 和视觉Transformer相比&#xff0c;基于 MLP 的视觉架构具有较少的归纳偏差&#xff0c;在图像识…

线代强化第四章

下面正式开始公式的证明&#xff1a; B改变了矩阵的秩&#xff0c;所以他是不满秩的。 就是说一个矩阵如果左边乘上一个列满秩的&#xff0c;它的秩不会改变 一个矩阵如果右边乘上一个行满秩的&#xff0c;它的秩不会改变 PROVE: 等于主对角线或副对角线上分块阵的秩的和 当两…

Three.js 实现模型材质局部辉光效果和解决辉光影响场景背景图显示的问题

1.Three.js 实现模型材质局部辉光效果 2.解决辉光效果影响场景背景图显示的问题 相关API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后处理的通用框架&#xff0c;用于将多个渲染通道&#xff08;pass&#xff09;组合在一起创建特定的视觉效果&#xff09; 2. …

【100天精通python】Day36:GUI界面编程_Tkinter高级功能操作和示例

目录 专栏导读 一、GUI 高级功能 1 自定义主题和样式 2 实现拖放功能 3 多线程和异步编程 二、实战项目 1. 待办事项应用 2. 图像查看器 3. 文本编辑器 4 添加动画和过渡效果 5 多界面和多线程示例 专栏导读 专栏订阅地址&#xff1a;https://blog.csdn.net/qq_358…

前端-初始化Vue3+TypeScript

如果使用如下命令初始化项目&#xff0c;项目很干净&#xff0c;很适合了解项目的各个结构。 npm init vitelatest如果使用如下命令初始化项目&#xff0c;是可以选择你需要的组件 npm init vuelatest

Docker 容器数据卷

Docker挂载主机目录访问如果出现cannot open directory .: Permission denied 解决办法&#xff1a;在挂载目录后多加一个--privilegedtrue参数即可 如果是CentOS7安全模块会比之前系统版本加强&#xff0c;不安全的会先禁止&#xff0c;所以目录挂载的情况被默认为不安全的行…

你家的wifi安全么?

在移动互联网已经相当普及的今天&#xff0c;家用Wifi已经成为居家必备设备了&#xff0c;但你有没有考虑过这样一个问题&#xff0c;“我家的Wifi安全么&#xff0c;有没有可能被别人蹭网&#xff0c;或者被黑客登录进来&#xff0c;窃取数据&#xff1f;”下面就结合目前主流…

Bryntum Scheduler Pro 5.5.1 Crack

BRYNTUM 调度程序专业版,专业的日程安排小部件 Bryntum Scheduler Pro 5.5.1 一个专业有大脑的调度UI组件。Scheduler Pro 可帮助您安排任务&#xff0c;同时考虑资源和任务的可用性。 连接您的任务 让 Scheduler Pro 处理剩下的事情。它将根据您定义的链接安排您的任务并遵守任…