OpenCV實戰教程 第一部分:基礎入門

第一部分:基礎入門

1. OpenCV簡介

什么是OpenCV及其應用領域

OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習軟件庫,于1999年由Intel公司發起,現在由非營利組織OpenCV.org維護。OpenCV旨在提供一個共同的基礎設施,加速計算機視覺在商業產品中的應用,并推動計算機視覺研究的發展。

OpenCV的主要特點:

  • 完全開源和跨平臺
  • 支持C++、Python、Java等多種編程語言
  • 包含超過2500個優化算法
  • 全球擁有超過1800萬下載量

主要應用領域:

  1. 工業自動化:缺陷檢測、零件識別、尺寸測量
  2. 醫療影像:病變檢測、醫學圖像分析
  3. 安防監控:人臉識別、行為分析、車牌識別
  4. 增強現實(AR):實時圖像處理、特征追蹤
  5. 自動駕駛:道路標記識別、障礙物檢測
  6. 機器人導航:環境感知、路徑規劃
  7. 文檔分析:OCR(光學字符識別)、文本檢測
  8. 人機交互:手勢識別、姿態檢測
  9. 移動應用:照片處理、實時濾鏡

開發環境搭建

Windows系統

安裝Python和pip(如果尚未安裝)

  1. 訪問 Python官網,下載并安裝最新版Python(推薦Python 3.7以上版本)
  2. 安裝時勾選"Add Python to PATH"選項
  3. 打開命令提示符,輸入以下命令確認安裝成功:
 

bash

python --version
pip --version

安裝OpenCV

  1. 在命令提示符中運行以下命令:
 

bash

pip install opencv-python
pip install opencv-contrib-python  # 包含擴展模塊

安裝IDE(推薦)

  • 下載并安裝Visual Studio Code: Visual Studio Code - Code Editing. Redefined
  • 安裝Python擴展
MacOS系統

使用Homebrew安裝Python(如果尚未安裝)

  1. 安裝Homebrew(如果尚未安裝):
 

bash

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
  1. 安裝Python:
 

bash

brew install python

安裝OpenCV

 

bash

pip3 install opencv-python
pip3 install opencv-contrib-python  # 包含擴展模塊

安裝IDE(推薦)

  • 下載并安裝Visual Studio Code: Visual Studio Code - Code Editing. Redefined
  • 安裝Python擴展
Linux系統(Ubuntu示例)

安裝Python和pip(如果尚未安裝)

 

bash

sudo apt update
sudo apt install python3 python3-pip

安裝OpenCV依賴項

 

bash

sudo apt install libgl1-mesa-glx

安裝OpenCV

 

bash

pip3 install opencv-python
pip3 install opencv-contrib-python  # 包含擴展模塊

安裝IDE(推薦)

 

bash

sudo snap install code --classic  # 安裝Visual Studio Code

安裝配置和第一個程序"Hello OpenCV"

驗證安裝

創建一個Python文件,例如verify_opencv.py,輸入以下代碼:

 

python

import cv2# 打印OpenCV版本
print(f"OpenCV 版本: {cv2.__version__}")# 檢查是否可以創建窗口
try:cv2.namedWindow("Test", cv2.WINDOW_NORMAL)cv2.destroyAllWindows()print("OpenCV GUI功能正常!")
except Exception as e:print(f"OpenCV GUI功能異常: {e}")

運行此腳本驗證OpenCV安裝是否成功。

第一個程序:"Hello OpenCV"

我們將創建一個簡單的程序,實現以下功能:

  1. 讀取一張圖片
  2. 在圖片上顯示"Hello OpenCV"文字
  3. 顯示圖片
  4. 保存結果

創建一個Python文件,例如hello_opencv.py

 

python

