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

carla中lka实现(一)

前言:

对于之前项目中工作内容进行总结,使用Carla中的车辆进行lka算法调试,整体技术路线:

①在Carla中生成车辆,并在车辆上搭载camera,通过camera采集图像数据;

②使用图像处理lka算法,对于camera数据进行计算分析;

③对于分析的结果输出为偏移图像中心的线的距离,并以这个距离做为车辆控制方向盘的数值。

其中第一步比较简单,不做记录,从第二步,lka算法实现开始。

需要对于输入的图像进行边缘检测提取出车道线

一、边缘检测

车道线一般为黄线和白线,与车道线旁的公路的颜色有很大的差异,通过这种差异,就是车道线与公路之间颜色变化,可以找到车道线的边缘,找到这个边缘的过程为边缘检测。

1.1 使用sobel进行边缘检测

直接使用cv2中Sobel包来进行边缘检测:

测试源码如下:

def abs_sobel_thresh(image,orient='x',sobel_kernel=3,thresh=(0,255)):# generating the gray image.gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)# 计算x方向和y方向的梯度上强度值的图像if orient == 'x':abs_sobel = np.absolute(cv2.Sobel(gray,cv2.CV_64F,1,0,ksize=sobel_kernel))if orient == 'y':abs_sobel = np.absolute(cv2.Sobel(gray,cv2.CV_64F,0,1,ksize=sobel_kernel))# 利用归一化获得scaled_sobel = np.uint8(255*abs_sobel/np.max(abs_sobel))# 创建出一个同尺寸的数组grad_binary = np.zeros_like(scaled_sobel)grad_binary[ ( scaled_sobel >= thresh[0] ) & ( scaled_sobel <= thresh[1] ) ] = 1return grad_binary

主要功能实现在abs_sobel_thresh函数中,

首先使用cv2.cvtColor函数将原始图像转化为灰度图,

然后计算x方向和y方向上的梯度强度值上的图像,

利用归一化获得一个数组,这个数组记录了图像中所有的点的强度值,然后新建一个同样size的图像数组,将数组中强度信息在0到255之间的值设置为1。

输出x和y方向梯度的图像对比:

    ksize = 15gradx = abs_sobel_thresh(image,orient='x',sobel_kernel=ksize,thresh=(50,180))grady = abs_sobel_thresh(image,orient='y',sobel_kernel=ksize,thresh=(30,90))fig1 = plt.figure()plt.imshow(gradx,cmap="gray")fig2 = plt.figure()plt.imshow(grady,cmap="gray")plt.show()

1.2 使用颜色阈值检测

使用图像中的rgb中不同数字进行检测提取。

def rgb_select(img,r_thresh,g_thresh,b_thresh):r_channel = img[:,:,0]g_channel = img[:,:,1]b_channel = img[:,:,2]r_binary = np.zeros_like(r_channel)r_binary[(r_channel > r_thresh[0]) & (r_channel <= r_thresh[1])] = 1g_binary = np.zeros_like(g_channel)g_binary[(g_channel > g_thresh[0]) & (g_channel <= g_thresh[1])] = 1b_binary = np.zeros_like(b_channel)b_binary[(b_channel > b_thresh[0]) & (b_channel <= b_thresh[1])] = 1#combined = np.zeros_like(r_channel)combined[((r_binary == 1) & (g_binary == 1) & (b_binary == 1))] = 1return combined

在函数rbg_select中分别划分不同的rgb通道的数组,然后创建不同的新的数组,并将符合阈值内的点设置为1,最后将它们合并起来输出为图像combined。

 1.3 融合sobel和rgb的边缘检测

就是将两个图像中值为1的合并起来,容易实现。

def color_gradient_threshold(image):ksize = 15gradx = abs_sobel_thresh(image,orient='x',sobel_kernel=ksize,thresh=(50,180))rgb_binary = rgb_select(image,r_thresh=(225,255),g_thresh=(180,255),b_thresh=(0,255))combined_binary = np.zeros_like(image)combined_binary[((gradx==1)|(rgb_binary==1))] = 255color_binary = combined_binaryreturn color_binary

 1.4 小结

边缘检测效果完成,因为是基于Carla做的车道线边缘检测,而Carla中输出的图像输出的效果比较理想,所以直接使用sobel和rgb边缘检测融合就可以达到很好的效果所以没有做过多的研究,实际情况比较复杂可能并不适用。

