OpenCV图像处理——停车场车位识别

news2024/9/28 3:25:02

总目录

图像处理总目录←点击这里

十九、停车场车位识别

19.1、项目说明

唐宇迪老师的——OPENCV项目实战 学习

本项目的目的是设计一个停车场车位识别的系统,能够判断出当前停车场中哪些车位是空的。
任务共包含部分:

  1. 对图像预处理
    • 从停车场的监控视频中提取图片
    • 对图片进行一系列的预处理,去噪、识别图像中的车位、定位停车位的轮廓
    • 提取每个停车位区域的图片并保存到指定的数据文件路径
  2. 训练神经网络模型,能够识别停车场中有哪些剩余车位
    • 使用keras训练一个2分类的模型,卷积网络选择vgg,采用keras提供的api,并冻结前10层
    • 从视频中取出每一帧,挨个训练,实现实时

着重介绍图像处理(神经网络是一个简单的二分类问题,有车和没车的一个判断)

19.2、图像预处理

19.2.1、读取图像

从视频中截取两张图,进行读取操作
在这里插入图片描述

19.2.2、过滤背景

select_rgb_white_yellow 函数实现

HSV各种颜色的取值范围
在这里插入图片描述
white_mask = cv2.inRange(image, lower, upper)

低于120,或者高于255的都处理为0(黑色)

在这里插入图片描述

将其与原始图像做与操作,这样的话,只有原始图像是255的像素点留下来了,把无关的操作过滤掉

cv2.bitwise_and(image, image, mask=white_mask)

在这里插入图片描述

19.2.3、灰度图

convert_gray_scale 函数实现

cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)

在这里插入图片描述

19.2.4、边缘检测

detect_edges 函数实现

cv2.Canny(image, low_threshold, high_threshold)

在这里插入图片描述

19.2.5、裁剪区域

select_region 函数实现

手动画点

rows, cols = image.shape[:2]
pt_1 = [cols * 0.05, rows * 0.90]
pt_2 = [cols * 0.05, rows * 0.70]
pt_3 = [cols * 0.30, rows * 0.55]
pt_4 = [cols * 0.6, rows * 0.15]
pt_5 = [cols * 0.90, rows * 0.15]
pt_6 = [cols * 0.90, rows * 0.90]

在这里插入图片描述

mask填充

为选定区域填充白色

mask = np.zeros_like(image)
cv2.fillPoly(mask, vertices, 255)

在这里插入图片描述

区域切割

cv2.bitwise_and(image, mask)

在这里插入图片描述

19.2.6、检测直线

hough_linesdraw_lines函数实现

通过 霍夫变换 (边缘检测后使用)后检测到停车位的方框直线

cv2.HoughLinesP(image, rho=0.1, theta=np.pi / 10, threshold=15, minLineLength=9, maxLineGap=4)

  • rho距离精度
  • theta角度精度
  • threshod超过设定阈值才被检测出线段
  • minLineLengh 线的最短长度,比这个短的都被忽略
  • MaxLineCap 两条直线之间的最大间隔,小于此值,认为是一条直线

检测完之后进行画线操作

在这里插入图片描述

19.2.7、区域列车位划分

identify_blocks 函数 实现

过滤部分直线

一列一列的为一组,过滤掉不符合的

        for line in lines:
            for x1, y1, x2, y2 in line:
                if abs(y2 - y1) <= 1 and 25 <= abs(x2 - x1) <= 55:
                    cleaned.append((x1, y1, x2, y2))

直线x1排序

默认是打乱排序的

x1是每一列车位的最左边位置

sorted(cleaned, key=operator.itemgetter(0, 1))

在这里插入图片描述

分为n列

找到多个列,相当于每列是一排车
根据线之间的距离进行判断

for i in range(len(list1) - 1):
    distance = abs(list1[i + 1][0] - list1[i][0])
    if distance <= clus_dist:
        if not dIndex in clusters.keys(): clusters[dIndex] = []
        clusters[dIndex].append(list1[i])
        clusters[dIndex].append(list1[i + 1])
    else:
        dIndex += 1

坐标

通过循环,得到每一列的具体坐标(矩形框的四个坐标)

