基于Open

您所在的位置:网站首页 停车场的停车线怎么规划 基于Open

基于Open

2024-07-01 11:14| 来源: 网络整理| 查看: 265

*结合Open-cv 以及深度学习的停车位识别

基于Open-cv 的停车场停车位识别个人笔记附所有代码(上) *在学习唐宇迪老师的图像识别课程中,里边包含这样一个关于停车场车位识别的小项目,结合自己理解,优化了部分代码(此文中出现的为部分结果图),想更多了解的移步唐宇迪老师课程。 项目思路 项目目的;项目分析;项目实验;项目结果; 项目目的 在做此项目时候,数据为一段MP4格式的视频(见文末链接),因此对视频进行分析,视频中的每一帧即为一幅图像,对图像做分析, 要求识别出图像中的停车位,包括所有停车位的数量、位置,然后再精确分析已占车位以及空车位的数量以及位置。* 图1. 原视频图像 项目分析

图像为视频中截取的某一帧,对图像进行分析,首先判断停车场的形状以及其中停车位分布,初步规划如何进行数据预处理,以及如何有效利用数据。分析影响数据的多种因素,如不同时间的光照情况、车身颜色与地面相近的情况、车身压线情况以及正在进入或者驶出车位情况等等。

项目实验 数据预处理 为了避免不必要的干扰,在数据预处理阶段,采用背景过滤的方式滤除不必要的信息,然后得到mask图像。 图2. 滤除背景后图像 图3. mask图像传入原图像 def select_rgb_white_yellow(self,image): #过滤掉背景 lower = np.uint8([120, 120, 120]) upper = np.uint8([255, 255, 255]) # lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255,相当于过滤背景 white_mask = cv2.inRange(image, lower, upper) self.cv_show('white_mask',white_mask) masked = cv2.bitwise_and(image, image, mask = white_mask) #将mask图像传入原图像,执行与操作 self.cv_show('masked',masked) return masked

之后进行灰度转化以及边缘检测等处理方式,如下:

图4. 灰度图像 图5. 边缘检测图像 def convert_gray_scale(self,image): return cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) def detect_edges(self,image, low_threshold=50, high_threshold=200): return cv2.Canny(image, low_threshold, high_threshold)

在得到边缘检测图像后,手动划分感兴趣区域,剔除无效边缘背景,确定感兴趣区域的顶点(此处设置6个顶点),之后结合mask图像得到结果图。

图6. 划分感兴趣区域 图7. ROI对应mask图像 图8. ROI对应原图像 def filter_region(self,image, vertices): """ 剔除掉不需要的地方 """ mask = np.zeros_like(image) if len(mask.shape)==2: cv2.fillPoly(mask, vertices, 255) #利用顶点填充mask self.cv_show('mask', mask) return cv2.bitwise_and(image, mask) def select_region(self,image): """ 手动选择区域 """ # first, define the polygon by vertices 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.33, rows*0.52] pt_4 = [cols*0.60, rows*0.15] pt_5 = [cols*0.89, rows*0.15] pt_6 = [cols*0.90, rows*0.90] #vertices为手动划分的6个顶点 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) 霍夫变换 在得到了边缘检测后结果后,对其进行霍夫变换的直线检测,由于停车位对应原图1的短线,因此对其进行检测结果如下图 图9. 原图对应直线检测 def hough_lines(self,image): #输入的图像需要是边缘检测后的结果 #minLineLengh(线的最短长度,比这个短的都被忽略)和MaxLineCap(两条直线之间的最大间隔,小于此值,认为是一条直线) #rho距离精度,theta角度精度,threshod超过设定阈值才被检测出线段 return cv2.HoughLinesP(image, rho=0.1, theta=np.pi/10, threshold=15, minLineLength=9, maxLineGap=4) 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