二、选择车道线的区域

这里要注意用数组表示图像的时候原点一般是左上角,向右为x轴正方向,向下为y轴正方向。

所以先选择出左下角,右下角:

    ksize = 15img_color = color_gradient_threshold(image)left_bottom = [0, img_color.shape[0]]right_bottom = [img_color.shape[1],img_color.shape[0]]

选择另外一个顶点:

    apex = [ img_color.shape[1]/2, 420 ]vertices = np.array([ left_bottom, right_bottom, apex ],np.int32)

其中vertices存储的是三个点,分别是左下角、右下角和顶点。

接下来使用刚刚选择的点与边缘检测后的图像按位与得到选择车道线的区域:

def region_of_interest(img,vertices):mask = np.zeros_like(img)cv2.fillPoly(mask,[vertices],[255,255,255])masked_image = cv2.bitwise_and(img,mask)return masked_image

其中函数fillPoly函数第一个参数表示为原始图像,第二个参数为选择的点,第三个参数表示为赋值为白色。

而bitwise_and是将两个参数按位与。

最后输出按位与后的图像。

 效果还可以。

三、投影变换

将原先小的三角形区域利用投影变换成大的区域。

主要运用cv中的透视变换:

def perspective_transform(image):# give 4 points as original coordinates.top_left =[590,460]top_right = [750,460]bottom_left = [330,650]bottom_right =  [1130,650]# give 4 points to project.proj_top_left = [250,100]proj_top_right = [1150,100]proj_bottom_left  =  [330,650]proj_bottom_right =  [1130,650]# to get image size.img_size = (image.shape[1],image.shape[0])# pts1 = np.float32([top_left,top_right,bottom_left,bottom_right])pts2 = np.float32([proj_top_left,proj_top_right,proj_bottom_left,proj_bottom_right])matrix_K = cv2.getPerspectiveTransform(pts1,pts2)img_k = cv2.warpPerspective(image,matrix_K,img_size)return img_k

先划定四个点分别是左上、右上、左下和右下,为原始图像区域,

在划定投影区域。

运用函数getPerspectiveTransform它的第一个参数为平面1,第二个参数为平面2,求出平面1上的点要映射到平面2上所需要的变换的矩阵。

函数warpPerspective它的第一个参数为原始图像,第二个参数为投影变换矩阵,第三个参数为输出图像的大小,这里使用的就是原始图像的大小,需要注意一般为宽在前,长在后。

最后输出的就是变换后的图像信息。

 四、车道线提取

4.1 直方图显示

使用直方图来显示前面拉伸后的图像信息。

def histogram_img(image):histogram_binary = np.zeros((image.shape[0],image.shape[1]),dtype=np.int)histogram_binary[image[:,:,0]>0] = 1histogram = np.sum(histogram_binary[:,:],axis=0)print("histogram: ",histogram)print("histogram shape: ",histogram.shape)return histogram 

代码比较容易理解,设置一个同输入图像同尺寸的数组,将原来图像中任一rgb信息大于0的位置赋值为1,其实设置为255也可以,因为前面设置的就是255。之后就将它按列累加起来,返回这一行累加的数组(1*n)。

 4.2 车道线定位

获得的前面的直方图后,求出它的两个波峰的位置来获得车道线的大概位置。

def lane_position(histogram):histogram_size = histogram.shapemiddle_point = int(histogram_size[0]/2)print("middle_point: ",middle_point)#left_point = [0,0]for i in range(middle_point):# 寻找直方图中的波峰即顶点if histogram[i] > left_point[1]:left_point[1] = histogram[i]left_point[0] = i#right_point = [0,0]for j in range(middle_point,histogram_size[0]):if histogram[j] > right_point[1]:right_point[1] = histogram[j]right_point[0] = jresult_points = [left_point,right_point]           print("result_points: ",result_points)return result_points

输出位置:
result_points:  [[342, 566], [1014, 291]]

说明两个车道线大概在这两个点附近。

4.3 滑动窗口

将前面求得的两个坐标为起点来构建滑动窗口将车道线包裹在内。