import cv2
import numpy as np# 創建一個純色背景圖像(500x300的藍色背景)
# OpenCV中顏色順序是BGR(藍、綠、紅)而不是RGB
image = np.zeros((300, 500, 3), dtype=np.uint8)
image[:] = (255, 127, 0)  # 橙色背景# 添加文字
text = "Hello OpenCV!"
font = cv2.FONT_HERSHEY_SIMPLEX
font_scale = 1.5
font_thickness = 3
text_color = (255, 255, 255)  # 白色文字# 獲取文本大小,以便居中
(text_width, text_height), baseline = cv2.getTextSize(text, font, font_scale, font_thickness)
x = (image.shape[1] - text_width) // 2  # 計算文本起始x坐標(居中)
y = (image.shape[0] + text_height) // 2  # 計算文本起始y坐標(居中)# 在圖像上繪制文本
cv2.putText(image, text, (x, y), font, font_scale, text_color, font_thickness)# 在窗口中顯示圖像
window_name = "First OpenCV Program"
cv2.namedWindow(window_name)
cv2.imshow(window_name, image)# 保存圖像
cv2.imwrite("hello_opencv.jpg", image)
print("圖像已保存為 'hello_opencv.jpg'")# 等待直到按下任意鍵
print("按任意鍵關閉窗口...")
cv2.waitKey(0)
cv2.destroyAllWindows()

代碼講解:

  1. import cv2:導入OpenCV庫。
  2. import numpy as np:導入NumPy庫,用于圖像矩陣操作。
  3. image = np.zeros((300, 500, 3), dtype=np.uint8):創建一個黑色圖像,大小為300x500像素,3個顏色通道。
  4. image[:] = (255, 127, 0):將圖像背景設為橙色。注意OpenCV中顏色順序是BGR(藍、綠、紅)。
  5. cv2.putText():在圖像上繪制文字。
  6. cv2.namedWindow():創建一個命名窗口。
  7. cv2.imshow():在窗口中顯示圖像。
  8. cv2.imwrite():保存圖像到文件。
  9. cv2.waitKey(0):等待按鍵輸入,參數0表示無限等待。
  10. cv2.destroyAllWindows():關閉所有窗口。

運行結果:

  • 一個帶有"Hello OpenCV!"文字的橙色窗口
  • 生成的圖像將保存為hello_opencv.jpg

這是你的第一個OpenCV程序!恭喜!現在我們已經完成了OpenCV的安裝和基本配置,接下來將深入學習圖像基礎知識。

2. 圖像基礎

圖像的數字表示方式

在計算機中,圖像以二維或三維矩陣(數組)的形式存儲:

灰度圖像:

  • 二維矩陣,每個元素代表一個像素
  • 像素值范圍通常為0-255(8位),0表示黑色,255表示白色
  • 例如:100×100的灰度圖像是一個100×100的二維矩陣

彩色圖像:

  • 三維矩陣,其中第三個維度表示顏色通道
  • 常見的RGB圖像有3個通道:紅、綠、藍
  • 在OpenCV中,顏色通道順序為BGR(藍、綠、紅)
  • 像素值范圍通常為每通道0-255(8位)
  • 例如:100×100的彩色RGB圖像是一個100×100×3的三維矩陣

圖像數據類型: 在OpenCV中,圖像通常使用NumPy數組表示,常見的數據類型有:

  • uint8:無符號8位整數(0-255),最常用
  • float32:32位浮點數,用于高精度計算
  • float64:64位浮點數

讓我們創建一個程序來理解圖像的數字表示:

 

python

