(一)?opencv和opencv-contrib的安裝
(1.1)在桌面地底部的搜索欄,搜索命令提示符,點擊并打開命令提示符
(1.2)依次輸入命令并按回車:pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple和pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple
(二)在pycharm軟件中,用python語言,opencv庫實現以下功能
此代碼主要完成以下任務:
- 讀取并顯示一張本地圖片
- 交互式控制窗口行為
- 輸出圖像的基礎元信息
完整執行流程:
添加了逐行詳細注釋的完整代碼及預期輸出示例:
# ✅ 1. 導入必要的庫
import cv2 # OpenCV庫用于圖像處理與計算機視覺任務
import numpy as np # NumPy庫用于高效處理多維數組(圖像本質是數組)# 📁 2. 讀取本地圖像文件
a = cv2.imread('1.jpg') # 從當前工作目錄讀取名為'1.jpg'的圖像文件
# ▶? 成功時返回一個NumPy數組(形狀=[高度, 寬度, 通道數]),失敗返回None# 🖥? 3. 顯示圖像窗口
cv2.imshow('tu', a) # 創建名為'tu'的窗口并顯示圖像a
# ⚠? 注意:此語句不會自動暫停,需配合waitKey()才能看到效果# ⏸? 4. 等待用戶按鍵輸入
b = cv2.waitKey(0) # 阻塞程序執行,直到用戶按下任意鍵
# 🔑 參數0表示無限期等待,返回值為按下的鍵對應的ASCII碼(本例未使用該值)# ✖? 5. 關閉所有OpenCV窗口
cv2.destroyAllWindows() # 釋放所有創建的GUI窗口資源# 📝 6-8. 輸出圖像元信息
print("圖像形狀(shape):", a.shape) # 輸出數組維度:[高, 寬, 通道數]
print("圖像數據類型(dtype):", a.dtype) # 輸出像素的數據類型(通常為uint8)
print("圖像大小(size):", a.size) # 輸出總像素數(高×寬×通道數)
圖像形狀(shape): (480, 640, 3)
圖像數據類型(dtype): uint8
圖像大小(size): 921600
此代碼主要完成以下任務:
- 灰度化處理與保存
- 圖像區域裁剪與可視化對比
- 圖像元信息輸出
- 多窗口交互式顯示
完整執行流程:
添加了逐行詳細注釋的完整代碼及預期輸出示例:
# -*- coding: utf-8 -*-
import cv2 # 導入OpenCV庫,用于圖像處理與計算機視覺任務# ==================== 第一階段:灰度化處理 & 基礎信息輸出 ====================
# 📷 1. 以灰度模式讀取圖像
b = cv2.imread(filename=r'./1.jpg', flags=cv2.IMREAD_GRAYSCALE) # ✅ 關鍵參數:flags=cv2.IMREAD_GRAYSCALE
# ? 功能:將輸入圖像轉換為單通道灰度圖(而非默認的BGR三通道)
# ? 返回值:NumPy數組,形狀為 [高度, 寬度](二維數組)# 🖥? 2. 顯示灰度圖像窗口
cv2.imshow(winname='zz', mat=b) # 創建名為 'zz' 的窗口并顯示灰度圖 b
# ? 注意:此語句不會自動暫停,需配合 waitKey() 才能看到效果# ⏸? 3. 等待用戶按鍵(防止窗口一閃而過)
a = cv2.waitKey(0) # 阻塞程序執行,直到用戶按下任意鍵
# ? 參數 0 表示無限期等待,返回值為按下的鍵對應的 ASCII 碼(本例未使用該值)# ✖? 4. 關閉所有OpenCV窗口
cv2.destroyAllWindows() # 釋放所有創建的GUI窗口資源# 📝 5-7. 輸出灰度圖的元信息
print("圖像形狀(shape):", b.shape) # 輸出數組維度:[高度, 寬度](灰度圖為二維)
print("圖像數據類型(dtype):", b.dtype) # 輸出像素的數據類型(通常為 uint8)
print("圖像大小(size):", b.size) # 輸出總像素數(高度 × 寬度)# 💾 8. 保存灰度圖到文件
cv2.imwrite(filename='timg98_GRAY.jpg', img=b) # 將灰度圖 b 保存為新文件
# ? 注意:若文件已存在會被覆蓋# ==================== 第二階段:圖像裁剪 & 雙窗口對比 ====================
# 📁 9. 重新讀取原始彩色圖像(未指定 flags 參數,默認按 BGR 三通道讀取)
a = cv2.imread(r'./1.jpg') # 返回 BGR 三通道圖像(形狀為 [高度, 寬度, 3])# ✂? 10. 裁剪圖像區域(基于NumPy數組切片)
b = a[30:230, 100:300] # 選取矩形區域:縱向 30~230px,橫向 100~300px
# ? Python切片規則:起始位置包含,終止位置不包含 → 實際裁剪尺寸:高=200px (230-30),寬=200px (300-100)# 🖥? 11-12. 同時顯示原圖與裁剪結果
cv2.imshow(winname='yuantu', mat=a) # 窗口標題 "yuantu"(原圖)
cv2.imshow(winname='qiepian', mat=b) # 窗口標題 "qiepian"(裁剪片段)# ⏸? 13. 等待用戶按鍵(保持雙窗口可見)
cv2.waitKey(0) # 阻塞程序執行,直到用戶按下任意鍵# ✖? 14. 關閉所有OpenCV窗口
cv2.destroyAllWindows() # 釋放所有創建的GUI窗口資源
圖像形狀(shape): (480, 640) # 灰度圖形狀(高 x 寬)
圖像數據類型(dtype): uint8 # 像素類型(0~255 的無符號整數)
圖像大小(size): 307200 # 總像素數 = 480 × 640
此代碼主要完成以下任務:
實時獲取攝像頭視頻流 → 轉灰度 → 顯示畫面
完整執行流程:
?
打開攝像頭:通過
cv2.VideoCapture(0)
打開默認攝像頭(編號0通常是筆記本內置攝像頭)檢查攝像頭是否成功打開:如果失敗,打印“無法打開視頻文件”并退出程序
實時讀取視頻幀:在一個無限循環中,逐幀讀取攝像頭畫面
將彩色畫面轉為灰度:使用
cv2.cvtColor
把每一幀從彩色(BGR)轉換成灰度圖像實時顯示灰度畫面:通過
cv2.imshow
在一個名為“Video”的窗口中顯示灰度畫面按 ESC 鍵退出:如果用戶按下鍵盤上的 ESC 鍵(ASCII碼27),則跳出循環
釋放資源:關閉攝像頭并銷毀所有 OpenCV 窗口,避免資源泄露
總結:這段代碼會打開你的攝像頭,把實時畫面變成黑白色,并持續顯示,直到你按下 ESC 鍵退出
添加了逐行詳細注釋的完整代碼及預期輸出示例:
import cv2 # 導入 OpenCV 庫
video_capture = cv2.VideoCapture(0) # 打開默認攝像頭(設備索引 0)
if not video_capture.isOpened(): # 檢查攝像頭是否成功打開print("無法打開視頻文件") # 若打開失敗,打印提示信息exit() # 退出程序
while True: # 無限循環,持續讀取攝像頭畫面ret, frame = video_capture.read() # 讀取一幀:ret 表示是否成功,frame 為圖像數據if not ret: # 如果讀取失敗(無畫面)break # 跳出循環frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 將彩色幀轉換為灰度圖像cv2.imshow('Video', frame) # 在名為 'Video' 的窗口中顯示當前幀if cv2.waitKey(1) == 27: # 等待 1 毫秒;若用戶按下 ESC(ASCII 27),則跳出循環break
video_capture.release() # 釋放攝像頭資源
cv2.destroyAllWindows() # 關閉所有由 OpenCV 創建的窗口
額外擴充:
cv2.VideoCapture('aiweier.mp4')
?→ 初始化視頻捕獲對象isOpened()
?→ 校驗文件可讀性while True
?+?read()
?→ 逐幀讀取視頻流cvtColor(..., COLOR_BGR2GRAY)
?→ 實時轉灰度圖imshow()
?+?waitKey(1)
?→ 動態顯示畫面 & 響應鍵盤事件release()
?/?destroyAllWindows()
?→ 資源清理import cv2 # 導入 OpenCV 庫,用于視頻和圖像處理# 創建 VideoCapture 對象,打開名為 'aiweier.mp4' 的視頻文件 video_capture = cv2.VideoCapture('aiweier.mp4')# 檢查視頻文件是否成功打開 if not video_capture.isOpened():print("無法打開視頻文件") # 如果無法打開,輸出錯誤提示exit() # 退出程序# 無限循環,用于逐幀讀取和顯示視頻 while True:# 從視頻中讀取下一幀ret, frame = video_capture.read()# 如果讀取失敗(如到達視頻末尾),則跳出循環if not ret:break# 將當前幀從 BGR 彩色圖像轉換為灰度圖像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 在名為 'Video' 的窗口中顯示當前幀cv2.imshow('Video', frame)# 等待鍵盤輸入,等待時間為 1 毫秒# 如果按下 ESC 鍵(ASCII 碼為 27),則跳出循環if cv2.waitKey(1) == 27:break# 釋放 VideoCapture 對象,關閉視頻文件 video_capture.release()# 銷毀所有 OpenCV 創建的窗口 cv2.destroyAllWindows()
代碼中去除以下代碼,代碼運行結果為彩色圖片
# 將當前幀從 BGR 彩色圖像轉換為灰度圖像frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
此代碼主要完成以下任務:
從彩色圖像中分離并可視化其藍(B)、綠(G)、紅(R)三個獨立顏色通道
?
顏色空間特性
- OpenCV 默認使用?BGR?而非 RGB 順序存儲顏色圖像,因此:
img[:, :, 0]
?→?藍色通道img[:, :, 1]
?→?綠色通道img[:, :, 2]
?→?紅色通道
- OpenCV 默認使用?BGR?而非 RGB 順序存儲顏色圖像,因此:
單通道顯示原理
- 每個顏色通道本質上是一個二維矩陣(高度×寬度),值范圍通常為?
0-255
- 當用?
imshow()
?顯示單通道時,OpenCV 自動將其解釋為?8位灰度圖像,其中:0
?= 純黑 → 該顏色成分完全缺失255
?= 純白 → 該顏色成分達到最大強度
- 每個顏色通道本質上是一個二維矩陣(高度×寬度),值范圍通常為?
兩種通道分離方式對比
- 切片法?(
img[:, :, n]
):直觀高效,適合少量通道提取 cv2.split()
:返回包含所有通道的列表,適用于批量處理多通道場景
- 切片法?(
完整執行流程:
添加了逐行詳細注釋的完整代碼及預期輸出示例:
import cv2
# 1. 讀取圖像(默認 BGR 順序)
img = cv2.imread('1.jpg')
if img is None:raise FileNotFoundError('圖像加載失敗,請檢查路徑')
# 2. 方法一:直接切片提取單個通道
b_ch = img[:, :, 0] # 藍色通道
g_ch = img[:, :, 1] # 綠色通道
r_ch = img[:, :, 2] # 紅色通道
# 3. 方法二:用 cv2.split 一次拆出三個通道
# b_ch, g_ch, r_ch = cv2.split(img)
# 4. 分別顯示三個通道(單通道圖像默認以灰度形式呈現)
cv2.imshow('Blue channel', b_ch)
cv2.imshow('Green channel', g_ch)
cv2.imshow('Red channel', r_ch)
# 5. 等待按鍵(0 表示無限等待,或給足夠大的毫秒數)
cv2.waitKey(0)
# 6. 關閉所有窗口
cv2.destroyAllWindows()
此代碼主要完成以下任務:
從輸入圖像中提取并突出顯示藍色通道的信息
完整執行流程:
添加了逐行詳細注釋的完整代碼及預期輸出示例:
# -*- coding: utf-8 -*-
"""
功能:讀取一張彩色圖,只保留藍色通道,其余通道置 0,并顯示結果
"""# 1. 導入庫
import cv2
import numpy as np # 預留,方便后續擴展# 2. 讀取原始圖像(默認 BGR 順序)
img = cv2.imread('1.jpg') # 在當前工作目錄下查找 1.jpg
if img is None: # 讀取失敗時 img 為 Noneraise FileNotFoundError('圖像加載失敗,請檢查 1.jpg 是否存在及路徑是否正確')# 3. 復制一份,避免修改原圖
img_blue = img.copy() # 得到與原圖同尺寸、同內容的備份# 4. 只保留藍色通道:將綠色、紅色通道全部置 0
# OpenCV 中 BGR 順序:0-藍色(B),1-綠色(G),2-紅色(R)
img_blue[:, :, 1] = 0 # 綠色通道全部設為 0
img_blue[:, :, 2] = 0 # 紅色通道全部設為 0
# 此時 img_blue 中僅 B 通道有值,其余兩通道為 0,整體呈藍色調# 5. 顯示結果
cv2.imshow('Blue-only color image', img_blue) # 創建一個窗口并顯示處理后的圖像
cv2.waitKey(0) # 無限等待,直到鍵盤任意按鍵
cv2.destroyAllWindows() # 銷毀所有已創建的窗口
此代碼主要完成以下任務:
演示如何使用 OpenCV 分離圖像的 BGR 三通道并重新合并回原始彩色圖像
完整執行流程:
步驟 | 代碼行 | 作用(一句話說明) |
---|---|---|
1 | import cv2 | 引入 OpenCV 庫,準備圖像處理 |
2 | img = cv2.imread('1.jpg') | 把當前目錄里的?1.jpg ?讀進內存,得到 BGR 彩色矩陣 |
3 | if img is None: | 若文件不存在或讀取失敗,立即報錯并終止程序 |
4 | b, g, r = cv2.split(img) | 把彩色圖拆成 3 張灰度圖:藍通道、綠通道、紅通道 |
5 | merged = cv2.merge((b, g, r)) | 把這三張灰度圖按 B-G-R 順序重新合并成一張與原圖相同的彩色圖 |
6 | cv2.imshow('Merged BGR', merged) | 打開窗口,標題為?Merged BGR ,顯示合并后的彩色圖 |
7 | cv2.waitKey(0) | 暫停程序,等待用戶按任意鍵 |
8 | cv2.destroyAllWindows() | 關閉所有 OpenCV 窗口,釋放資源,程序結束 |
添加了逐行詳細注釋的完整代碼及預期輸出示例:
import cv2 # 導入 OpenCV 庫,用于圖像讀寫與顯示# 1. 讀取圖像(默認 BGR 順序)
img = cv2.imread('1.jpg') # 從當前工作目錄加載 '1.jpg',返回三維 BGR 數組
if img is None: # 檢查是否加載成功raise FileNotFoundError('圖片路徑錯誤或文件不存在') # 若失敗,立即拋出異常并終止程序# 2. 分離 BGR 三通道
b, g, r = cv2.split(img) # 把 BGR 圖像拆成 3 個單通道數組:b(藍)、g(綠)、r(紅)# 等價于 b = img[:, :, 0]; g = img[:, :, 1]; r = img[:, :, 2]# 3. 重新合并三通道,得到與原圖一致的彩色圖
merged = cv2.merge((b, g, r)) # 把 b、g、r 三個二維數組按順序疊成一幅新的三通道彩色圖# 也可寫成 cv2.merge([b, g, r])# 4. 顯示結果
cv2.imshow('Merged BGR', merged) # 創建名為 'Merged BGR' 的窗口并展示合并后的彩色圖
cv2.waitKey(0) # 無限等待鍵盤事件;按任意鍵后繼續
cv2.destroyAllWindows() # 銷毀所有已打開的 OpenCV 窗口,釋放資源
此代碼主要完成以下任務:
對一張圖片的局部區域進行隨機著色并顯示結果
完整執行流程:
步驟 | 代碼行 | 作用說明 |
---|---|---|
1 | import cv2 | 導入 OpenCV 庫,用于圖像讀寫與顯示 |
2 | import numpy as np | 導入 NumPy 庫,方便生成隨機數組并進行矩陣操作 |
3 | a = cv2.imread('1.jpg') | 讀取磁盤文件?1.jpg ,將其加載為 NumPy 數組并存入變量?a |
4 | a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3)) | 在?a ?的指定區域(行 100–199、列 200–299)上覆蓋隨機彩色像素,實現打碼/馬賽克效果 |
5 | cv2.imshow('masaike', a) | 新建名為?masaike ?的窗口,并在其中顯示處理后的圖像?a |
6 | cv2.waitKey(1000000) | 等待鍵盤事件,最長約 1000 秒;期間窗口保持顯示 |
7 | cv2.destroyAllWindows() | 關閉所有由 OpenCV 創建的窗口,釋放資源 |
添加了逐行詳細注釋的完整代碼及預期輸出示例:
import cv2 # 導入 OpenCV 庫,用于圖像的讀取、顯示與保存
import numpy as np # 導入 NumPy 庫,用于高效的數組操作與隨機數生成# 1. 從當前目錄讀取圖像文件 1.jpg,返回一個三維的 BGR 圖像數組
a = cv2.imread('1.jpg')# 2. 在圖像 a 的指定區域(行 100~199,列 200~299)上覆蓋隨機彩色像素塊
# np.random.randint(0, 256, (100, 100, 3)) 生成形狀為 (100, 100, 3) 的隨機整數矩陣,
# 每個元素取值范圍 [0, 255],對應 BGR 三通道,實現“馬賽克”或“打碼”效果
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3))# 3. 創建一個名為 'masaike' 的窗口,并在其中顯示處理后的圖像 a
cv2.imshow('masaike', a)# 4. 等待鍵盤事件,最長等待 1 000 000 毫秒(≈ 1000 秒)
# 期間窗口保持顯示,按任意鍵可提前結束等待
cv2.waitKey(1000000)# 5. 銷毀所有由 OpenCV 創建的窗口,釋放資源
cv2.destroyAllWindows()
此代碼主要完成以下任務:
將一張圖片(1.jpg
)的特定區域復制到另一張圖片(mimi.jpg
)的指定位置,并同步顯示兩張圖片的效果
完整執行流程:
步驟 | 代碼 | 作用說明 |
---|---|---|
1 | import cv2 | 載入 OpenCV 庫,提供圖像讀寫與顯示功能 |
2 | a = cv2.imread('1.jpg') | 讀取圖像文件?1.jpg ?并存儲到變量?a |
3 | b = cv2.imread('mimi.jpg') | 讀取圖像文件?mimi.jpg ?并存儲到變量?b |
4 | b[200:350, 200:350] = a[50:200, 100:250] | 將?a ?中第 50–199 行、100–249 列的像素區域復制到?b ?的第 200–349 行、200–349 列,實現區域替換;要求兩塊區域尺寸一致(150×150) |
5 | cv2.imshow('b', b) | 創建名為?b ?的窗口并顯示處理后的圖像?b |
6 | cv2.imshow('a', a) | 創建名為?a ?的窗口并顯示原始圖像?a ,方便對比查看 |
7 | cv2.waitKey(100000) | 等待鍵盤事件,最長約 100 秒;按任意鍵可提前結束 |
8 | cv2.destroyAllWindows() | 關閉所有 OpenCV 創建的窗口,釋放資源 |
添加了逐行詳細注釋的完整代碼及預期輸出示例:
import cv2 # 1. 導入 OpenCV 庫,用于圖像讀寫與顯示# 2. 讀取兩張圖片
a = cv2.imread('1.jpg') # 讀取 1.jpg,存入變量 a(原始圖像)
b = cv2.imread('mimi.jpg') # 讀取 mimi.jpg,存入變量 b(目標圖像)# 3. 區域復制:將 a 中第 50~199 行、100~249 列的 150×150 像素區域
# 覆蓋到 b 中第 200~349 行、200~349 列的位置
# 注意:源區域與目標區域尺寸必須一致(都是 150×150)
b[200:350, 200:350] = a[50:200, 100:250]# 4. 顯示處理后的結果
cv2.imshow('b', b) # 創建名為 "b" 的窗口,顯示替換后的圖像 b
cv2.imshow('a', a) # 創建名為 "a" 的窗口,顯示原始圖像 a,便于對比cv2.waitKey(100000) # 5. 等待鍵盤事件,最長約 100 秒;按任意鍵可提前退出
cv2.destroyAllWindows() # 6. 關閉所有 OpenCV 創建的窗口,釋放資源
?
此代碼主要完成以下任務:
主要演示了 OpenCV 中兩種不同的圖像縮放方法,并通過窗口對比展示原始圖像與縮放后的效果
完整執行流程:
1.讀取原始圖像?→ 2.?嘗試兩種縮放方式?→ 3.?打印原始圖像尺寸?→ 4.?雙窗口對比顯示?→ 5.?持久化展示結果
步驟 | 代碼 | 作用說明 |
---|---|---|
1 | import cv2 | 導入 OpenCV 庫,提供圖像讀寫與顯示功能 |
2 | a = cv2.imread('1.jpg') | 讀取文件 1.jpg,將其加載為 NumPy 數組并存入變量?a |
3 | b = cv2.imread('mimi.jpg') | 讀取文件 mimi.jpg,將其加載為 NumPy 數組并存入變量?b |
4 | b[200:350, 200:350] = a[50:200, 100:250] | 將?a ?中第 50–199 行、100–249 列的 150×150 像素區域復制到?b ?的第 200–349 行、200–349 列,實現區域替換(要求兩區域尺寸一致) |
5 | cv2.imshow('b', b) | 創建名為 “b” 的窗口,顯示經過替換處理后的圖像?b |
6 | cv2.imshow('a', a) | 創建名為 “a” 的窗口,顯示原始圖像?a ,方便與結果對比 |
7 | cv2.waitKey(100000) | 等待鍵盤事件,最長約 100 秒;按任意鍵可提前結束等待 |
8 | cv2.destroyAllWindows() | 關閉所有由 OpenCV 創建的窗口,釋放資源 |
添加了逐行詳細注釋的完整代碼及預期輸出示例:
import cv2 # 1. 導入 OpenCV 庫,用于圖像處理與顯示# 2. 讀取圖像文件 mimi.jpg,返回三維 BGR 數組
a = cv2.imread('mimi.jpg')# 3. 第一次縮放:強制把圖像調整為指定尺寸
# dsize=(200, 600) 表示輸出圖像寬度 200 像素,高度 600 像素
# 注意:此行計算出的 a_new 會被下一行覆蓋,實際不會生效
a_new = cv2.resize(a, dsize=(200, 600)) # 寬、高# 4. 第二次縮放:按相對比例縮放
# dsize=None 表示不使用絕對尺寸,而是根據 fx、fy 進行縮放
# fx=1.5 → 寬度放大為原來的 1.5 倍
# fy=0.5 → 高度縮小為原來的 0.5 倍
a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)# 5. 打印原圖 a 的形狀(行數=高,列數=寬,第 3 維=通道數 BGR)
print(a.shape) # 高、寬、通道數# 6. 分別顯示原圖和縮放后的圖像
cv2.imshow('a', a) # 顯示原圖
cv2.imshow('a_new', a_new) # 顯示縮放后的圖像# 7. 等待鍵盤事件,最長約 100 秒;按任意鍵可提前退出
cv2.waitKey(100000)# 8. 關閉所有 OpenCV 創建的窗口,釋放資源
cv2.destroyAllWindows()
?