從車道檢測項目入門open cv

從車道檢測項目入門open cv

前提聲明:非常感謝b站up主 嘉然今天吃帶變,感謝其視頻的幫助。同時希望各位大佬積積極提出寶貴的意見。😊😊😊(?′?`?)(●’?’●)╰(°▽°)╯

github地址:https://github.com/lizhongzheng13/openCV_Lane_Detection/tree/main

視頻地址:從車道檢測項目入門open cv

基礎知識

cv2.imread & cv2.imshow & cv2.imwrite
 import cv2 as cvimg = cv.imread("img.png", cv.IMREAD_GRAYSCALE) #將圖片轉為灰度圖

但是當前會存在一些問題,圖片會閃一下,看不清楚,所以我們可以加上阻塞 cv2.waitKey()函數

#完整版
import cv2 as cvimg = cv.imread("img.png", cv.IMREAD_GRAYSCALE)
print(type(img))
print(img.shape)
cv.imshow('image', img)
k = cv.waitKey(0)  # 阻塞 #k相當于檢測你的輸入的ascii值
print(k)
# while True:
#     if cv.waitKey(0) == ord('q'):
#         cv.destroyAllWindows()
#     else:
#         img = cv.imread("img.png", cv.IMREAD_GRAYSCALE)cv.imwrite("img_gray.png", img)#生成img圖片,保存到當前目錄中~

效果展示

原始圖像:

image-20250428092853043

灰度圖:

image-20250428092929086

Canny邊緣檢測

通過求取圖像上每一個像素點周邊圖像像素變化的梯度,來確定這個點是否是邊緣。

image-20250428102959222

梯度的方向一般總是與邊界垂直,梯度的方向被歸為四類:垂直、水平和兩個對角線(即,0度、45度、90度和135度四個方向)。

image-20250428104012729

我們現在的想法是設置一個閾值,當梯度大于閾值時,我們可以認為該點是邊緣。但是隨之而來的是,圖片會產生一些毛邊或者光線,角度等問題,導致可能會誤判。

image-20250428105216769

為了解決這個問題,我們采用雙閾值的方法,一個上閾值,一個下閾值。

image-20250428105314881

我們認為高于上閾值的點為強邊緣,在上閾值和下閾值之間的我們認為是弱邊緣。

我們認為只有弱邊緣與強邊緣相連的話,才是邊緣。B不認為是邊緣,可能是噪聲;C與A強邊緣相連,我們認為C是邊緣。

import cv2img = cv2.imread("img.png", cv2.IMREAD_GRAYSCALE)edge_img = cv2.Canny(img, 190, 350)  # 下邊緣和上邊緣的閾值設定 #需要自行更改
cv2.imshow("edge", edge_img)
cv2.waitKey(0)
image-20250429203018189

當上邊緣和下邊緣都升高時,邊緣顯示會越來越少。


ROI mask

簡單來講就是類似于摳圖,就是剔除無關信息的邊緣。

roi : region of interest 感興趣的區域

? 數組切片

? 布爾運算(與運算)

image-20250428111139930
  • cv2.fillPoly 是 OpenCV 中的一個函數,用于在圖像中填充多邊形區域。它常用于繪制、遮罩或標記圖像中的特定區域。通過指定多邊形的頂點,cv2.fillPoly 可以將這些區域填充為指定的顏色。

  • cv2.bitwise_and 是 OpenCV 中的一個函數,用于對兩個圖像或數組進行按位與(bitwise AND)操作。按位與操作是逐像素進行的,只有當兩個圖像的對應像素都為非零值時,結果圖像的該像素才為非零值。

    • 圖像遮罩

      • 使用掩碼提取圖像的特定區域。例如,將一個形狀(如矩形、圓形或多邊形)作為掩碼,只保留掩碼內的圖像內容。
    • 圖像合成

      • 將兩個圖像的特定部分組合在一起。
    • 圖像處理

      • 在圖像處理中,按位與操作常用于對圖像進行區域選擇或區域遮擋。

圖像以矩陣np.array形式存儲在內存中

? np.zeros_like : np.zeros_like 是 NumPy 庫中的一個函數,用于創建一個與給定數組形狀和數據類型相同的數組,但所有元素都初始化為零。

# @Author : LiZhongzheng
# 開發時間  :2025-04-28 17:30
import cv2
import numpy as npedge_img = cv2.imread("edge_img.png", cv2.IMREAD_GRAYSCALE)
mask = np.zeros_like(edge_img)  # 獲取一個與edge_img大小相同的數組
mask = cv2.fillPoly(mask, np.array([[[0, 569], [661, 195], [914, 248], [979, 592]]]),color=255)  # array中的存放的是想要識別區域的四個頂點 #順序為左下、左上、右上、右下masked_edge_img = cv2.bitwise_and(edge_img, mask)
# cv2.imshow('mask', mask)
# cv2.waitKey(0)
cv2.imshow("edged", masked_edge_img)
cv2.waitKey(0)
image-20250429202953080

霍夫變換

提取圖片中的直線。

注意:霍夫變換是針對灰度圖的。

image-20250428191915811 image-20250428192232916 image-20250428192253353

min是最短線段的長度,max是兩點之間的最大距離,超過這個距離就不認為是線段了。

  • 首先經過 cv2.HoughLinesP()函數獲取到所有的線條,然后計算線條的斜率,根據斜率的正負判斷是左車道線還是右車道線。

    • # @Author : LiZhongzheng
      # 開發時間  :2025-04-29 8:54
      import cv2
      import numpy as npdef calculate_slope(line):"""計算線段line的斜率:param line: np.array([[x_1, y_1, x_2, y_2]]):return:"""x_1, y_1, x_2, y_2 = line[0]return (y_2 - y_1) / (x_2 - x_1)edge_img = cv2.imread('masked_edge_img.jpg', cv2.IMREAD_GRAYSCALE)
      # 獲取所有線段
      lines = cv2.HoughLinesP(edge_img, 1, np.pi / 180, 15, minLineLength=40,maxLineGap=20)
      # 按照斜率分成車道線
      left_lines = [line for line in lines if calculate_slope(line) > 0]
      right_lines = [line for line in lines if calculate_slope(line) < 0]print("left_lines =", len(left_lines))
      print("right_lines =", len(right_lines))
      

離群值過濾

剔除出因為誤差而被識別出的直線。

如何分解出噪點和車道線那?

  • 我們可以知道,車道線的斜率大致是相同的,進而可以分辨出噪點和車道線。
# @Author : LiZhongzheng
# 開發時間  :2025-04-29 9:01
import cv2
import numpy as np"""
剔除出因為誤差而被識別出的直線。
如何分解出噪點和車道線那?我們可以知道,車道線的斜率大致是相同的,進而可以分辨出噪點和車道線。
"""def calculate_slope(line):"""計算線段line的斜率:param line: np.array([[x_1, y_1, x_2, y_2]]):return:"""x_1, y_1, x_2, y_2 = line[0]return (y_2 - y_1) / (x_2 - x_1)edge_img = cv2.imread('masked_edge_img.jpg', cv2.IMREAD_GRAYSCALE)# 獲取所有線段
lines = cv2.HoughLinesP(edge_img, 1, np.pi / 180, 15, minLineLength=40, maxLineGap=20)# 按照斜率分成車道線
left_lines = [line for line in lines if calculate_slope(line) > 0]
right_lines = [line for line in lines if calculate_slope(line) < 0]def reject_abnormal_lines(lines, threshold):"""剔除斜率不一致的線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]"""slopes = [calculate_slope(line) for line in lines]while len(lines) > 0:mean = np.mean(slopes)  # 使用 NumPy 的 np.mean 函數計算當前所有斜率的平均值diff = [abs(s - mean) for s in slopes]  # 遍歷 slopes 列表,計算每個斜率與平均斜率的絕對差值,并將結果存儲在 diff 列表中idx = np.argmax(diff)  # 使用 NumPy 的 np.argmax 函數找到 diff 列表中最大值的索引,即斜率差異最大的線段。if diff[idx] > threshold:  # 如果最大差異大于閾值 threshold,則認為該線段是異常的,將其從 slopes 和 lines 列表中移除。slopes.pop(idx)lines.pop(idx)else:  # 如果最大差異小于或等于閾值,則認為所有線段的斜率已經足夠一致,退出循環。breakreturn lines  # 如果最大差異小于或等于閾值,則認為所有線段的斜率已經足夠一致,退出循環。print('before filter:')
print('left lines number=')
print(len(left_lines))
print('right lines number=')
print(len(right_lines))reject_abnormal_lines(left_lines, threshold=0.2)
reject_abnormal_lines(right_lines, threshold=0.2)print('after filter:')
print('left lines number=')
print(len(left_lines))
print('right lines number=')
print(len(right_lines))

最小二乘擬合

將lines的線段擬合成一條直線。

np.ravel 將高維數組拉成一維

np.polyfit 多項式擬合

np.polyval 多項式求值

  • 經過上述的步驟,進而我們可以求出車道線的數量等信息,同時又剔除了噪點。然后我們就可以將在同一個區域的線段擬合一條直線

    • # @Author : LiZhongzheng
      # 開發時間  :2025-04-29 15:58
      import cv2
      import numpy as npdef calculate_slope(line):"""計算線段line的斜率:param line: np.array([[x_1, y_1, x_2, y_2]]):return:"""x_1, y_1, x_2, y_2 = line[0]return (y_2 - y_1) / (x_2 - x_1)edge_img = cv2.imread("masked_edge_img.jpg", cv2.IMREAD_GRAYSCALE)
      # 獲取所有線段
      lines = cv2.HoughLinesP(edge_img, 1, np.pi / 180, 15, minLineLength=40, maxLineGap=20)# 按照斜率分成車道線
      left_lines = [line for line in lines if calculate_slope(line) > 0]
      right_lines = [line for line in lines if calculate_slope(line) < 0]def reject_abnormal_lines(lines, threshold):"""剔除斜率不一致的線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]"""slopes = [calculate_slope(line) for line in lines]while len(lines) > 0:mean = np.mean(slopes)diff = [abs(s - mean) for s in slopes]idx = np.argmax(diff)if (diff[idx] > threshold):slopes.pop(idx)lines.pop(idx)else:breakreturn linesleft_lines = reject_abnormal_lines(left_lines, threshold=0.2)
      right_lines = reject_abnormal_lines(right_lines, threshold=0.2)def least_squares_fit(lines):"""將lines中的線段擬合成一條線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]:return: 線段上的兩點,np.array([[xmin, ymin], [xmax, ymax]])"""# 1. 取出所有坐標點"""在 OpenCV 中,線段通常用一個形狀為 (1, 4) 的 NumPy 數組表示,其中包含線段的兩個端點的坐標。具體來說,數組的格式為 [x1, y1, x2, y2],分別表示起點 (x1, y1) 和終點 (x2, y2)。"""x_coords = np.ravel([[line[0][0], line[0][2]] for line in lines])  # np.ravel 將二維列表展平為一維數組y_coords = np.ravel([[line[0][1], line[0][3]] for line in lines])# 2. 進行直線擬合.得到多項式系數poly = np.polyfit(x_coords, y_coords, deg=1)# 3. 根據多項式系數,計算兩個直線上的點,用于唯一確定這條直線point_min = (np.min(x_coords), np.polyval(poly, np.min(x_coords)))point_max = (np.max(x_coords), np.polyval(poly, np.max(x_coords)))return np.array([point_min, point_max], dtype=np.int32)print("left lane")
      print(least_squares_fit(left_lines))
      print("right lane")
      print(least_squares_fit(right_lines))

直線繪制

繪制車道線 cv2.line

# @Author : LiZhongzheng
# 開發時間  :2025-04-29 16:23
import cv2
import numpy as npdef calculate_slope(line):"""計算線段line的斜率:param line: np.array([[x_1, y_1, x_2, y_2]]):return:"""x_1, y_1, x_2, y_2 = line[0]return (y_2 - y_1) / (x_2 - x_1)edge_img = cv2.imread('masked_edge_img.jpg', cv2.IMREAD_GRAYSCALE)
# 獲取所有線段
lines = cv2.HoughLinesP(edge_img, 1, np.pi / 180, 15, minLineLength=40,maxLineGap=20)
# 按照斜率分成車道線
left_lines = [line for line in lines if calculate_slope(line) > 0]
right_lines = [line for line in lines if calculate_slope(line) < 0]def reject_abnormal_lines(lines, threshold):"""剔除斜率不一致的線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]"""slopes = [calculate_slope(line) for line in lines]while len(lines) > 0:mean = np.mean(slopes)diff = [abs(s - mean) for s in slopes]idx = np.argmax(diff)if diff[idx] > threshold:slopes.pop(idx)lines.pop(idx)else:breakreturn linesleft_lines = reject_abnormal_lines(left_lines, threshold=0.2)
right_lines = reject_abnormal_lines(right_lines, threshold=0.2)def least_squares_fit(lines):"""將lines中的線段擬合成一條線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]:return: 線段上的兩點,np.array([[xmin, ymin], [xmax, ymax]])"""# 1. 取出所有坐標點x_coords = np.ravel([[line[0][0], line[0][2]] for line in lines])y_coords = np.ravel([[line[0][1], line[0][3]] for line in lines])# 2. 進行直線擬合.得到多項式系數poly = np.polyfit(x_coords, y_coords, deg=1)# 3. 根據多項式系數,計算兩個直線上的點,用于唯一確定這條直線point_min = (np.min(x_coords), np.polyval(poly, np.min(x_coords)))point_max = (np.max(x_coords), np.polyval(poly, np.max(x_coords)))return np.array([point_min, point_max], dtype=np.int32)left_line = least_squares_fit(left_lines)
right_line = least_squares_fit(right_lines)img = cv2.imread('img.jpg', cv2.IMREAD_COLOR)
cv2.line(img, tuple(left_line[0]), tuple(left_line[1]), color=(0, 255, 255), thickness=5)
cv2.line(img, tuple(right_line[0]), tuple(right_line[1]), color=(0, 255, 255), thickness=5)cv2.imshow('lane', img)
cv2.waitKey(0)
image-20250429205831425
重難點講解:least_squares_fit()函數講解

該函數主要做了三個部分:提取坐標點、進行直線擬合、計算直線上的兩個點。

1. 提取所有坐標點
x_coords = np.ravel([[line[0][0], line[0][2]] for line in lines])
y_coords = np.ravel([[line[0][1], line[0][3]] for line in lines])
  • lines
    • 輸入的線段集合,每個線段是一個形狀為 (1, 4) 的 NumPy 數組,表示線段的兩個端點坐標 [x1,y1,x2,y2]。
  • x_coords
    • 提取所有線段的 x 坐標。line[0][0] 是起點的 x 坐標,line[0][2] 是終點的 x 坐標。
    • 使用列表推導式 [[line[0][0], line[0][2]] for line in lines] 生成一個二維列表,包含所有線段的起點和終點的 x 坐標。
    • 使用 np.ravel 將二維列表展平為一維數組。
  • y_coords
    • 提取所有線段的 y 坐標。line[0][1] 是起點的 y 坐標,line[0][3] 是終點的 y 坐標。
    • 使用列表推導式 [[line[0][1], line[0][3]] for line in lines] 生成一個二維列表,包含所有線段的起點和終點的 y 坐標。
    • 使用 np.ravel 將二維列表展平為一維數組。
2. 進行直線擬合
poly = np.polyfit(x_coords, y_coords, deg=1)
  • np.polyfit
    • 這是 NumPy 中的一個函數,用于對給定的數據點進行多項式擬合。
    • 參數:
      • x_coords:自變量 x 的值。
      • y_coords:因變量 y 的值。
      • deg=1:指定擬合多項式的次數為 1,即線性擬合
    • 返回值:
      • 返回擬合多項式的系數,從最高次項到常數項。對于線性擬合,返回兩個值 [slope, intercept],分別表示直線的斜率和截距。
3. 計算直線上的兩個點
point_min = (np.min(x_coords), np.polyval(poly, np.min(x_coords)))
point_max = (np.max(x_coords), np.polyval(poly, np.max(x_coords)))
  • np.min(x_coords)np.max(x_coords)
    • 分別計算 x 坐標中的最小值和最大值。
  • np.polyval(poly, x)
    • 這是 NumPy 中的一個函數,用于計算多項式在給定的 x 值處的 y 值。
    • 參數:
      • poly:擬合多項式的系數數組。
      • x:輸入的 x 值。
    • 返回值:
      • 返回多項式在 x 處的 y 值。
  • point_minpoint_max
    • point_min 是直線上的一個點,其 x 坐標為最小值,y 坐標通過多項式計算得到。
    • point_max 是直線上的一個點,其 x 坐標為最大值,y 坐標通過多項式計算得到。
4. 返回值
return np.array([point_min, point_max], dtype=np.int32)
  • 返回一個形狀為 (2, 2) 的 NumPy 數組,表示直線上的兩個點的坐標。這兩個點可以唯一確定一條直線。

視頻流讀寫

cv2.VideoCapture

? capture.read

  • 基礎代碼介紹:
# @Author : LiZhongzheng
# 開發時間  :2025-04-29 17:06
import cv2capture = cv2.VideoCapture('video.mp4')
# capture = cv2.VideoCapture(0) #讀取當前設備第0個攝像頭
while True:ret, frame = capture.read()  # ret 視頻流的狀態,frame 當前幀的圖像cv2.imshow('frame', frame)cv2.waitKey(20)  # 相當于播放速率

cv2.VideoWriter

最后我們不僅可以識別圖片的車道線還可以識別視頻的車道線,原理相同,因為視頻是一幀一幀的,每一幀就是一個圖片。

# @Author : LiZhongzheng
# 開發時間  :2025-04-29 17:12
import cv2
import numpy as npdef get_edge_img(color_img, gaussian_ksize=5, gaussian_sigmax=1, canny_threshold1=50, canny_threshold2=100):"""灰度化,模糊,canny變換,提取邊緣:param color_img: 彩色圖,channels=3""""""cv2.GaussianBlur() 函數參數color_img:輸入的彩色圖像,必須是 3 通道的 BGR 圖像。gaussian_ksize(可選):高斯模糊的核大小。必須是正奇數,默認值為 5。gaussian_sigmax(可選):高斯模糊的 X 方向標準差,默認值為 1。"""gaussian = cv2.GaussianBlur(color_img, (gaussian_ksize, gaussian_ksize),gaussian_sigmax)  # 使用 cv2.GaussianBlur 對輸入圖像進行高斯模糊處理。高斯模糊可以減少圖像中的噪聲,使邊緣檢測更加穩定。gray_img = cv2.cvtColor(gaussian, cv2.COLOR_BGR2GRAY)edges_img = cv2.Canny(gray_img, canny_threshold1, canny_threshold2)return edges_imgdef roi_mask(gray_img):"""對gray_img進行掩膜:param gray_img: 灰度圖,channels=1"""poly_pts = np.array([[[0, 368], [300, 210], [340, 210], [640, 368]]])mask = np.zeros_like(gray_img)mask = cv2.fillPoly(mask, pts=poly_pts, color=255)img_mask = cv2.bitwise_and(gray_img, mask)return img_maskdef get_lines(edge_img):"""獲取edge_img中的所有線段:param edge_img: 標記邊緣的灰度圖"""def calculate_slope(line):"""計算線段line的斜率:param line: np.array([[x_1, y_1, x_2, y_2]]):return:"""x_1, y_1, x_2, y_2 = line[0]return (y_2 - y_1) / (x_2 - x_1)def reject_abnormal_lines(lines, threshold=0.2):"""剔除斜率不一致的線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]"""slopes = [calculate_slope(line) for line in lines]while len(lines) > 0:mean = np.mean(slopes)diff = [abs(s - mean) for s in slopes]idx = np.argmax(diff)if (diff[idx] > threshold):slopes.pop(idx)diff.pop(idx)else:breakreturn linesdef least_squares_fit(lines):"""將lines中的線段擬合成一條線段:param lines: 線段集合, [np.array([[x_1, y_1, x_2, y_2]]),np.array([[x_1, y_1, x_2, y_2]]),...,np.array([[x_1, y_1, x_2, y_2]])]:return: 線段上的兩點,np.array([[xmin, ymin], [xmax, ymax]])""""""np.polyfit 是 NumPy 庫中的一個函數,用于對給定的數據點進行多項式擬合。它通過最小二乘法找到一個多項式,使得這個多項式在給定數據點上的值與實際值之間的誤差平方和最小。"""x_coords = np.ravel([[line[0][0], line[0][2]] for line in lines])y_coords = np.ravel([[line[0][1], line[0][3]] for line in lines])poly = np.polyfit(x_coords, y_coords, deg=1)point_min = (np.min(x_coords), np.polyval(poly, np.min(x_coords)))  # 這行代碼的作用是計算擬合直線(或多項式曲線)上的一個特定點的坐標。具體來說,它計算的是當 x 取最小值時,對應的 y 值,并將這個點的坐標存儲為一個元組 (x_min, y_min)。point_max = (np.max(x_coords), np.polyval(poly, np.max(x_coords)))return np.array([point_min, point_max], dtype=np.int32)# 獲取所有線段lines = cv2.HoughLinesP(edge_img, 1, np.pi / 180, 15, minLineLength=40,maxLineGap=20)# 按照斜率分成車道線left_lines = [line for line in lines if calculate_slope(line) > 0]right_lines = [line for line in lines if calculate_slope(line) < 0]# 剔除離群線段left_lines = reject_abnormal_lines(left_lines)right_lines = reject_abnormal_lines(right_lines)return least_squares_fit(left_lines), least_squares_fit(right_lines)def draw_lines(img, lines):"""在img上繪制lines:param img::param lines: 兩條線段: [np.array([[xmin1, ymin1], [xmax1, ymax1]]), np.array([[xmin2, ymin2], [xmax2, ymax2]])]:return:"""left_line, right_line = linescv2.line(img, tuple(left_line[0]), tuple(left_line[1]), color=(0, 255, 255),thickness=5)cv2.line(img, tuple(right_line[0]), tuple(right_line[1]),color=(0, 255, 255), thickness=5)def show_lane(color_img):  # 封裝"""在color_img上畫出車道線:param color_img: 彩色圖,channels=3:return:"""edge_img = get_edge_img(color_img)mask_gray_img = roi_mask(edge_img)lines = get_lines(mask_gray_img)draw_lines(color_img, lines)return color_imgif __name__ == '__main__':capture = cv2.VideoCapture('video.mp4')while True:ret, frame = capture.read()frame = show_lane(frame)cv2.imshow('frame', frame)cv2.waitKey(10)
image-20250429195914415

以上就是我對這個項目的總結。

同時再次說明我已經將項目上傳到github項目中,歡迎大家多多支持,你們的支持是我最大的前進動力~~~

再次感謝b站up主 嘉然今天吃帶變,以及各位大佬的寶貴意見。

祝好~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78681.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78681.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78681.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【行業特化篇3】制造業簡歷優化指南:技術參數與標準化流程的關鍵詞植入藝術

寫在最前 作為一個中古程序猿,我有很多自己想做的事情,比如埋頭苦干手搓一個低代碼數據庫設計平臺(目前只針對寫java的朋友),比如很喜歡幫身邊的朋友看看簡歷,講講面試技巧,畢竟工作這么多年,也做到過高管,有很多面人經歷,意見還算有用,大家基本都能拿到想要的offe…

如何在本地部署小智服務器:從源碼到全模塊運行的詳細步驟

小智聊天機器人本地后臺服務器源碼全模塊部署 作者&#xff1a;林甲酸 -不是小女子也不是女漢子 是大女子 更新日期&#xff1a;2025年4月29日 &#x1f3af; 前言&#xff1a;為什么要寫這篇教程&#xff1f; 上周按照蝦哥小智服務器的教程去部署本地后臺&#xff0c;我用的是…

github開源項目添加開源協議,使用很簡單

直接在 GitHub 網頁上創建 進入你的 GitHub 倉庫 打開你的項目倉庫頁面&#xff08;如 https://github.com/用戶名/倉庫名&#xff09;。 點擊 "Add file" → "Create new file" 在倉庫主頁&#xff0c;點擊右上角的 "Add file" 按鈕&#xff…

8.idea創建maven項目(使用Log4j日志記錄框架+Log4j 介紹)

8.idea創建maven項目(使用Log4j日志記錄框架Log4j 介紹) 在 IntelliJ IDEA 的 Maven 項目中引入了 Log4j&#xff0c;并配置了日志同時輸出到控制臺和文件。 Log4j 提供了靈活的日志配置選項&#xff0c;可以根據項目需求調整日志級別、輸出目標和格式。 1. 創建 Maven 項目 …

【和春筍一起學C++】函數——C++的編程模塊

目錄 1. 原型句法 2. 函數分類 3. 函數參數之按值傳遞 4. 數組作為函數參數 在C中&#xff0c;要使用函數&#xff0c;必須要有這三個方面&#xff1a; 函數原型&#xff0c;函數原型描述了函數到編譯器的接口&#xff0c;函數原型一般放在include文件中。函數原型告訴編譯…

深挖Java基礎之:認識Java(創立空間/先導:Java認識)

今天我要介紹的是在Java中對Java的一些基本語法的認識與他們的運用&#xff0c;以及擬舉例子說明和運用場景&#xff0c;優勢和劣勢&#xff0c; 注&#xff1a;本篇文章是對Java的一些基本的&#xff0c;簡單的代碼塊的一些內容&#xff0c;后續會講解在Java中的變量類型&…

Python+Selenium+Pytest+Allure PO模式UI自動化框架

一、框架結構 allure-report&#xff1a;測試報告base&#xff1a;定位元素封裝data&#xff1a;數據log&#xff1a;日志文件page&#xff1a;頁面封裝文件夾report&#xff1a;緩存報告testcases&#xff1a;測試用例層utils&#xff1a;工具類run.py&#xff1a;執行文件 二…

博物館除濕控濕保衛戰:M-5J1R 電解除濕科技如何重塑文物守護的未來

在盧浮宮幽深的長廊里&#xff0c;達芬奇的《蒙娜麗莎》正經歷著一場看不見的戰爭——不是來自時間的侵蝕&#xff0c;而是空氣中無形的水分子。每一件文物都在與濕度進行著無聲的抗爭&#xff0c;這場抗爭關乎人類文明的延續。濕度&#xff0c;這個看不見的文物殺手&#xff0…

【嘉立創EDA】如何找到曲線和直線的交點,或找到弧線和直線的交點

文章路標?? :one: 文章解決問題:two: 主題內容:three: 參考方法be end..1?? 文章解決問題 操作環境:嘉立創EDA專業版 V2.2.38 本文使用嘉立創EDA,描述如何快速找到曲線和直線交點的方法,這里的曲線包括了弧線等。本文將此過程記錄,以供有需要的讀者參考。 2?? 主題…

大語言模型能否替代心理治療師的深度拓展研究:fou

大語言模型能否替代心理治療師的深度拓展研究 在科技初創企業和研究領域,大型語言模型(LLMs)用于替代心理健康服務提供者的應用備受關注。但研究人員通過對主要醫療機構治療指南的梳理回顧,并對當前 LLMs(如 gpt-4o)進行實驗評估后發現,LLMs 存在對心理疾病患者表達污名…

【linux】Chrony服務器

簡介 1.1 時間的重要性 由于 IT 系統中&#xff0c;準確的計時非常重要&#xff0c;有很多種原因需要準確計時&#xff1a; 在網絡傳輸中&#xff0c;數據包括和日志需要準確的時間戳 各種應用程序中&#xff0c;如訂單信息&#xff0c;交易信息等 都需要準確的時間戳 1.2 時區…

mysql查看哪些表的自增id已超過某個值

場景 想看哪些表數據比較大&#xff0c;如果用count 比較慢&#xff0c;同時表設計如果是自增&#xff0c;有沒有辦法一次查出自增id已超過某值的所有表呢。 方法 SELECT AUTO_INCREMENT,TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA 庫名 AND AUTO_INCRE…

SiamMask原理詳解:從SiamFC到SiamRPN++,再到多任務分支設計

SiamMask原理詳解&#xff1a;從SiamFC到SiamRPN&#xff0c;再到多任務分支設計 一、引言二、SiamFC&#xff1a;目標跟蹤的奠基者1. SiamFC的結構2. SiamFC的局限性 三、SiamRPN&#xff1a;引入Anchor機制的改進1. SiamRPN的創新2. SiamRPN的進一步優化 四、SiamMask&#x…

SpringBoot終極形態:AI生成帶OAuth2鑒權的微服務模塊(節省20人日)

在數字化轉型的浪潮中,開發效率和質量是企業競爭力的關鍵要素。飛算 JavaAI 作為一款創新的 AI 工具,能在 Spring Boot 開發中,自動生成完整微服務模塊,極大提升開發效率。下面,我們就詳細介紹如何借助飛算 JavaAI,實現 Spring Boot 微服務模塊的自動化生成。 飛算 JavaAI 簡介…

Spring緩存注解深度實戰:3大核心注解解鎖高并發系統性能優化?

引言&#xff1a;緩存——高并發系統的“性能加速器”? 在互聯網應用中&#xff0c;數據庫查詢往往是性能瓶頸的核心。當每秒數千次的請求直接沖擊數據庫時&#xff0c;系統響應速度會急劇下降&#xff0c;甚至引發宕機風險。?緩存技術?應運而生&#xff0c;成為解決這一痛…

CSS元素動畫篇:基于當前位置的變換動畫(二)

基于當前位置的變換動畫&#xff08;二&#xff09; 前言旋轉效果類元素動畫搖擺動畫效果效果預覽代碼實現 搖晃動畫效果效果預覽代碼實現 螺旋旋轉效果預覽代碼實現 結語 前言 CSS元素動畫一般分為兩種&#xff1a;一種是元素基于當前位置的變換動畫&#xff0c;通過不明顯的…

Qt/C++開發監控GB28181系統/設備注冊/設備注銷/密碼認證/心跳保活/校時

一、前言 根據gb28181協議文檔&#xff0c;第一步就是需要實現設備的注冊&#xff0c;和onvif不同&#xff0c;gb是反過來的&#xff0c;設備端主動連接服務端&#xff0c;而onvif是服務端主動發出搜索&#xff0c;設備被動應答&#xff0c;包括后續的交互幾乎都是被動應答&am…

MATLAB 中的圖形繪制

一、線圖 plot 函數用來創建x和y值的簡單線圖。 x 0 : 0.05 : 30; %從0到30&#xff0c;每隔0.05取一次值 y sin(x); plot(x,y,LineWidth,2) %若&#xff08;x&#xff0c;y&#xff0c;LineWidth&#xff0c;2&#xff09;可變粗 xlabel("橫軸標題") ylab…

go語言八股文(五)

1.go的局部變量是分配在棧上還是在堆上 在Go語言中&#xff0c;局部變量的內存分配&#xff08;棧或堆&#xff09;由編譯器基于逃逸分析&#xff08;escape analysis&#xff09;來決定。以下是總結和具體示例&#xff1a; 棧上分配 當局部變量的生命周期嚴格限定在函數作用…

Gradients of Matrix-Matrix Multiplication in Deep Learning

Gradients of Matrix-Matrix Multiplication in Deep Learning 1. Matrix multiplication2. Derivation of the gradients2.1. Dimensions of the gradients2.2. The chain rule2.3. Derivation of the gradient ? L ? A \frac{ {\partial L} }{ {\partial \boldsymbol {\bo…