def sliding_window(image,lanes_pos):# starting original points for windows.left_x_current = lanes_pos[0][0]right_x_current = lanes_pos[1][0]nWindows = 10window_height = np.int(image.shape[0]//nWindows)window_width = 80# to get the non-zero data in the input image.nonzero = image.nonzero() nonzero_y = nonzero[0]nonzero_x = nonzero[1]## create a empty list to receive left/right line pixel.left_lane_inds = []right_lane_inds = []# create window by windowfor window in range(nWindows):# window size.win_y_top = image.shape[0] - (window +1)*window_heightwin_y_bottom = image.shape[0] - window*window_heightwin_x_left_left = left_x_current - window_widthwin_x_left_right = left_x_current + window_width win_x_right_left = right_x_current - window_widthwin_x_right_right = right_x_current + window_width# define a rectangle for left+right lane.# and add the rectangle to the input image.cv2.rectangle(image,(win_x_left_left,win_y_top),(win_x_left_right,win_y_bottom),(0,255,0),2)cv2.rectangle(image,(win_x_right_left,win_y_top),(win_x_right_right,win_y_bottom),(0,255,0),2)good_left_inds = ((nonzero_y >= win_y_top)&(nonzero_y < win_y_bottom)&(nonzero_x >= win_x_left_left)&(nonzero_x < win_x_left_right)).nonzero()[0]good_right_inds = ((nonzero_y >= win_y_top)&(nonzero_y < win_y_bottom)&(nonzero_x >= win_x_right_left)&(nonzero_x < win_x_right_right)).nonzero()[0]#print(good_left_inds)left_lane_inds.append(good_left_inds)right_lane_inds.append(good_right_inds)##print("nonzero_x_left:",nonzero_x[good_left_inds])#print("non_zero_x_right:",nonzero_x[good_right_inds])if len(good_left_inds)>50:left_x_current = np.int(np.mean(nonzero_x[good_left_inds]))if len(good_right_inds)>50:right_x_current = np.int(np.mean(nonzero_x[good_right_inds]))# ending of lop.#print("left_lane_inds",left_lane_inds)# to transfom a list of list to a list.left_lane_inds = np.concatenate(left_lane_inds)right_lane_inds = np.concatenate(right_lane_inds)#print("left_lane_inds",left_lane_inds)left_x = nonzero_x[left_lane_inds]left_y = nonzero_y[left_lane_inds]right_x = nonzero_x[right_lane_inds]right_y = nonzero_y[right_lane_inds]#results = [image,left_x,left_y,right_x,right_y]#print("sliding windows results: ",results)return results

代码写的很明白,首先去输入的坐标为左边的车道线x坐标和右边车道线y坐标,

然后计算滑动窗口的高度和宽度,

算出图像中所有不唯1的坐标,将它们放入nonzero数组中,

分别取行数为nonzero_y和列数为nonzero_x,

之后就是在for循环不断的画出矩形,利用rectangle函数进行绘制图像。

然后计算这个窗口里面大于1的数的位置平均值为下一个窗口的中间值,

最后保存所有的大于1的坐标,并于图像一并返回。

 4.4 曲线拟合

构建出一条曲线来表示车道线,方便之后利用曲线的曲率来控制车辆的转向信息。

具体实现为将之前获得的图像中所有的白色点的坐标,将它们进行拟合成曲线。

def fit_polynominal(img_sliding_window):image = img_sliding_window[0]left_x = img_sliding_window[1]left_y = img_sliding_window[2]right_x = img_sliding_window[3]right_y = img_sliding_window[4]left_fit = np.polyfit(left_y,left_x,2)right_fit = np.polyfit(right_y,right_x,2)# to generate x and y values for plotting.ploty = np.linspace(0,image.shape[0]-1,image.shape[0])left_fitx = left_fit[0]*ploty**2 + left_fit[1]*ploty + left_fit[2]right_fitx = right_fit[0]*ploty**2 + right_fit[1]*ploty + right_fit[2]plt.plot(left_fitx,ploty,color='yellow')plt.plot(right_fitx,ploty,color='red')return 0

其中主要函数为polyfit函数它将参数一和参数二进行二次曲线拟合,拟合后得到三个参数存在返回值里面。

之后依据高度进行划分点,然后更具拟合后的参数构造曲线方程,最后输出到图像上。

 4.5 添加蒙版

通过前面获得的两条曲线的坐标点,在两条曲线之间添加一层蒙版,表示车道位置。