import cv2
import numpy as np
import matplotlib.pyplot as plt# 創建一個簡單的灰度漸變圖像
gradient = np.linspace(0, 255, 256, dtype=np.uint8)
gradient = np.tile(gradient, (100, 1))# 創建一個簡單的彩色圖像
color_channels = np.zeros((100, 256, 3), dtype=np.uint8)
color_channels[:, :, 0] = np.linspace(0, 255, 256, dtype=np.uint8)  # 藍色通道
color_channels[:, :, 1] = np.linspace(0, 255, 256, dtype=np.uint8)  # 綠色通道
color_channels[:, :, 2] = np.linspace(0, 255, 256, dtype=np.uint8)  # 紅色通道# 顯示圖像
plt.figure(figsize=(10, 6))plt.subplot(2, 1, 1)
plt.title('灰度漸變圖像')
plt.imshow(gradient, cmap='gray')
plt.axis('off')plt.subplot(2, 1, 2)
plt.title('RGB漸變圖像')
plt.imshow(cv2.cvtColor(color_channels, cv2.COLOR_BGR2RGB))  # 轉換BGR為RGB用于正確顯示
plt.axis('off')plt.tight_layout()
plt.savefig('gradients.png')
plt.show()# 打印圖像形狀和數據類型
print(f"灰度圖像形狀: {gradient.shape}, 數據類型: {gradient.dtype}")
print(f"彩色圖像形狀: {color_channels.shape}, 數據類型: {color_channels.dtype}")# 查看特定位置的像素值
position = (50, 150)  # 第50行,第150列
print(f"灰度圖像在位置{position}的像素值: {gradient[position]}")
print(f"彩色圖像在位置{position}的像素值: {color_channels[position]}")

代碼講解:

  1. 創建了一個灰度漸變圖像(從黑到白)
  2. 創建了一個RGB漸變圖像(從黑到白)
  3. 使用matplotlib顯示這些圖像
  4. 打印圖像的形狀和數據類型
  5. 查看特定位置的像素值

注意:我們使用cv2.cvtColor()函數將BGR轉換為RGB,因為OpenCV使用BGR順序,而matplotlib使用RGB順序。

色彩空間(RGB、HSV、灰度圖)

顏色空間是表示顏色的不同方法。最常見的色彩空間包括:

RGB(紅-綠-藍):

  • 最常見的色彩空間,使用紅、綠、藍三個通道的組合表示顏色
  • 每個通道值范圍為0-255(8位)
  • 在OpenCV中,默認顏色順序是BGR而不是RGB

HSV(色調-飽和度-明度):

  • 色調(H):顏色種類,范圍0-179(在OpenCV中,對應0-360度)
  • 飽和度(S):顏色的純度/鮮艷程度,范圍0-255
  • 明度(V):顏色的亮度,范圍0-255
  • 比RGB更接近人類感知顏色的方式
  • 常用于顏色追蹤和分割

灰度(Grayscale):

  • 單通道,只有亮度信息,沒有顏色信息
  • 值范圍通常為0-255,0表示黑色,255表示白色
  • 計算量小,常用于不需要顏色信息的任務

讓我們編寫一個程序來實現不同色彩空間的轉換和比較:

 

python

