停车场车位识别 opencv(一)

您所在的位置:网站首页 停车位是空 停车场车位识别 opencv(一)

停车场车位识别 opencv(一)

2024-07-16 13:39| 来源: 网络整理| 查看: 265

停车场车位识别,opencv图像预处理,训练网络模型 项目理论和源码来自唐宇迪opencv项目实战

本项目的目的是设计一个停车场车位识别的系统,能够判断出当前停车场中哪些车位是空的。 任务共包含部分: 1.制作数据集,从停车场的监控视频中提取图片,使用数字图像处理技术制作数据集。 2.利用上一步制作的数据集,训练神经网络模型,能够识别停车场中有哪些剩余车位。

1 数字数字图像处理 opencv 从视频中截取图片,即对视频图片逐帧保存。 对图片进行一系列的预处理,去噪、识别图像中的车位、定位停车位的轮廓 提取每个停车位区域的图片并保存到指定的数据文件路径。 (1)从视频中截取图片

程序代码

import cv2 import numpy as np def save_image(image, addr, num): address = addr + str(num) + '.jpeg' cv2.imwrite(address, image) videoCapture = cv2.VideoCapture("path/.mp4") success, frame = videoCapture.read() i = 0 while success: i = i + 1 save_image(frame, './output/img_', i) if success: print('save image:', i) success, frame = videoCapture.read()

在这里插入图片描述 本实例中我们使用其中的两张图片。

(2)显示指定路径下的两张图片

用matplotlib显示图片 matplotlib官方文档 对于三通道的彩色图像, plt的三通道的顺序是RGB 而opencv的三个通道顺序是BGR。 显示路径下这两张图片 程序:

def show_images(self, images, cmap = None): # 文件夹中有多少张图片,用plt在同一幅画面中显示 cols = 2 rows = (len(images)+1)//cols # 图像的宽和高,单位是英寸 plt.figure(figsize=(15, 12)) # 遍历路径下的每一张图片 for i, image in enumerate(images): plt.subplot(rows, cols, i+1) cmap = 'gray' if len(image.shape) == 2 else cmap plt.imshow(image, cmap=cmap) plt.xticks([]) plt.yticks([]) plt.tight_layout(pad=0, h_pad=0, w_pad=0) plt.show()

结果: 在这里插入图片描述

(3)滤除其他区域

我们关心的只有图像中停车部分的信息,对于本实例中的图片,左上角区域是可以滤除掉的。于是我们只做了一个近似梯形区域的掩模: 在这里插入图片描述 生成这个掩模的程序: cv2.fillPoly函数用来填充凸多边形,只需给出凸多边形的顶点。 这里的vertices指的是用顶点坐标确定的待填充的区域, 此时的mask 把图区域内填充成255,其他区域是0,将mask于原图像进行“与”运算。

def filter_region(self,image, vertices): """ 剔除掉不需要的地方 """ mask = np.zeros_like(image) if len(mask.shape) == 2: cv2.fillPoly(mask, vertices, 255) self.cv_show('mask', mask) return cv2.bitwise_and(image, mask)

还需要确定的是顶点坐标,也就是vertices中的内容。 梯形的顶点坐标我们怎么得到呢? 就是这几个点呐: 在这里插入图片描述 手动输入……我给你手动点赞,手动微笑,手动…… 就是根据这张特定的图片,手动输入点的坐标,并把点的坐标存放到vertices中

def select_region(self,image): """ 手动选择区域 """ 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.60, rows*0.15] pt_5 = [cols*0.90, rows*0.15] pt_6 = [cols*0.90, rows*0.90] vertices = np.array([[pt_1, pt_2, pt_3, pt_4, pt_5, pt_6]], dtype=np.int32) point_img = image.copy() point_img = cv2.cvtColor(point_img, cv2.COLOR_GRAY2RGB) for point in vertices[0]: cv2.circle(point_img, (point[0],point[1]), 10, (0,0,255), 4) self.cv_show('point_img',point_img) return self.filter_region(image, vertices)

将mask和图像做“与”运算之前还需要对图像进行二值化。 white_mask = cv2.inRange(image, lower, upper)函数是对像素值低于lower和高于upper的点变为0(黑色), 在两只之间的像素点变为255(白色)。 np.zeros_like函数表示构造一个与原图像维度相同,所有元素初始化为0的矩阵。

def select_rgb_white_yellow(self,image): # 过滤掉背景 lower = np.uint8([120, 120, 120]) upper = np.uint8([255, 255, 255]) mask = np.zeros_like(image) print("len(mask.shape)", len(mask.shape)) img_mask = cv2.bitwise_and(image, mask) white_mask = cv2.inRange(image, lower, upper) self.cv_show('2_white_mask',white_mask) masked = cv2.bitwise_and(image, image, mask=white_mask) self.cv_show('3_masked', masked) return masked

显示结果:在这里插入图片描述

进行原图像和二值图像进行“与”操作结果如图: 在这里插入图片描述 还有一步就是进行Canny边缘检测:

边缘检测的步骤 1.使用高斯滤波平滑图像,滤除噪声。 2.计算图像中每个像素点的强度和方向。 3.应用非极大值抑制,消除边缘检测带来的杂散响应。 4.应用双阈值(Double—Threshold)来检测潜在的和真实的边缘 5.通过抑制孤立的弱边缘点,最终完成边缘检测。

def detect_edges(self,image, low_threshold=50, high_threshold=200): return cv2.Canny(image, low_threshold, high_threshold) cv2.imshow("image", image)

两个阈值值得是梯度:如果梯度大于200,那么判定为边缘;如果小于50,那么判定不是边缘;在两个值之间,又和确定的边缘相连,那么判定为是边缘。

图像进行Canny边缘检测之后再用掩模进行处理后结果如图所示: 在这里插入图片描述

(4)Hough直线检测

HoughLinesP函数是统计概率霍夫线变换函数 cv2.HoughLinesP函数的输入图像必须是边缘检测的结果 rho表示距离精度 theta表示角度精度 threshod表示检测为一条直线所需的最少交点。 minLineLength参数表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。 maxLineGap参数表示能被认为在一条直线上的两个点的最大距离。

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

该函数的返回值是直线的起止点的坐标(x0,y0,x1,y1) 进一步对检测到的图片进行筛选:

def draw_lines(self, image, lines, color=[255, 0, 0], thickness=2, make_copy=True): # 过滤霍夫变换检测到直线 if make_copy: image = np.copy(image) cleaned = [] for line in lines: for x1, y1, x2, y2 in line: if abs(y2-y1) =25 and abs(x2-x1)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3