This action will force synchronization from 小柒2012商城/从零学Python, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
# https://www.cnblogs.com/HL-space/p/10588423.htmlimport osimport cv2import numpy as np# 预处理def imgProcess(path):img = cv2.imread(path)# 统一规定大小img = cv2.resize(img, (640, 480))# 高斯模糊img_Gas = cv2.GaussianBlur(img, (5, 5), 0)# RGB通道分离img_B = cv2.split(img_Gas)[0]img_G = cv2.split(img_Gas)[1]img_R = cv2.split(img_Gas)[2]# 读取灰度图和HSV空间图img_gray = cv2.cvtColor(img_Gas, cv2.COLOR_BGR2GRAY)img_HSV = cv2.cvtColor(img_Gas, cv2.COLOR_BGR2HSV)return img, img_Gas, img_B, img_G, img_R, img_gray, img_HSV# 初步识别def preIdentification(img_gray, img_HSV, img_B, img_R):for i in range(480):for j in range(640):# 普通蓝色车牌,同时排除透明反光物质的干扰if ((img_HSV[:, :, 0][i, j]-115)**2 < 15**2) and (img_B[i, j] > 70) and (img_R[i, j] < 40):img_gray[i, j] = 255else:img_gray[i, j] = 0# 定义核kernel_small = np.ones((3, 3))kernel_big = np.ones((7, 7))img_gray = cv2.GaussianBlur(img_gray, (5, 5), 0) # 高斯平滑img_di = cv2.dilate(img_gray, kernel_small, iterations=5) # 腐蚀5次img_close = cv2.morphologyEx(img_di, cv2.MORPH_CLOSE, kernel_big) # 闭操作img_close = cv2.GaussianBlur(img_close, (5, 5), 0) # 高斯平滑_, img_bin = cv2.threshold(img_close, 100, 255, cv2.THRESH_BINARY) # 二值化return img_bin# 定位def fixPosition(img, img_bin):# 检测所有外轮廓,只留矩形的四个顶点contours, _ = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)#形状及大小筛选校验det_x_max = 0det_y_max = 0num = 0for i in range(len(contours)):x_min = np.min(contours[i][ :, :, 0])x_max = np.max(contours[i][ :, :, 0])y_min = np.min(contours[i][ :, :, 1])y_max = np.max(contours[i][ :, :, 1])det_x = x_max - x_mindet_y = y_max - y_minif (det_x / det_y > 1.8) and (det_x > det_x_max ) and (det_y > det_y_max ):det_y_max = det_ydet_x_max = det_xnum = i# 获取最可疑区域轮廓点集points = np.array(contours[num][:, 0])return pointsdef findVertices(points):# 获取最小外接矩阵,中心点坐标,宽高,旋转角度rect = cv2.minAreaRect(points)# 获取矩形四个顶点,浮点型box = cv2.boxPoints(rect)# 取整box = np.int0(box)# 获取四个顶点坐标left_point_x = np.min(box[:, 0])right_point_x = np.max(box[:, 0])top_point_y = np.min(box[:, 1])bottom_point_y = np.max(box[:, 1])left_point_y = box[:, 1][np.where(box[:, 0] == left_point_x)][0]right_point_y = box[:, 1][np.where(box[:, 0] == right_point_x)][0]top_point_x = box[:, 0][np.where(box[:, 1] == top_point_y)][0]bottom_point_x = box[:, 0][np.where(box[:, 1] == bottom_point_y)][0]# 上下左右四个点坐标vertices = np.array([[top_point_x, top_point_y], [bottom_point_x, bottom_point_y], [left_point_x, left_point_y], [right_point_x, right_point_y]])return vertices, rectdef tiltCorrection(vertices, rect):# 畸变情况1if rect[2] > -45:new_right_point_x = vertices[0, 0]new_right_point_y = int(vertices[1, 1] - (vertices[0, 0]- vertices[1, 0]) / (vertices[3, 0] - vertices[1, 0]) * (vertices[1, 1] - vertices[3, 1]))new_left_point_x = vertices[1, 0]new_left_point_y = int(vertices[0, 1] + (vertices[0, 0] - vertices[1, 0]) / (vertices[0, 0] - vertices[2, 0]) * (vertices[2, 1] - vertices[0, 1]))# 校正后的四个顶点坐标point_set_1 = np.float32([[440, 0],[0, 0],[0, 140],[440, 140]])# 畸变情况2elif rect[2] < -45:new_right_point_x = vertices[1, 0]new_right_point_y = int(vertices[0, 1] + (vertices[1, 0] - vertices[0, 0]) / (vertices[3, 0] - vertices[0, 0]) * (vertices[3, 1] - vertices[0, 1]))new_left_point_x = vertices[0, 0]new_left_point_y = int(vertices[1, 1] - (vertices[1, 0] - vertices[0, 0]) / (vertices[1, 0] - vertices[2, 0]) * (vertices[1, 1] - vertices[2, 1]))# 校正后的四个顶点坐标point_set_1 = np.float32([[0, 0],[0, 140],[440, 140],[440, 0]])# 校正前平行四边形四个顶点坐标new_box = np.array([(vertices[0, 0], vertices[0, 1]), (new_left_point_x, new_left_point_y), (vertices[1, 0], vertices[1, 1]), (new_right_point_x, new_right_point_y)])point_set_0 = np.float32(new_box)return point_set_0, point_set_1, new_boxdef transform(img, point_set_0, point_set_1):# 变换矩阵mat = cv2.getPerspectiveTransform(point_set_0, point_set_1)# 投影变换lic = cv2.warpPerspective(img, mat, (440, 140))return licdef main():path = os.getcwd()+"\\img\\0.jpg"# 图像预处理img, img_Gas, img_B, img_G, img_R, img_gray, img_HSV = imgProcess(path)# 初步识别img_bin = preIdentification(img_gray, img_HSV, img_B, img_R)points = fixPosition(img, img_bin)vertices, rect = findVertices(points)point_set_0, point_set_1, new_box = tiltCorrection(vertices, rect)img_draw = cv2.drawContours(img.copy(), [new_box], -1, (0,0,255), 3)lic = transform(img, point_set_0, point_set_1)# 原图上框出车牌cv2.namedWindow("Image")cv2.imshow("Image", img_draw)# 二值化图像cv2.namedWindow("Image_Bin")cv2.imshow("Image_Bin", img_bin)# 显示校正后的车牌cv2.namedWindow("Lic")cv2.imshow("Lic", lic)# 暂停、关闭窗口cv2.waitKey(0)cv2.destroyAllWindows()if __name__ == '__main__':main()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。