import cv2
import numpy as np
import matplotlib.pyplot as plt# 創建一個彩色測試圖像(彩虹漸變)
def create_rainbow():# 創建一個大小為200x300的彩虹圖像rainbow = np.zeros((200, 300, 3), dtype=np.uint8)# 為了簡化,我們創建一個水平的彩虹漸變for i in range(300):# 將位置映射到0-360的色調值(對應OpenCV中的0-179)hue = int(i / 300 * 180)# 創建一個滿飽和度、滿亮度的HSV顏色rainbow_hsv = np.ones((200, 1, 3), dtype=np.uint8) * np.array([hue, 255, 255], dtype=np.uint8)# 轉換為BGRrainbow[:, i:i+1] = cv2.cvtColor(rainbow_hsv, cv2.COLOR_HSV2BGR)return rainbow# 創建彩虹圖像
rainbow = create_rainbow()# 轉換為不同的色彩空間
rainbow_rgb = cv2.cvtColor(rainbow, cv2.COLOR_BGR2RGB)  # BGR到RGB
rainbow_hsv = cv2.cvtColor(rainbow, cv2.COLOR_BGR2HSV)  # BGR到HSV
rainbow_gray = cv2.cvtColor(rainbow, cv2.COLOR_BGR2GRAY)  # BGR到灰度# 顯示不同色彩空間的圖像
plt.figure(figsize=(12, 10))plt.subplot(4, 1, 1)
plt.title('原始圖像 (BGR轉RGB顯示)')
plt.imshow(rainbow_rgb)
plt.axis('off')plt.subplot(4, 1, 2)
plt.title('HSV色彩空間 - 色調(H)通道')
plt.imshow(rainbow_hsv[:, :, 0], cmap='hsv')
plt.axis('off')plt.subplot(4, 1, 3)
plt.title('HSV色彩空間 - 飽和度(S)和亮度(V)通道')
plt.imshow(np.dstack([np.zeros_like(rainbow_hsv[:, :, 1]), rainbow_hsv[:, :, 1], rainbow_hsv[:, :, 2]]), cmap='gray')
plt.axis('off')plt.subplot(4, 1, 4)
plt.title('灰度圖像')
plt.imshow(rainbow_gray, cmap='gray')
plt.axis('off')plt.tight_layout()
plt.savefig('color_spaces.png')
plt.show()# 展示H、S、V三個獨立通道
plt.figure(figsize=(12, 8))plt.subplot(3, 1, 1)
plt.title('HSV - 色調(H)通道')
plt.imshow(rainbow_hsv[:, :, 0], cmap='hsv')
plt.axis('off')plt.subplot(3, 1, 2)
plt.title('HSV - 飽和度(S)通道')
plt.imshow(rainbow_hsv[:, :, 1], cmap='gray')
plt.axis('off')plt.subplot(3, 1, 3)
plt.title('HSV - 亮度(V)通道')
plt.imshow(rainbow_hsv[:, :, 2], cmap='gray')
plt.axis('off')plt.tight_layout()
plt.savefig('hsv_channels.png')
plt.show()

代碼講解:

  1. create_rainbow()函數創建了一個彩虹漸變圖像,展示從紅到紫的完整色彩范圍
  2. 使用cv2.cvtColor()函數將圖像從BGR轉換到其他色彩空間
  3. 使用matplotlib顯示不同色彩空間的圖像和HSV的各個通道
  4. cv2.COLOR_BGR2RGBcv2.COLOR_BGR2HSVcv2.COLOR_BGR2GRAY是OpenCV中的色彩空間轉換常量

OpenCV中常用的色彩空間轉換常量:

  • cv2.COLOR_BGR2RGB:BGR→RGB
  • cv2.COLOR_RGB2BGR:RGB→BGR
  • cv2.COLOR_BGR2GRAY:BGR→灰度
  • cv2.COLOR_GRAY2BGR:灰度→BGR
  • cv2.COLOR_BGR2HSV:BGR→HSV
  • cv2.COLOR_HSV2BGR:HSV→BGR
  • cv2.COLOR_BGR2Lab:BGR→Lab
  • cv2.COLOR_Lab2BGR:Lab→BGR

圖像讀取、顯示與保存

現在,讓我們學習如何使用OpenCV讀取、顯示和保存圖像,這是計算機視覺應用的基本操作。

圖像讀取

OpenCV提供了cv2.imread()函數來讀取圖像:

 

python

image = cv2.imread('path/to/image.jpg')

imread()有兩個參數:

  1. 文件路徑
  2. 讀取標志(可選),常用的有:
    • cv2.IMREAD_COLOR:以彩色模式讀取圖像(默認)
    • cv2.IMREAD_GRAYSCALE:以灰度模式讀取圖像
    • cv2.IMREAD_UNCHANGED:讀取圖像,包括alpha通道(如果有)
圖像顯示

OpenCV使用cv2.imshow()函數顯示圖像:

 

python

cv2.imshow('Window Name', image)
cv2.waitKey(0)  # 等待按鍵
cv2.destroyAllWindows()  # 關閉所有窗口
圖像保存

OpenCV使用cv2.imwrite()函數保存圖像:

 

