当前位置: 首页 > news >正文

传统方法(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的库&#xff1a;对视频中的车道线进行识别 1、视频处理&#xff1a;视频读取 2、图像转换&#xff1a;图像转换为灰度图 3、噪声去除&#xff1a;高斯模糊对图像进行去噪&#xff0c;提高边缘检测的准确性 4、边缘检测&#xff1a;Canny算法进行边缘检测…...

Git以及Gitlab的快速使用文档

优质博文&#xff1a;IT-BLOG-CN 安装git 【1】Windows为例&#xff0c;去百度下载安装包。或者去官网下载。安装过秳返里略过&#xff0c;一直下一步即可。丌要忉记设置环境发量。 【2】打开cmd&#xff0c;输入git –version正确输出版本后则git安装成功。 配置ssh Git和s…...

MyBatis Interceptor拦截器高级用法

拦截插入操作 场景描述&#xff1a;插入当前数据时&#xff0c;同时复制当前数据插入多行。比如平台权限的用户&#xff0c;可以同时给其他国家级别用户直接插入数据 实现&#xff1a; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.Executor; impor…...

Python学习入门(2)——进阶功能

14. 迭代器和迭代协议 在Python中&#xff0c;迭代器是支持迭代操作的对象&#xff0c;即它们可以一次返回其成员中的一个。任何实现了 __iter__() 和 __next__() 方法的对象都是迭代器。 class Count:def __init__(self, low, high):self.current lowself.high highdef __i…...

华为改进点

华为公司可以在员工福利方面做出改进&#xff0c;提高员工的工作满意度和忠诚度。例如&#xff0c;可以增加员工福利&#xff0c;如提供更多灵活的工作时间、提供更好的培训和发展机会、加大健康保障和福利待遇等。 此外&#xff0c;华为公司也可以加强与客户的沟通与合作&…...

分布式技术---------------消息队列中间件之 Kafka

目录 一、Kafka 概述 1.1为什么需要消息队列&#xff08;MQ&#xff09; 1.2使用消息队列的好处 1.2.1解耦 1.2.2可恢复性 1.2.3缓冲 1.2.4灵活性 & 峰值处理能力 1.2.5异步通信 1.3消息队列的两种模式 1.3.1点对点模式&#xff08;一对一&#xff0c;消费者主动…...

BGP扩展知识总结

一、BGP的宣告问题 在BGP协议中每台运行BGP的设备上&#xff0c;宣告本地直连路由在BGP协议中运行BGP协议的设备&#xff0c;来宣告通过IGP学习到的未运行BGP协议设备产生的路由&#xff1b;&#xff08;常见&#xff09; 在BGP协议中宣告本地路由表中路由条目时&#xff0c;将…...

华为OD-C卷-按身高和体重排队[100分]

题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b;对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生编号…...

云原生(八)、Kubernetes基础(一)

K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间&#xff0c;以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…...

Linux 系统解压缩文件

Linux系统&#xff0c;可以使用unzip命令来解压zip文件 方法如下 1. 打开终端&#xff0c;在命令行中输入以下命令来安装unzip&#xff1a; sudo apt-get install unzip 1 2. 假设你想要将zip文件解压缩到名为"target_dir"的目录中&#xff0c;在终端中切换到目标路…...

linux如何使 CPU使用率保持在指定百分比?

目录 方法1&#xff1a;&#xff08;固定在100%&#xff09; 方法2&#xff1a;&#xff08;可以指定0~100%&#xff09; 方法3&#xff1a;使用ChaosBlade工具&#xff08;0~100%&#xff09; 方法1&#xff1a;&#xff08;固定在100%&#xff09; for i in seq 1 $(cat /pro…...

LLMs之Morphic:Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略

LLMs之Morphic&#xff1a;Morphic(一款具有生成式用户界面的人工智能答案引擎)的简介、安装、使用方法之详细攻略 目录 Morphic的简介 1、技术栈 Morphic的安装和使用方法 1、克隆仓库 2、安装依赖 3、填写密钥 4、本地运行应用 部署 Morphic的简介 2024年4月初发布&#xff…...

[react] useState的一些小细节

1.无限循环 因为setState修改是异步的,加上会触发函数重新渲染, 如果代码长这样 一秒再修改,然后重新触发setTImeout, 然后再触发,重复触发循环 如果这样呢 还是会,因为你执行又会重新渲染 2.异步修改数据 为什么修改多次还是跟不上呢? 函数传参解决 因为是异步修改 ,所以…...

蓝桥杯【第15届省赛】Python B组

这题目难度对比历届是相当炸裂的简单了…… A&#xff1a;穿越时空之门 【问题描述】 随着 2024 年的钟声回荡&#xff0c;传说中的时空之门再次敞开。这扇门是一条神秘的通道&#xff0c;它连接着二进制和四进制两个不同的数码领域&#xff0c;等待着勇者们的探索。 在二进制…...

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…...

Jones矩阵符号运算

文章目录 Jones向量Jones矩阵 有关Jones矩阵、Jones向量的基本原理&#xff0c;可参考这个&#xff1a; 通过Python理解Jones矩阵&#xff0c;本文主要介绍sympy中提供的有关偏振光学的符号计算工具 Jones向量 Jones向量是描述光线偏振状态的重要工具&#xff0c;例如一个偏振…...

解决 App 自动化测试的常见痛点!

App 自动化测试中有些常见痛点问题&#xff0c;如果框架不能很好的处理&#xff0c;就可能出现元素定位超时找不到的情况&#xff0c;自动化也就被打断终止了。很容易打消做自动化的热情&#xff0c;导致从入门到放弃。比如下面的两个问题&#xff1a; 一是 App 启动加载时间较…...

2016NOIP普及组真题 1. 买铅笔

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1973 核心思想&#xff1a; 向上取整的代码 (m (n-1))/n 。&#xff08;本题考点与2023年J组的第一和第二题一样&#xff09; 比如需要买31支笔&#xff0c;每包30支&#xff0c;则需要…...

机器学习—数据集(二)

1可用数据集 公司内部 eg:百度 数据接口 花钱 数据集 学习阶段可用的数据集&#xff1a; sklearn:数据量小&#xff0c;方便学习kaggle&#xff1a;80万科学数据&#xff0c;真实数据&#xff0c;数据量大UCI&#xff1a;收录了360个数据集&#xff0c;覆盖科学、生活、经济等…...

华为S5735S核心交换配置实例

以下脚本实现创建vlan2,3&#xff0c;IP划分&#xff0c;DHCP启用&#xff0c;接口划分&#xff0c;ssh,telnet,http,远程登录启用 默认用户创建admin/admin123提示首次登录需要更改用户密码S5735产品手册更多功能配置&#xff0c;移步官网参考手册配置 system-viewsysname t…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...