def drawing_poly(img_ori, img_fit):# create an image to draw the lines on.#left_fitx = img_fit[0]right_fitx = img_fit[1]ploty = img_fit[2]#img_zero = np.zeros_like(img_ori)##print("left_fitx:",left_fitx)#print("ploty:",ploty)pts_left = np.transpose(np.vstack([left_fitx,ploty]))#print("pts_left:",pts_left)# print("pts_left shape:",pts_left.shape)pts_right = np.transpose(np.vstack([right_fitx,ploty]))pts_right = np.flipud(pts_right)#print("pts_right:",pts_right)#print("pts_right shape:",pts_right.shape)pts = np.vstack((pts_left,pts_right))#print("pts_left+right:",pts)#print("pts_left+right shape:",pts.shape)img_mask = cv2.fillPoly(img_zero,np.int_([pts]),(0,255,0))#print("img_mask:",img_mask)#print("img_mask shape:",img_mask.shape)return img_mask

主要是对于右侧坐标的反转,

pts_right = np.flipud(pts_right)是为了后面绘制多边形的时候连线准确,

pts = np.vstack((pts_left,pts_right))

img_mask = cv2.fillPoly(img_zero,np.int_([pts]),(0,255,0))

 4.6 反向映射

将之前的处理后的图像反向映射回原始图像。

将之前的代码中的参数变换位置就可以获得反过来的变换矩阵。

getPerspectiveTransform

def drawing_poly_perspective_back(img_ori, img_fit,matrix_K_back):# create an image to draw the lines on.#left_fitx = img_fit[0]right_fitx = img_fit[1]ploty = img_fit[2]#img_zero = np.zeros_like(img_ori)##print("left_fitx:",left_fitx)#print("ploty:",ploty)pts_left = np.transpose(np.vstack([left_fitx,ploty]))#print("pts_left:",pts_left)#print("pts_left shape:",pts_left.shape)pts_right = np.transpose(np.vstack([right_fitx,ploty]))pts_right = np.flipud(pts_right)#print("pts_right:",pts_right)#print("pts_right shape:",pts_right.shape)pts = np.vstack((pts_left,pts_right))#print("pts_left+right:",pts)#print("pts_left+right shape:",pts.shape)img_mask = cv2.fillPoly(img_zero,np.int_([pts]),(0,255,0))#print("img_mask:",img_mask)#print("img_mask shape:",img_mask.shape)# to get image size.img_size = (img_ori.shape[1],img_ori.shape[0])img_mask_back = cv2.warpPerspective(img_mask,matrix_K_back,img_size)return img_mask_back

五、视频输入

 车道线检测变换基本完成,在将单帧图像修改为视频进行计算。

    # video input.video_input = "./test_video/project_video.mp4"cap = cv2.VideoCapture(video_input)# output setting.video_output = "./test_video/project_video_output_v2.mp4"fourcc = cv2.VideoWriter_fourcc(*'mp4v')width = 1280height = 720fps = 20video_out = cv2.VideoWriter(video_output,fourcc,fps,(width,height))# add some text to the output video.content = "this is frame: "pos = (64,90)color = (0,255,0)font = cv2.FONT_HERSHEY_SIMPLEXweight = 2size = 1count = 0## prcessing frame by frame. while True:ret,frame = cap.read()if not ret:print("video read error, exited...")breakif cv2.waitKey(25) & 0xFF == ord('q'):print(" you quit the program by clicking 'q'...")breakimage = frameksize = 15img_color = color_gradient_threshold(image)#left_bottom = [0, img_color.shape[0]]right_bottom = [img_color.shape[1],img_color.shape[0]]apex = [ img_color.shape[1]/2, 420 ]vertices = np.array([ left_bottom, right_bottom, apex ],np.int32)img_interest = region_of_interest(img_color,vertices)img_perspective,matrix_K_back = perspective_transform(img_interest)img_histogram = histogram_img(img_perspective)lanes_pos = lane_position(img_histogram)img_sliding_window = sliding_window(img_perspective,lanes_pos) img_fit_list = fit_polynominal(img_sliding_window)## to set the transparency of img.img_mask_back = drawing_poly_perspective_back(image,img_fit_list,matrix_K_back)#img_mask_back_result = img_mask_back*0.5 + image*0.5img_mask_back_result = cv2.addWeighted(image,1,img_mask_back,0.3,0)results = img_mask_back_resultcontents = content + str(count)cv2.putText(results,contents,pos,font,size,color,weight,cv2.LINE_AA)cv2.imshow("frame",results)video_out.write(results)#count += 1cap.release()cv2.destroyAllWindows()