python

cv2.imwrite('output.jpg', image)

讓我們編寫一個完整的程序來演示這些操作:

 

python

import cv2
import os
import sysdef process_image(image_path):"""讀取、顯示和保存圖像的基本演示"""# 檢查文件是否存在if not os.path.isfile(image_path):print(f"錯誤: 文件 '{image_path}' 不存在")return# 讀取圖像(以彩色模式)color_image = cv2.imread(image_path, cv2.IMREAD_COLOR)if color_image is None:print(f"錯誤: 無法讀取圖像 '{image_path}'")return# 讀取圖像(以灰度模式)gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)# 獲取圖像信息height, width = color_image.shape[:2]channels = 1 if len(color_image.shape) == 2 else color_image.shape[2]# 打印圖像信息print(f"圖像信息:")print(f"- 路徑: {image_path}")print(f"- 寬度 x 高度: {width} x {height} 像素")print(f"- 通道數: {channels}")print(f"- 數據類型: {color_image.dtype}")print(f"- 文件大小: {os.path.getsize(image_path) / 1024:.2f} KB")# 創建輸出文件夾output_dir = "output"if not os.path.exists(output_dir):os.makedirs(output_dir)# 保存灰度圖像gray_output_path = os.path.join(output_dir, "gray_" + os.path.basename(image_path))cv2.imwrite(gray_output_path, gray_image)print(f"灰度圖像已保存到: {gray_output_path}")# 顯示圖像cv2.namedWindow("彩色圖像", cv2.WINDOW_NORMAL)cv2.namedWindow("灰度圖像", cv2.WINDOW_NORMAL)cv2.imshow("彩色圖像", color_image)cv2.imshow("灰度圖像", gray_image)print("按 'Esc' 鍵關閉窗口...")while True:key = cv2.waitKey(0) & 0xFFif key == 27:  # Esc鍵breakcv2.destroyAllWindows()if __name__ == "__main__":# 如果提供了命令行參數,使用它作為圖像路徑# 否則,使用默認圖像if len(sys.argv) > 1:image_path = sys.argv[1]else:# 使用內置的示例圖像或當前目錄中的示例圖像# 如果沒有圖像,將提示用戶sample_images = ["sample.jpg", "test.jpg", "image.jpg"]found = Falsefor img in sample_images:if os.path.isfile(img):image_path = imgfound = Truebreakif not found:print("請提供圖像路徑作為命令行參數,或確保當前目錄有示例圖像。")print("用法: python image_io.py <圖像路徑>")sys.exit(1)process_image(image_path)

代碼講解:

  1. cv2.imread() 函數讀取圖像,可以選擇彩色或灰度模式
  2. 我們獲取并打印圖像的基本信息(尺寸、通道數、數據類型等)
  3. cv2.imwrite() 函數將灰度圖像保存到輸出目錄
  4. cv2.namedWindow() 創建窗口,指定 cv2.WINDOW_NORMAL 允許調整窗口大小
  5. cv2.imshow() 在各自的窗口中顯示彩色和灰度圖像
  6. cv2.waitKey(0) 等待按鍵,& 0xFF 確保在不同平臺上正確工作
  7. cv2.destroyAllWindows() 關閉所有OpenCV窗口

運行程序:

  1. 將代碼保存為 image_io.py
  2. 運行命令 python image_io.py path/to/your/image.jpg
  3. 如果沒有提供圖像路徑,程序將嘗試在當前目錄中查找示例圖像
實用技巧:使用matplotlib顯示圖像

OpenCV的imshow()函數很強大,但有時使用matplotlib可能更方便,特別是當你想比較多個圖像時:

 

python

import cv2
import matplotlib.pyplot as plt# 讀取圖像
image = cv2.imread('path/to/image.jpg')# 將BGR轉換為RGB(matplotlib使用RGB順序)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)# 使用matplotlib顯示圖像
plt.figure(figsize=(10, 8))
plt.imshow(image_rgb)
plt.title('使用Matplotlib顯示圖像')
plt.axis('off')  # 隱藏坐標軸
plt.show()