for key in clusters:
    all_list = clusters[key]
    cleaned = list(set(all_list))
    if len(cleaned) > 5:
        cleaned = sorted(cleaned, key=lambda tup: tup[1])
        avg_y1 = cleaned[0][1]
        avg_y2 = cleaned[-1][1]
        avg_x1 = 0
        avg_x2 = 0
        for tup in cleaned:
            avg_x1 += tup[0]
            avg_x2 += tup[2]
        avg_x1 = avg_x1 / len(cleaned)
        avg_x2 = avg_x2 / len(cleaned)
        rects[i] = (avg_x1, avg_y1, avg_x2, avg_y2)
        i += 1

画出车位

通过观察可以看出,右边的区域更符合条件(左边的第一列第二列划分不好)

把列矩形画出来

19.2.8、区域每个车位划分

draw_parking 函数实现

注意第一列和最后一列是单排停车位

其余为双排停车位,分类讨论

for i in range(0, num_splits + 1):
    y = int(y1 + i * gap)
    cv2.line(new_image, (x1, y), (x2, y), color, thickness)
if key > 0 and key < len(rects) - 1:
    # 竖直线
    x = int((x1 + x2) / 2)
    cv2.line(new_image, (x, y1), (x, y2), color, thickness)
            

在这里插入图片描述

19.3、训练神经网络

判断车位上面有没有车

19.3.1、切割停车位图片

save_images_for_cnn 函数实现

得到每一个停车位上面的图片,判断是否有车

在这里插入图片描述

人工对车位进行分割: 分为有车和没车两种类型

在这里插入图片描述

19.3.2、训练模型

train.py文件进行模型训练

使用vgg16模型进行训练

model = applications.VGG16(weights='imagenet', include_top=False, input_shape=(img_width, img_height, 3))

数据量较少,对vgg原模型进行“冻”起来操作,只需要改自己的全连接层和输出层

# 冻起来操作:对前10层的网络结构不进行更改
for layer in model.layers[:10]:
    layer.trainable = False

19.3.3、基于视频的车位检测

predict_on_image 函数处理某帧的情况

测试了上面刚开始的两张图像
在这里插入图片描述
在这里插入图片描述

19.4、最终效果

predict_on_video 函数处理视频

将每一帧图像保存下来,做成动图效果

在这里插入图片描述

项目源码

https://github.com/lzh66666/park_opencv

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

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

相关文章

Vue基础之组件通信provide、inject

最近发现竟然还有小伙伴还不清楚provide、inject的用法&#xff0c;是时候普及一下provide、inject了&#xff1b; 常用的组件通信基本是父子组件通过props和emit来进行&#xff0c;一旦层级多了起来&#xff0c;props和emit就不好使了。每级都写props的话&#xff0c;会变得非…

PMP每日一练 | 考试不迷路-11.24(包含敏捷+多选)

11.27PMP考试倒计时 3天 每日5道PMP习题助大家上岸PMP&#xff01; ​题目1-2&#xff1a; ​1.在项目的规划阶段完成以后&#xff0c;但在正式执行之前&#xff0c;项目经理需要就项目目标进行沟通并获得承诺。项目经理下一步应该做什么? ( ) A.与所有相关方召开开工会议…

麻了,别再为难软件测试员了

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

深度操作系统20.5发布 deepin 20.5更新内容汇总

深度操作系统&#xff08;deepin&#xff09;是一款致力于为全球用户提供美观易用、安全稳定服务的Linux发行版&#xff0c;同时也一直是排名最高的来自中国团队研发的Linux发行版。深度操作系统20.5升级Stable内核至5.15.24&#xff0c;修复底层漏洞&#xff0c;进一步提升系统…

linux 清理垃圾文件

linux的文件系统比windows的要优秀&#xff0c;不会产生碎片&#xff0c;对于长时间运行的服务器来说尤为重要&#xff0c;而且linux系统本身也不会像windows一样产生大量的垃圾文件。不知道这个说法有没有可信度!至少我们可以确定的是linux系统的文件系统是比较优秀的! linux…

如何建立一个自己的网站?不懂代码搭建自己网站详细教程

搭建自己网站的准备&#xff1a; 1、首先需要注册购买一个域名&#xff0c;比如baidu.com&#xff0c;域名注册可以在阿里云或者其它域名注册平台注册。最常见的.com域名一般也就几十元一年&#xff1b; 域名 2、购买一个服务器&#xff0c;服务器也可以在阿里云或者景安等平…

数据结构之希尔排序

希尔排序 在插入排序的基础上&#xff0c;进行完善的算法 举个例子 如图我们把相距举例为4的两个元素组成一个子表 &#xff08;1和5&#xff0c;2和6&#xff0c;3和7&#xff0c;4和8&#xff09; 对各个子表进行直接插入排序 比如对子表2进行直接插入排序 13插入到38前&…