容易理解,不做解读,

但只能达到一个简单的车道线识别效果,而且处理速度很慢,遇到颜色变化不明显的会直接error,在具体的项目应用中需要改进,改进在后面的文章中体现。

参考文章:

(六)高级车道线识别 - 知乎在之前的文章中,我们介绍了利用opencv进行简单的车道线识别项目,本文将更进一步,对相对复杂场景下的车道线进行识别。具体来讲,本文在简单车道线项目的基础上增加了如下知识点:颜色空间,透视变换,滑移窗,弯…https://zhuanlan.zhihu.com/p/56712138实操:自动驾驶的车道识别原理及演练(附代码下载)大家五一快乐呀,我是李慢慢。前情提要距离上一次正儿八经发文,貌似已经过去两个月了,因为疫情原因我一直都是居家https://mp.weixin.qq.com/s/9ykWyXsCnTVqyojRlb7H9A

相关文章:

carla中lka实现(一)

前言&#xff1a; 对于之前项目中工作内容进行总结&#xff0c;使用Carla中的车辆进行lka算法调试&#xff0c;整体技术路线&#xff1a; ①在Carla中生成车辆&#xff0c;并在车辆上搭载camera&#xff0c;通过camera采集图像数据&#xff1b; ②使用图像处理lka算法&#…...

常见的数据结构(顺序表、顺序表、链表、栈、队列、二叉树)

线性表&#xff08;Linear List&#xff09;  1.什么是线性表 2.线性表的特点 3.线性表的基本运算 顺序表 1.什么是顺序表 2.时间复杂度&#xff1a; 链表 1.什么是链表 2.单向链表 3. 双向链表 4.ArrayList和LinkedList的使用 栈Stack  1.什么是栈  2.栈的基本方法 队列…...

(12)理解委托,反射,Type,EvenInfo,插件, 组合枚举,BindingFlags,扩展方法及重载,XML认识

一、复习委托事件 1、委托复习。 private delegate int MyDelegate(int a, int b); //1.定义委托类型private static void Main(string[] args){MyDelegate md new MyDelegate(AddDelegate);//2.声明委托变量int result md(1, 2);//3.调用委托Console.WriteLine(result);Cons…...

软件建设方案技术方案实施方案密码评测方案等保测评方案人员培训方案项目建设与运行管理项目招标方案模板目录

第一章 项目概述 1.项目名称(包含项目全称和简称) 2.项目建设单位及负责人、项目责任人 3.项目建设依据 (1)政策依据(主要从国家、省、市、行业部门相关的政策文件要求等方面进行描述) (2)技术标准 4.项目建设目标、建设任务 5.项目主要建设内容、规模、建设周期…...

pytorch中torch.einsum函数的详细计算过程图解

第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时&#xff0c;属实是懵了&#xff0c;网上找了很多博主的介绍&#xff0c;但都没有详细的说明函数内部的计算过程&#xff0c;看得我是一头雾水&#xff0c;只知道计算结果的维度是如何变化的&#xf…...

【iOS】App仿写--天气预报

文章目录 前言一、首页二、搜索界面三、添加界面四、浏览界面总结 前言 最近完成了暑假的最后一个任务——天气预报&#xff0c;特此记录博客总结。根据iPhone中天气App的功能大致可以将仿写的App分为四个界面——首页&#xff0c;搜索界面&#xff0c;添加界面&#xff0c;浏…...

快速远程桌面控制公司电脑远程办公

文章目录 第一步第二步第三步 远程办公的概念很早就被提出来&#xff0c;但似乎并没有多少项目普及落实到实际应用层面&#xff0c;至少在前几年&#xff0c;远程办公距离我们仍然很遥远。但2019年末突如其来的疫情&#xff0c;着实打了大家一个措手不及。尽管国内最初的大面积…...

亚信科技AntDB数据库专家出席数据库标准研讨会并参与研讨

2023年7月12日&#xff0c;全国信息技术标准化技术委员会数据库标准工作组&#xff08;SAC/TC28/WG31&#xff09;秘书处组织召开数据库标准研讨会&#xff0c;会议围绕数据库标准工作组2023年上半年开展的标准编制情况进行交流。亚信科技AntDB数据库相关专家出席会议&#xff…...

