传统方法(OpenCV)_车道线识别
一、思路
基于OpenCV的库:对视频中的车道线进行识别
1、视频处理:视频读取
2、图像转换:图像转换为灰度图
3、噪声去除:高斯模糊对图像进行去噪,提高边缘检测的准确性
4、边缘检测:Canny算法进行边缘检测,找出图像中边缘
5、区域裁剪:定义ROI(Region of Interest,感兴趣区域),裁剪出这个区域的边缘检测结果
6、直线检测:霍夫变换对ROI区域进行直线检测,找出车道线
7、结果展示:将检测到的车道线画在原图/视频上
二、实施流程:
1. 高斯模糊、Canny边缘检测、霍夫变换
import numpy as np
import cv2blur_ksize = 5 # 高斯模糊核大小
canny_lthreshold = 50 # Canny边缘检测低阈值
canny_hthreshold = 150 # Canny边缘检测高阈值
# 霍夫变换参数
rho = 1 #rho的步长,即直线到图像原点(0,0)点的距离
theta = np.pi / 180 #theta的范围
threshold = 15 #累加器中的值高于它时才认为是一条直线
min_line_length = 40 #线的最短长度,比这个短的都被忽略
max_line_gap = 20 #两条直线之间的最大间隔,小于此值,认为是一条直线
2、定义roi_mask函数,用于保留感兴趣区域,屏蔽掉图像中不需要处理的部分,例如天空、树木等,只保留路面部分,从而提高后续处理的效率和准确性。
#img是输入的图像,verticess是兴趣区的四个点的坐标(三维的数组)
def roi_mask(img, vertices):mask = np.zeros_like(img) #生成与输入图像相同大小的图像,并使用0填充,图像为黑色mask_color = 255cv2.fillPoly(mask, vertices, mask_color) #使用白色填充多边形,形成蒙板masked_img = cv2.bitwise_and(img, mask) #img&mask,经过此操作后,兴趣区域以外的部分被蒙住了,只留下兴趣区域的图像return masked_img
3、定义draw_lines函数,用于后续对检测到的车道线进行绘制图线。
# 对图像进行画线
def draw_lines(img, lines, color=[255, 255, 0], thickness=2):for line in lines:for x1, y1, x2, y2 in line:cv2.line(img, (x1, y1), (x2, y2), color, thickness)
4、定义hough_lines函数,用于通过霍夫变换检测出图像中的直线,然后根据这些直线执行draw_lines函数画出车道线
def hough_lines(img, rho, theta, threshold,min_line_len, max_line_gap):lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]),minLineLength=min_line_len,maxLineGap=max_line_gap)line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) #生成绘制直线的绘图板,黑底# draw_lines(line_img, lines)draw_lanes(line_img, lines)return line_img
5、定义draw_lanes函数,用于根据霍夫变换检测到的直线,分类、清理、拟合、绘制出车道线
def draw_lanes(img, lines, color=[255, 255, 0], thickness=8):left_lines, right_lines = [], [] #用于存储左边和右边的直线for line in lines: #对直线进行分类for x1, y1, x2, y2 in line:k = (y2 - y1) / (x2 - x1)if k < 0:left_lines.append(line)else:right_lines.append(line)if (len(left_lines) <= 0 or len(right_lines) <= 0):return imgclean_lines(left_lines, 0.1) #弹出左侧不满足斜率要求的直线clean_lines(right_lines, 0.1) #弹出右侧不满足斜率要求的直线left_points = [(x1, y1) for line in left_lines for x1, y1, x2, y2 in line] #提取左侧直线族中的所有的第一个点left_points = left_points + [(x2, y2) for line in left_lines for x1, y1, x2, y2 in line] #提取左侧直线族中的所有的第二个点right_points = [(x1, y1) for line in right_lines for x1, y1, x2, y2 in line] #提取右侧直线族中的所有的第一个点right_points = right_points + [(x2, y2) for line in right_lines for x1, y1, x2, y2 in line] #提取右侧侧直线族中的所有的第二个点left_vtx = calc_lane_vertices(left_points, 325, img.shape[0]) #拟合点集,生成直线表达式,并计算左侧直线在图像中的两个端点的坐标right_vtx = calc_lane_vertices(right_points, 325, img.shape[0]) #拟合点集,生成直线表达式,并计算右侧直线在图像中的两个端点的坐标cv2.line(img, left_vtx[0], left_vtx[1], color, thickness) #画出左侧直线cv2.line(img, right_vtx[0], right_vtx[1], color, thickness) #画出右侧直线
6、定义clean_lines函数,用于将斜率不满足要求的直线去除,即不进行绘制
#将不满足斜率要求的直线弹出
def clean_lines(lines, threshold):slope = [(y2 - y1) / (x2 - x1) for line in lines for x1, y1, x2, y2 in line]while len(lines) > 0:mean = np.mean(slope) #计算斜率的平均值,因为后面会将直线和斜率值弹出diff = [abs(s - mean) for s in slope] #计算每条直线斜率与平均值的差值idx = np.argmax(diff) #计算差值的最大值的下标if diff[idx] > threshold: #将差值大于阈值的直线弹出slope.pop(idx) #弹出斜率lines.pop(idx) #弹出直线else:break
7、定义calc_lane_vertices函数,用于根据给定的点集拟合一条直线,并计算这条直线在图像中的两个端点的坐标
#拟合点集,生成直线表达式,并计算直线在图像中的两个端点的坐标
def calc_lane_vertices(point_list, ymin, ymax):x = [p[0] for p in point_list] #提取xy = [p[1] for p in point_list] #提取yfit = np.polyfit(y, x, 1) #用一次多项式x=a*y+b拟合这些点,fit是(a,b)fit_fn = np.poly1d(fit) #生成多项式对象a*y+bxmin = int(fit_fn(ymin)) #计算这条直线在图像中最左侧的横坐标xmax = int(fit_fn(ymax)) #计算这条直线在图像中最右侧的横坐标return [(xmin, ymin), (xmax, ymax)]
8、编写主函数。首先读取视频并获取每一帧,如果读取帧失败(即视频已经播放完毕),则跳出循环;接着对读取到的帧进行一系列处理,包括转换为灰度图、高斯模糊、Canny边缘检测、生成ROI掩膜、霍夫直线检测等;然后将处理后的图像与原图融合,得到最终的结果;最后显示结果图像,如果按下Esc键,则跳出循环,即关闭所有窗口
if __name__ == '__main__':try:cap = cv2.VideoCapture('./video_1.mp4')if (cap.isOpened()): # 视频打开成功flag = 1else:flag = 0num = 0if (flag):while (True):ret,frame = cap.read() # 读取一帧if ret == False: # 读取帧失败breakgray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) #图像转换为灰度图blur_gray = cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 0, 0) #使用高斯模糊去噪声edges = cv2.Canny(blur_gray, canny_lthreshold, canny_hthreshold) #使用Canny进行边缘检测roi_vtx = np.array([[(0, frame.shape[0]), (460, 325),(520, 325), (frame.shape[1], frame.shape[0])]]) ##目标区域的四个点坐标,roi_vtx是一个三维的数组roi_edges = roi_mask(edges, roi_vtx) #对边缘检测的图像生成图像蒙板,去掉不感兴趣的区域,保留兴趣区line_img = hough_lines(roi_edges, rho, theta, threshold,min_line_length, max_line_gap) #使用霍夫直线检测,并且绘制直线res_img = cv2.addWeighted(frame, 0.8, line_img, 1, 0) #将处理后的图像与原图做融合cv2.imshow('meet',res_img)if cv2.waitKey(30) & 0xFF == 27:breakcv2.waitKey(0)cv2.destroyAllWindows()except:pass
# 使用环境dlcv/001#1、
import numpy as np
import cv2blur_ksize = 5 # 高斯模糊核大小
canny_lthreshold = 50 # Canny边缘检测低阈值
canny_hthreshold = 150 # Canny边缘检测高阈值
# 霍夫变换参数
rho = 1 # rho的步长,即直线到图像原点(0,0)点的距离
theta = np.pi / 180 # theta的范围
threshold = 15 # 累加器中的值高于它时才认为是一条直线
min_line_length = 40 # 线的最短长度,比这个短的都被忽略
max_line_gap = 20 # 两条直线之间的最大间隔,小于此值,认为是一条直线#2、
#img是输入的图像,verticess是兴趣区的四个点的坐标(三维的数组)
def roi_mask(img, vertices):mask = np.zeros_like(img) #生成与输入图像相同大小的图像,并使用0填充,图像为黑色mask_color = 255cv2.fillPoly(mask, vertices, mask_color) #使用白色填充多边形,形成蒙板masked_img = cv2.bitwise_and(img, mask) #img&mask,经过此操作后,兴趣区域以外的部分被蒙住了,只留下兴趣区域的图像return masked_img#3、
# 对图像进行画线
def draw_lines(img, lines, color=[255, 255, 0], thickness=2):for line in lines:for x1, y1, x2, y2 in line:cv2.line(img, (x1, y1), (x2, y2), color, thickness)#4、
def hough_lines(img, rho, theta, threshold,min_line_len, max_line_gap):lines = cv2.HoughLinesP(img, rho, theta, threshold, np.array([]),minLineLength=min_line_len,maxLineGap=max_line_gap)line_img = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8) #生成绘制直线的绘图板,黑底# draw_lines(line_img, lines)draw_lanes(line_img, lines)return line_img#5、
def draw_lanes(img, lines, color=[255, 255, 0], thickness=8):left_lines, right_lines = [], [] # 用于存储左边和右边的直线for line in lines: # 对直线进行分类for x1, y1, x2, y2 in line:k = (y2 - y1) / (x2 - x1)if k < 0:left_lines.append(line)else:right_lines.append(line)if (len(left_lines) <= 0 or len(right_lines) <= 0):return imgclean_lines(left_lines, 0.1) # 弹出左侧不满足斜率要求的直线clean_lines(right_lines, 0.1) # 弹出右侧不满足斜率要求的直线left_points = [(x1, y1) for line in left_lines for x1, y1, x2, y2 in line] # 提取左侧直线族中的所有的第一个点left_points = left_points + [(x2, y2) for line in left_lines for x1, y1, x2, y2 in line] # 提取左侧直线族中的所有的第二个点right_points = [(x1, y1) for line in right_lines for x1, y1, x2, y2 in line] # 提取右侧直线族中的所有的第一个点right_points = right_points + [(x2, y2) for line in right_lines for x1, y1, x2, y2 in line] # 提取右侧侧直线族中的所有的第二个点left_vtx = calc_lane_vertices(left_points, 325, img.shape[0]) # 拟合点集,生成直线表达式,并计算左侧直线在图像中的两个端点的坐标right_vtx = calc_lane_vertices(right_points, 325, img.shape[0]) # 拟合点集,生成直线表达式,并计算右侧直线在图像中的两个端点的坐标cv2.line(img, left_vtx[0], left_vtx[1], color, thickness) # 画出左侧直线cv2.line(img, right_vtx[0], right_vtx[1], color, thickness) # 画出右侧直线#6、
#将不满足斜率要求的直线弹出
def clean_lines(lines, threshold):slope = [(y2 - y1) / (x2 - x1) for line in lines for x1, y1, x2, y2 in line]while len(lines) > 0:mean = np.mean(slope) #计算斜率的平均值,因为后面会将直线和斜率值弹出diff = [abs(s - mean) for s in slope] #计算每条直线斜率与平均值的差值idx = np.argmax(diff) #计算差值的最大值的下标if diff[idx] > threshold: #将差值大于阈值的直线弹出slope.pop(idx) #弹出斜率lines.pop(idx) #弹出直线else:break#7、
#拟合点集,生成直线表达式,并计算直线在图像中的两个端点的坐标
def calc_lane_vertices(point_list, ymin, ymax):x = [p[0] for p in point_list] #提取xy = [p[1] for p in point_list] #提取yfit = np.polyfit(y, x, 1) #用一次多项式x=a*y+b拟合这些点,fit是(a,b)fit_fn = np.poly1d(fit) #生成多项式对象a*y+bxmin = int(fit_fn(ymin)) #计算这条直线在图像中最左侧的横坐标xmax = int(fit_fn(ymax)) #计算这条直线在图像中最右侧的横坐标return [(xmin, ymin), (xmax, ymax)]#8、
if __name__ == '__main__':try:cap = cv2.VideoCapture('1.mp4')if (cap.isOpened()): # 视频打开成功flag = 1else:flag = 0num = 0if (flag):while (True):ret,frame = cap.read() # 读取一帧if ret == False: # 读取帧失败breakgray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) #图像转换为灰度图blur_gray = cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 0, 0) #使用高斯模糊去噪声edges = cv2.Canny(blur_gray, canny_lthreshold, canny_hthreshold) #使用Canny进行边缘检测roi_vtx = np.array([[(0, frame.shape[0]), (460, 325),(520, 325), (frame.shape[1], frame.shape[0])]]) ##目标区域的四个点坐标,roi_vtx是一个三维的数组roi_edges = roi_mask(edges, roi_vtx) #对边缘检测的图像生成图像蒙板,去掉不感兴趣的区域,保留兴趣区line_img = hough_lines(roi_edges, rho, theta, threshold,min_line_length, max_line_gap) #使用霍夫直线检测,并且绘制直线res_img = cv2.addWeighted(frame, 0.8, line_img, 1, 0) #将处理后的图像与原图做融合cv2.imshow('meet',res_img)if cv2.waitKey(30) & 0xFF == 27:breakcv2.waitKey(0)cv2.destroyAllWindows()except:pass
# 使用环境dlcv/001from moviepy.editor import VideoFileClip
import cv2
import numpy as np
# 高斯滤波核大小
blur_ksize = 5
# Canny边缘检测高低阈值
canny_lth = 50
canny_hth = 150
# 霍夫变换参数
rho = 1
theta = np.pi / 180
threshold = 15
min_line_len = 40
max_line_gap = 20
def process_an_image(img):# 1. 灰度化、滤波和Cannygray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)blur_gray = cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 1)edges = cv2.Canny(blur_gray, canny_lth, canny_hth)# 2. 标记四个坐标点用于ROI截取rows, cols = edges.shapepoints = np.array([[(0, rows), (460, 325), (520, 325), (cols, rows)]])# [[[0 540], [460 325], [520 325], [960 540]]]roi_edges = roi_mask(edges, points)# 3. 霍夫直线提取drawing, lines = hough_lines(roi_edges, rho, theta,threshold, min_line_len, max_line_gap)# 4. 车道拟合计算draw_lanes(drawing, lines)# 5. 最终将结果合在原图上result = cv2.addWeighted(img, 0.9, drawing, 0.2, 0)return result
def roi_mask(img, corner_points):# 创建掩膜mask = np.zeros_like(img)cv2.fillPoly(mask, corner_points, 255)masked_img = cv2.bitwise_and(img, mask)return masked_img
def hough_lines(img, rho, theta, threshold, min_line_len, max_line_gap):# 统计概率霍夫直线变换lines = cv2.HoughLinesP(img, rho, theta, threshold,minLineLength=min_line_len, maxLineGap=max_line_gap)# 新建一副空白画布drawing = np.zeros((img.shape[0], img.shape[1], 3), dtype=np.uint8)# 画出直线检测结果# draw_lines(drawing, lines)return drawing, lines
def draw_lines(img, lines, color=[0, 0, 255], thickness=1):for line in lines:for x1, y1, x2, y2 in line:cv2.line(img, (x1, y1), (x2, y2), color, thickness)
def draw_lanes(img, lines, color=[255, 0, 0], thickness=8):# a. 划分左右车道left_lines, right_lines = [], []for line in lines:for x1, y1, x2, y2 in line:k = (y2 - y1) / (x2 - x1)if k < 0:left_lines.append(line)else:right_lines.append(line)if (len(left_lines) <= 0 or len(right_lines) <= 0):return# b. 清理异常数据clean_lines(left_lines, 0.1)clean_lines(right_lines, 0.1)# c. 得到左右车道线点的集合,拟合直线left_points = [(x1, y1) for line in left_lines for x1, y1, x2, y2 in line]left_points = left_points + [(x2, y2)for line in left_lines for x1, y1, x2, y2 in line]right_points = [(x1, y1)for line in right_lines for x1, y1, x2, y2 in line]right_points = right_points + \[(x2, y2) for line in right_lines for x1, y1, x2, y2 in line]left_results = least_squares_fit(left_points, 325, img.shape[0])right_results = least_squares_fit(right_points, 325, img.shape[0])# 注意这里点的顺序vtxs = np.array([[left_results[1], left_results[0], right_results[0], right_results[1]]])# d.填充车道区域cv2.fillPoly(img, vtxs, (0, 255, 0))# 或者只画车道线# cv2.line(img, left_results[0], left_results[1], (0, 255, 0), thickness)# cv2.line(img, right_results[0], right_results[1], (0, 255, 0), thickness)
def clean_lines(lines, threshold):# 迭代计算斜率均值,排除掉与差值差异较大的数据slope = [(y2 - y1) / (x2 - x1)for line in lines for x1, y1, x2, y2 in line]while len(lines) > 0:mean = np.mean(slope)diff = [abs(s - mean) for s in slope]idx = np.argmax(diff)if diff[idx] > threshold:slope.pop(idx)lines.pop(idx)else:break
def least_squares_fit(point_list, ymin, ymax):# 最小二乘法拟合x = [p[0] for p in point_list]y = [p[1] for p in point_list]# polyfit第三个参数为拟合多项式的阶数,所以1代表线性fit = np.polyfit(y, x, 1)fit_fn = np.poly1d(fit) # 获取拟合的结果xmin = int(fit_fn(ymin))xmax = int(fit_fn(ymax))return [(xmin, ymin), (xmax, ymax)]# 主函数:
if __name__ == "__main__":output = 'output4.mp4'# cap = cv2.VideoCapture('3.mp4')clip = VideoFileClip("4.mp4")out_clip = clip.fl_image(process_an_image)out_clip.write_videofile(output, audio=False)# #8、
# if __name__ == '__main__':
# try:
# cap = cv2.VideoCapture('3.mp4')
# if (cap.isOpened()): # 视频打开成功
# flag = 1
# else:
# flag = 0
# num = 0
# if (flag):
# while (True):
# ret,frame = cap.read() # 读取一帧
# if ret == False: # 读取帧失败
# break# gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) #图像转换为灰度图# blur_gray = cv2.GaussianBlur(gray, (blur_ksize, blur_ksize), 0, 0) #使用高斯模糊去噪声# edges = cv2.Canny(blur_gray, canny_lthreshold, canny_hthreshold) #使用Canny进行边缘检测# roi_vtx = np.array([[(0, frame.shape[0]), (460, 325),# (520, 325), (frame.shape[1], frame.shape[0])]]) ##目标区域的四个点坐标,roi_vtx是一个三维的数组# roi_edges = roi_mask(edges, roi_vtx) #对边缘检测的图像生成图像蒙板,去掉不感兴趣的区域,保留兴趣区# line_img = hough_lines(roi_edges, rho, theta, threshold,# min_line_length, max_line_gap) #使用霍夫直线检测,并且绘制直线# res_img = cv2.addWeighted(frame, 0.8, line_img, 1, 0) #将处理后的图像与原图做融合# cv2.imshow('meet',res_img)# if cv2.waitKey(30) & 0xFF == 27:# break# cv2.waitKey(0)# cv2.destroyAllWindows()# except:# pass
相关文章:
传统方法(OpenCV)_车道线识别
一、思路 基于OpenCV的库:对视频中的车道线进行识别 1、视频处理:视频读取 2、图像转换:图像转换为灰度图 3、噪声去除:高斯模糊对图像进行去噪,提高边缘检测的准确性 4、边缘检测:Canny算法进行边缘检测…...
Git以及Gitlab的快速使用文档
优质博文:IT-BLOG-CN 安装git 【1】Windows为例,去百度下载安装包。或者去官网下载。安装过秳返里略过,一直下一步即可。丌要忉记设置环境发量。 【2】打开cmd,输入git –version正确输出版本后则git安装成功。 配置ssh Git和s…...
MyBatis Interceptor拦截器高级用法
拦截插入操作 场景描述:插入当前数据时,同时复制当前数据插入多行。比如平台权限的用户,可以同时给其他国家级别用户直接插入数据 实现: import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.Executor; impor…...
Python学习入门(2)——进阶功能
14. 迭代器和迭代协议 在Python中,迭代器是支持迭代操作的对象,即它们可以一次返回其成员中的一个。任何实现了 __iter__() 和 __next__() 方法的对象都是迭代器。 class Count:def __init__(self, low, high):self.current lowself.high highdef __i…...
华为改进点
华为公司可以在员工福利方面做出改进,提高员工的工作满意度和忠诚度。例如,可以增加员工福利,如提供更多灵活的工作时间、提供更好的培训和发展机会、加大健康保障和福利待遇等。 此外,华为公司也可以加强与客户的沟通与合作&…...
分布式技术---------------消息队列中间件之 Kafka
目录 一、Kafka 概述 1.1为什么需要消息队列(MQ) 1.2使用消息队列的好处 1.2.1解耦 1.2.2可恢复性 1.2.3缓冲 1.2.4灵活性 & 峰值处理能力 1.2.5异步通信 1.3消息队列的两种模式 1.3.1点对点模式(一对一,消费者主动…...
BGP扩展知识总结
一、BGP的宣告问题 在BGP协议中每台运行BGP的设备上,宣告本地直连路由在BGP协议中运行BGP协议的设备,来宣告通过IGP学习到的未运行BGP协议设备产生的路由;(常见) 在BGP协议中宣告本地路由表中路由条目时,将…...
华为OD-C卷-按身高和体重排队[100分]
题目描述 某学校举行运动会,学生们按编号(1、2、3…n)进行标识,现需要按照身高由低到高排列,对身高相同的人,按体重由轻到重排列;对于身高体重都相同的人,维持原有的编号顺序关系。请输出排列后的学生编号…...
云原生(八)、Kubernetes基础(一)
K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…...
Linux 系统解压缩文件
Linux系统,可以使用unzip命令来解压zip文件 方法如下 1. 打开终端,在命令行中输入以下命令来安装unzip: sudo apt-get install unzip 1 2. 假设你想要将zip文件解压缩到名为"target_dir"的目录中,在终端中切换到目标路…...
linux如何使 CPU使用率保持在指定百分比?
目录 方法1:(固定在100%) 方法2:(可以指定0~100%) 方法3:使用ChaosBlade工具(0~100%) 方法1:(固定在100%) for i in seq 1 $(cat /pro…...
LLMs之Morphic:Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略
LLMs之Morphic:Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略 目录 Morphic的简介 1、技术栈 Morphic的安装和使用方法 1、克隆仓库 2、安装依赖 3、填写密钥 4、本地运行应用 部署 Morphic的简介 2024年4月初发布ÿ…...
[react] useState的一些小细节
1.无限循环 因为setState修改是异步的,加上会触发函数重新渲染, 如果代码长这样 一秒再修改,然后重新触发setTImeout, 然后再触发,重复触发循环 如果这样呢 还是会,因为你执行又会重新渲染 2.异步修改数据 为什么修改多次还是跟不上呢? 函数传参解决 因为是异步修改 ,所以…...
蓝桥杯【第15届省赛】Python B组
这题目难度对比历届是相当炸裂的简单了…… A:穿越时空之门 【问题描述】 随着 2024 年的钟声回荡,传说中的时空之门再次敞开。这扇门是一条神秘的通道,它连接着二进制和四进制两个不同的数码领域,等待着勇者们的探索。 在二进制…...
CSS aspect-ratio属性设置元素宽高比
aspect-ratio 是CSS的一个属性,用于设置元素的期望宽高比。它设置确保元素保持特定的比例,不受其内容或容器大小的影响。 语法: aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠(/)分隔的两个数字&…...
Jones矩阵符号运算
文章目录 Jones向量Jones矩阵 有关Jones矩阵、Jones向量的基本原理,可参考这个: 通过Python理解Jones矩阵,本文主要介绍sympy中提供的有关偏振光学的符号计算工具 Jones向量 Jones向量是描述光线偏振状态的重要工具,例如一个偏振…...
解决 App 自动化测试的常见痛点!
App 自动化测试中有些常见痛点问题,如果框架不能很好的处理,就可能出现元素定位超时找不到的情况,自动化也就被打断终止了。很容易打消做自动化的热情,导致从入门到放弃。比如下面的两个问题: 一是 App 启动加载时间较…...
2016NOIP普及组真题 1. 买铅笔
线上OJ: 一本通:http://ybt.ssoier.cn:8088/problem_show.php?pid1973 核心思想: 向上取整的代码 (m (n-1))/n 。(本题考点与2023年J组的第一和第二题一样) 比如需要买31支笔,每包30支,则需要…...
机器学习—数据集(二)
1可用数据集 公司内部 eg:百度 数据接口 花钱 数据集 学习阶段可用的数据集: sklearn:数据量小,方便学习kaggle:80万科学数据,真实数据,数据量大UCI:收录了360个数据集,覆盖科学、生活、经济等…...
华为S5735S核心交换配置实例
以下脚本实现创建vlan2,3,IP划分,DHCP启用,接口划分,ssh,telnet,http,远程登录启用 默认用户创建admin/admin123提示首次登录需要更改用户密码S5735产品手册更多功能配置,移步官网参考手册配置 system-viewsysname t…...
Mysql主从复制安装配置
mysql主从复制安装配置 1、基础设置准备 #操作系统: centos6.5 #mysql版本: 5.7 #两台虚拟机: node1:192.168.85.111(主) node2:192.168.85.112(从)2、安装mysql数据库 #详细安装和卸载的步骤…...
【刷题】图论——最小生成树:Prim、Kruskal【模板】
假设有n个点m条边。 Prim适用于邻接矩阵存的稠密图,时间复杂度是 O ( n 2 ) O(n^2) O(n2),可用堆优化成 O ( n l o g n ) O(nlogn) O(nlogn)。 Kruskal适用于稀疏图,n个点m条边,时间复杂度是 m l o g ( m ) mlog(m) mlog(m)。 Pr…...
使用uniapp实现小程序获取wifi并连接
Wi-Fi功能模块 App平台由 uni ext api 实现,需下载插件:uni-WiFi 链接:https://ext.dcloud.net.cn/plugin?id10337 uni ext api 需 HBuilderX 3.6.8 iOS平台获取Wi-Fi信息需要开启“Access WiFi information”能力登录苹果开发者网站&…...
回忆杀之手搓当年搓过的Transformer
整体代码 import mathimport paddle import paddle.nn as nn import paddle.nn.functional as Fclass MaskMultiHeadAttention(nn.Layer):def __init__(self, hidden_size, num_heads):super(MaskMultiHeadAttention, self).__init__()assert hidden_size % num_heads 0, &qu…...
【AR】使用深度API实现虚实遮挡
遮挡效果 本段描述摘自 https://developers.google.cn/ar/develop/depth 遮挡是深度API的应用之一。 遮挡(即准确渲染虚拟物体在现实物体后面)对于沉浸式 AR 体验至关重要。 参考下图,假设场景中有一个Andy,用户可能需要放置在包含…...
python-pytorch实现skip-gram 0.5.001
python-pytorch实现skip-gram 0.5.000 数据加载、切词准备训练数据准备模型和参数训练保存模型加载模型简单预测获取词向量画一个词向量的分布图使用词向量计算相似度参考数据加载、切词 按照链接https://blog.csdn.net/m0_60688978/article/details/137538274操作后,可以获得…...
C语言:约瑟夫环问题详解
前言 哈喽,宝子们!本期为大家带来一道C语言循环链表的经典算法题(约瑟夫环)。 目录 1.什么是约瑟夫环2.解决方案思路3.创建链表头结点4.创建循环链表5.删除链表6.完整代码实现 1.什么是约瑟夫环 据说著名历史学家Josephus有过以下…...
【刷题篇】回溯算法(二)
文章目录 1、求根节点到叶节点数字之和2、二叉树剪枝3、验证二叉搜索树4、二叉搜索树中第K小的元素5、二叉树的所有路径 1、求根节点到叶节点数字之和 给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表…...
Windows系统本地部署Jupyter Notebook并实现公网访问编辑笔记
文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下载安装2.2 Jupyter Notebook的配置2.3 Cpolar下载安装 3.Cpolar端口设置3.1 Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 在数据分析工作中,使用最多的无疑就是各种函数、图表、…...
自动化运维(二十七)Ansible 实战Shell 插件和模块工具
Ansible 支持多种类型的插件,这些插件可以帮助你扩展和定制 Ansible 的功能。每种插件类型都有其特定的用途和应用场景。今天我们一起学习Shell 插件和模块工具。 一、 Shell 插件 Ansible shell 插件决定了 Ansible 如何在远程系统上执行命令。这些插件非常关键&a…...
沈阳思路网站制作/企业网站seo多少钱
c语言程序设计课程设计报告gysC 语言程序设计课程设计材料C语言程序设计课程设计报告学生姓名: 钱朝政 学 号: 131408115系 (院): 信息工程学院专 业: 物联网工程设计(论 )题目: 职工信息管理系统完成日期: 2013年12月30 日&#…...
wordpress3.7.1下载/成品视频直播软件推荐哪个好用
命令格式: ssh 用户名IP 示例: ssh root192.168.1.10 回车,然后根据提示输入登陆密码即可。转载于:https://www.cnblogs.com/chengyujia/p/10730161.html...
网页设计与网站建设项目教程/成都百度推广开户公司
网络通信、文件存储中经常需要交换数据,为了减少网络通信流量、文件存储大小以及加密通信规则,经常需要对数据进行双向加解密以保证数据的安全。PHP中实现此功能主要需要使用的函数主要是pack及unpack函数pack压缩资料到位字符串之中。语法: string pack…...
福州手机模板建站/淘宝关键词指数查询
文章目录前言一、多人音视频对话1.wxml2.js前言 微信小程序开发多人音视频对话首先得去小程序管理后台,「开发」-「接口设置」中自助开通该组件权限。 相关属性: 一级类目/主体类型二级类目小程序内容场景教育在线视频课程网课、在线培训、讲座等教育…...
汕头免费建设网站制作/百度网盘app怎么打开链接
👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇转自 | 募格学术参考资料 | 抖音陈见夏夏(求关注版、秒闻视频、募格学术读者投稿、留言、微博、知乎等。试问谁没有为导师的论文批注心跳加速过呢…...
网站开发移动端多少钱/网站平台如何推广
帧中继( Frame Relay)是一种用于连接计算机系统的面向分组的通信方法。它主要用在公共或专用网上的局域网互联以及广域网连接。大多数公共电信局都提供帧中继服务,把它作为建立高性能的虚拟广域连接的一种途径。1.实验器材3台思科路由器 3台…...