智慧小镇解决方案-最新全套文件

智慧小镇解决方案-最新全套文件一、建设背景二、建设思路三、建设方案四、获取 - 智慧小镇全套最新解决方案合集一、建设背景 智慧小镇&#xff0c;是指在城镇发展过程中&#xff0c;在城镇基础设施、资源环境、社会民生、经济产业、市政治理等领域中&#xff0c;充分利用物联…

2022亚太杯C题思路代码分析

C题就是数学比较开放的题目了&#xff0c;属于一个数据分析类题目&#xff0c;跟前两年的华为杯差不多&#xff0c;考察的也是全球变暖问题。更多内容文末名片查看 问题1.你同意有关全球气温的说法吗&#xff1f;使用2022_APMCM_C_Data。附件中的csv和其他您的团队收集的数据集…

用DIV+CSS制作四川成都美食网页介绍(网页设计期末课程设计)

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…

RetinaNet-Obj

真是东西多多每天都有新发现 论文地址&#xff1a;https://arxiv.org/abs/1908.09075 样本不平衡问题感觉近期研究的论文相对较多&#xff0c;如&#xff1a;2019 AAAI GHM&#xff0c;2019 CVPR AP-loss&#xff0c; 还有2019 DR loss&#xff0c; 2019 IoU-bala…

国外Essay写作怎么准确高效地审题?

Essay写作的重中之重是什么&#xff1f;毫无疑问肯定是审题审题还是审题&#xff0c;任何形式的Essay写作都以正确地审题为前提。小编就为大家分享如何准确而高效地审题。 What is the top priority of Essays writing?There is no doubt that it must be subject review or t…

python聚类分析如何可视化?

前言 聚类分析是一类将数据所对应的研究进行分类的统计方法。这一类方法的共同特点是&#xff0c;事先不知道类别的个数与结构&#xff1b;进行分析的数据是表明对象之间的相似性或相异性的数据&#xff0c;将这些数据看成对对象“距离”远近的一种度量&#xff0c;将距离近的…

制作一个简单HTML传统端午节日网页(HTML+CSS)7页 带报告

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 传统春节网页设计 | 圣诞节节日发展 | 中秋 | 端午传统节日习俗庆祝 | 地区特色 | 网站模板 | 等网站的设计与制 | HTML期末大学生网页设计作业 HTML&…

#边学边考 必修5 高项:对人管理 第2章 项目沟通管理和干系人管理

答题报告 自我分析 有可能是间隔时间太长&#xff0c;本章节从开始学习到今天&#xff08;11.24&#xff09;学完&#xff0c;中间至少停止了1周以上&#xff0c;造成对基本知识记忆不牢固。对重点知识没有重点记忆&#xff0c;走马观花&#xff0c;以至于混淆。 答题解析 关…

Android Jetpack之LiveData源码分析

LiveData 是一种可观察的数据存储器类。与常规的可观察类不同&#xff0c;LiveData 具有生命周期感知能力&#xff0c;意指它遵循其他应用组件&#xff08;如 activity、fragment 或 service&#xff09;的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的…

DeFi:解决 EIP-4626 中的滑点问题

DeFi&#xff1a;解决 EIP-4626 中的滑点问题 简介 EIP-4626提供了一种将代币投资到投资池(通常称为金库)的标准方法。当我们存入自己的资产&#xff08;ERC-20 代币&#xff09;时&#xff0c;我们会收到一个份额代币&#xff0c;代表我们在金库里的资产。金库将把汇集的资产…

力扣 234. 回文链表

力扣 234. 回文链表 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&…

快速排序算法 QuickSort algorithm

该算法是托尼霍尔在1960年提出。 算法思想&#xff1a;从集合中随机取一个数作为支点&#xff0c;然后将比它大的数放在一个集合里&#xff0c;比它小的数放在另一个集合中&#xff0c;然后再递归下去&#xff0c;最后便可求得有序的数组。 QuickSort(A) 1: S− {}; S {}; …

LeetCode栈和队列练习

文章目录前言1.力扣20. 有效的括号1.题目分析2.代码示现2.力扣225. 用队列实现栈1.题目分析2.代码实现3.力扣232. 用栈实现队列1.题目分析2.代码实现4.力扣622. 设计循环队列1.题目分析2.代码实现5.总结前言 之前的博客介绍的栈和队列的实现&#xff0c;本文将会对栈和队列的使…