【我们一起60天准备考研算法面试(大全)-第三十四天 34/60】【前缀和】【北邮】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…...

【数据分析】numpy (二)

numpy作为数据分析&#xff0c;深度学习常用的库&#xff0c;本篇博客我们来介绍numpy的一些进阶用法&#xff1a; 一&#xff0c;numpy的常用简单内置函数&#xff1a; 1.1求和&#xff1a; a np.array([[1, 2],[3, 4]]) np.sum(a)10 1.2求平均值&#xff1a; np.mean(a…...

Vue3小案例—v-model 双向数据绑定实现动态列表增加和删除

v-model双向绑定的原理&#xff1a;   v-model 是Vue.js 提供的一个指令&#xff0c;用于实现双向数据绑定&#xff0c;它可以将表单元素的值与Vue实例的数据绑定在一起&#xff0c;当表单元素的值发生改变时&#xff0c;Vue实例的数据也会随之更新&#xff0c;反之亦然。  …...

MySQL 重置root 密码

5.7 版本 首先要把服务mysql57 关闭 net stop MySQL57 在安装的mysql57的程序的bin中 运行cmd&#xff08;管理员运行&#xff09; mysqld --defaults-file‘mysql存放数据的位置\my.ini’ --skip-grant-tables 上图 错误 注意&#xff1a;如果遇到mysqld: Can’t change dir…...

OpenCV图像处理技巧之空间滤波

1. 引言 再次问好&#xff0c;图像处理爱好者们&#xff01;&#x1f31f; 在前面的章节中&#xff0c;我们学习了图像处理的基础知识&#xff0c;并展现了图像增强的魅力。在这一节中&#xff0c;我们将更深入地研究空间滤波技术。 闲话少说&#xff0c;我们直接开始吧&#…...

Java超级玛丽小游戏制作过程讲解 第一天 创建窗口

package com.sxt;import javax.swing.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener;public class MyFrame extends JFrame implements KeyListener {//设置窗口的大小为800*600public MyFrame() {this.setSize(800, 600);//设置窗口中显示this.setLo…...

【POP3/IMAP/SMTP】QQ邮箱设置

什么是 POP3/IMAP/SMTP 服务 POP3 &#xff08;Post Office Protocol - Version 3&#xff09;协议用于支持使用电子邮件客户端获取并删除在服务器上的电子邮件。 IMAP &#xff08;Internet Message Access Protocol&#xff09;协议用于支持使用电子邮件客户端交互式存取服务…...

云计算——常见集群策略

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 目录 前言 一.什么是集群 二.集群策略 1.虚拟机HA 实现虚拟机高可用性通常涉及以下关键…...

c语言locale.h简介

<locale.h>提供的函数用于控制c标准库中对于不同的地区行为不一样的部分。&#xff08;地区通常是国家或者某种特定语言的地理区域&#xff09; 一、locale.h简单介绍 在标准库里&#xff0c;依赖地区的部分通常包括以下几项&#xff1a; 数字量的格式 货币的格式 字符…...

C++运算符重载详解(赋值、流插入流提取、前置后置++、取地址)

C运算符重载详解 基本介绍运算符重载案列1. 赋值运算符重载2. 前置和后置重载3. cout&#xff0c;cin(流插入&#xff0c;流提取重载)4. 取地址重载 基本介绍 C为了增强代码的可读性引入了运算符重载&#xff0c;运算符重载是具有特殊函数名的函数&#xff0c;也具有其 返回值…...

sql的count函数优化

sql的count(1)函数会执行遍历表统计符合条件的数目&#xff0c;下面有两个sql 第一条&#xff1a; select count(1) from membership_call_detail_statistics a where a.repository_id f2a4ed6b3e074e33bd99998c1def26f8 and a.statistics_date between 2023-04-01 00:00:0…...

Ai创作系统ChatGPT源码搭建教程+附源码

系统使用Nestjs和Vue3框架技术&#xff0c;持续集成AI能力到本系统&#xff01; 更新内容&#xff1a; 同步官方图片重新生成指令 同步官方 Vary 指令 单张图片对比加强 Vary(Strong) | Vary(Subtle) 同步官方 Zoom 指令 单张图片无限缩放 Zoom out 2x | Zoom out 1.5x 新增GP…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

阿里云ACP云计算备考笔记 (5)——弹性伸缩

目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...