3. 基本圖像操作

像素訪問與修改

在OpenCV中,圖像被表示為NumPy數組,因此可以直接使用NumPy的索引操作來訪問和修改像素值。

訪問像素值
 

python

# 訪問(y, x)位置的像素值(注意:先是y行,再是x列)
pixel = image[y, x]# 對于灰度圖像,pixel是一個標量
# 對于彩色圖像,pixel是一個含有B,G,R值的數組
修改像素值
 

python

# 修改(y, x)位置的像素值
image[y, x] = new_value# 對于灰度圖像,new_value是一個標量
# 對于彩色圖像,new_value是[B, G, R]

讓我們編寫一個程序來演示像素訪問和修改:

 

python

import cv2
import numpy as np
import matplotlib.pyplot as plt# 創建一個簡單的圖像
def create_test_image():# 創建白色背景image = np.ones((300, 400, 3), dtype=np.uint8) * 255# 繪制一個藍色矩形cv2.rectangle(image, (50, 50), (200, 150), (255, 0, 0), thickness=-1)# 繪制一個綠色圓形cv2.circle(image, (300, 150), 80, (0, 255, 0), thickness=-1)# 繪制紅色文字font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(image, "OpenCV", (100, 250), font, 2, (0, 0, 255), 3)return image# 創建測試圖像
original_image = create_test_image()# 復制原始圖像以便修改
modified_image = original_image.copy()# 1. 單個像素修改 - 創建一個小點
for i in range(-3, 4):for j in range(-3, 4):if i*i + j*j <= 9:  # 創建一個小圓點y, x = 150 + i, 250 + jmodified_image[y, x] = [0, 0, 0]  # 黑色點# 2. 區域修改 - 反轉一個矩形區域內的顏色
x1, y1, x2, y2 = 100, 50, 150, 100
roi = modified_image[y1:y2, x1:x2]
modified_image[y1:y2, x1:x2] = 255 - roi# 3. 像素值分析
# 獲取某一點的像素值
pixel_point = (300, 150)  # x=300, y=150
pixel_value = original_image[pixel_point[1], pixel_point[0]]
print(f"點 {pixel_point} 處的像素值 (BGR): {pixel_value}")# 獲取某一區域的像素值統計
roi = original_image[50:100, 150:200]
mean_value = np.mean(roi, axis=(0, 1))
min_value = np.min(roi, axis=(0, 1))
max_value = np.max(roi, axis=(0, 1))print(f"選定區域的平均像素值 (BGR): {mean_value}")
print(f"選定區域的最小像素值 (BGR): {min_value}")
print(f"選定區域的最大像素值 (BGR): {max_value}")# 在圖像上標記分析的位置
analysis_image = original_image.copy()
cv2.circle(analysis_image, pixel_point, 5, (0, 0, 0), -1)
cv2.rectangle(analysis_image, (150, 50), (200, 100), (0, 0, 0), 2)# 顯示結果
plt.figure(figsize=(15, 5))plt.subplot(1, 3, 1)
plt.imshow(cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB))
plt.title('原始圖像')
plt.axis('off')plt.subplot(1, 3, 2)
plt.imshow(cv2.cvtColor(modified_image,

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

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

相關文章

虛幻商城 Quixel 免費資產自動化入庫(2025年版)

文章目錄 一、背景二、問題講解1. Quixel 免費資產是否還能一鍵入庫?2. 是不是使用了一鍵入庫功能 Quixel 的所有資產就能入庫了?3. 一鍵入庫會入庫哪些資產?三、實現效果展示四、實現自動化入庫五、常見問題1. 出現401報錯2. 出現429報錯3. 入庫過于緩慢4. 入庫 0 個資產一…

uni-app - 小程序使用高德地圖完整版

文章目錄 ??功能描述??效果??開發環境??代碼部分??功能描述 頁面自動通過定位獲取用戶位置并展示周邊POI數據,同時支持關鍵詞輸入實時聯想推薦關聯地點信息, 實現精準智能的地點發現與檢索功能。 ??效果 ??開發環境 unibest2.5.4nodev18.20.5pnpm9.14.2wot-des…

牛客:AB4 逆波蘭表達式求值

鏈接&#xff1a;逆波蘭表達式求值_牛客題霸_牛客網 題解&#xff1a; 利用棧&#xff0c;遍歷字符串數組&#xff0c;遇到運算數則入棧&#xff0c;遇到運算符則取出棧頂兩個運算數進行運算&#xff0c;并將運算結果入棧。 class Solution { public:/*** 代碼中的類名、方法…

Ant(Ubuntu 18.04.6 LTS)安裝筆記

一、前言 本文與【MySQL 8&#xff08;Ubuntu 18.04.6 LTS&#xff09;安裝筆記】同批次&#xff1a;先搭建數據庫&#xff0c;再安裝JDK&#xff0c;后面肯定就是部署Web應用。其中Web應用的部署使用 Ant 方式&#xff0c;善始善終&#xff0c;特以筆記。 二、準備 &#xf…

ultralytics 目標檢測 混淆矩陣 背景圖像 沒被記錄

修改 utils/metrics.py ConfusionMatrix def process_batch(self, detections, gt_bboxes, gt_cls):"""Update confusion matrix for object detection task.Args:detections (Array[N, 6] | Array[N, 7]): Detected bounding boxes and their associated inf…

iview 如何設置sider寬度

iview layout組件中&#xff0c;sider設置了默認寬度和最大寬度&#xff0c;在css樣式文件中修改無效&#xff0c;原因是iview默認樣式設置在了element.style中&#xff0c;只能通過行內樣式修改 樣式如下&#xff1a; image.png image.png 修改方式&#xff1a; 1.官方文檔中寫…

go-zero(十七)結合DTM :實現分布式事務

1. 基礎概念介紹 1.1 什么是分布式事務 在微服務架構中&#xff0c;一個業務操作常常需要調用多個服務來完成。例如&#xff0c;在電商系統中下單時&#xff0c;需要同時操作訂單服務和庫存服務。這種跨服務的操作就需要分布式事務來保證數據一致性。 分布式事務面臨以下挑戰…

2025 簡易Scrum指南(簡體中文版)

Scrum是一個輕量級的、以團隊為中心的框架&#xff0c;用于解決復雜的問題并創造價值。Scrum有意保持非完整性&#xff0c;Scrum的設計初衷旨在依靠使用者的集體智慧來不斷演進構建。 Scrum建立在實驗主義和精益思想的基礎上&#xff0c;它賦能團隊靈活巧妙地工作&#xff0c;…

2025最新福昕PDF編輯器,PDF萬能處理工具

軟件介紹 Foxit PDF Editor Pro 2025 中文特別版&#xff08;以前稱為 Foxit PhantomPDF Business&#xff09;是一款專為滿足各種辦公需求而設計的業務就緒的PDF工具包。 軟件特點 1. 強大的PDF編輯能力 創建新文檔&#xff1a;用戶可以從無到有地構建PDF文檔&#xff0c;添…

ollama的若干實踐

1. 本地ollama 1.1 本地安裝ollama 方法 1&#xff1a;手動檢查最新版本并下載 訪問 Ollama 的 GitHub Releases 頁面&#xff1a; 打開 https://github.com/ollama/ollama/releases 查看最新的穩定版本&#xff08;如 v0.7.0 或更高&#xff09; 手動下載最新版本&#xff08…

Spring Security源碼解析

秒懂SpringBoot之全網最易懂的Spring Security教程 SpringBoot整合Spring-Security 認證篇&#xff08;保姆級教程&#xff09; SpringBoot整合Spring Security【超詳細教程】 spring security 超詳細使用教程&#xff08;接入springboot、前后端分離&#xff09; Security 自…

LeetCode 3392.統計符合條件長度為 3 的子數組數目:一次遍歷模擬

【LetMeFly】3392.統計符合條件長度為 3 的子數組數目&#xff1a;一次遍歷模擬 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/count-subarrays-of-length-three-with-a-condition/ 給你一個整數數組 nums &#xff0c;請你返回長度為 3 的 子數組&#xff0c;滿足…

讀論文筆記-CoOp:對CLIP的handcrafted改進

讀論文筆記-Learning to Prompt for Vision-Language Models Problems 現有基于prompt engineering的多模態模型在設計合適的prompt時有很大困難&#xff0c;從而設計了一種更簡單的方法來制作prompt。 Motivations prompt engineering雖然促進了視覺表示的學習&#xff0c…

從零構建 MCP Server 與 Client:打造你的第一個 AI 工具集成應用

目錄 &#x1f680; 從零構建 MCP Server 與 Client&#xff1a;打造你的第一個 AI 工具集成應用 &#x1f9f1; 1. 準備工作 &#x1f6e0;? 2. 構建 MCP Server&#xff08;服務端&#xff09; 2.1 初始化服務器 &#x1f9e9; 3. 添加自定義工具&#xff08;Tools&…

Django 自定義celery-beat調度器,查詢自定義表的Cron表達式進行任務調度

學習目標&#xff1a; 通過自定義的CronScheduler調度器在兼容標準的調度器的情況下&#xff0c;查詢自定義任務表去生成調度任務并分配給celery worker進行執行 不了解Celery框架的小伙伴可以先看一下我的上一篇文章&#xff1a;Celery框架組件分析及使用 學習內容&#xff…

藍橋杯 1. 確定字符串是否包含唯一字符

確定字符串是否包含唯一字符 原題目鏈接 題目描述 實現一個算法來識別一個字符串的字符是否是唯一的&#xff08;忽略字母大小寫&#xff09;。 若唯一&#xff0c;則輸出 YES&#xff0c;否則輸出 NO。 輸入描述 輸入一行字符串&#xff0c;長度不超過 100。 輸出描述 輸…

a-upload組件實現文件的上傳——.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt

實現下面的上傳/下載/刪除功能&#xff1a;要求支持&#xff1a;【.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt】 分析上面的效果圖&#xff0c;分為【上傳】按鈕和【文件列表】功能&#xff1a; 解決步驟1&#xff1a;上傳按鈕 直接上代碼&#xff1a; <a-uploadmultip…

.NET Core 數據庫ORM框架用法簡述

.NET Core ORM框架用法簡述 一、主流.NET Core ORM框架概述 在.NET Core生態系統中&#xff0c;主流的ORM(Object-Relational Mapping)框架包括&#xff1a; ??Entity Framework Core (EF Core)?? - 微軟官方推出的ORM框架??Dapper?? - 輕量級微ORM??Npgsql.Entit…

halcon打開圖形窗口

1、dev_open_window 參數如下&#xff1a; 1&#xff09;Row(輸入參數) y方向上&#xff0c;圖形窗口距離左上角頂端的像素個數 2&#xff09;Column(輸入參數) x方向上&#xff0c;距離左上角左邊的像素個數 3&#xff09;Width(輸入參數) 圖形窗口寬度 4&#xff09;He…

2025東三省D題深圳杯D題數學建模挑戰賽數模思路代碼文章教學

完整內容請看文章最下面的推廣群 一、問題一&#xff1a;混合STR圖譜中貢獻者人數判定 問題解析 給定混合STR圖譜&#xff0c;識別其中的真實貢獻者人數是后續基因型分離與個體識別的前提。圖譜中每個位點最多應出現2n個峰&#xff08;n為人數&#xff09;&#xff0c;但由…