在計算機視覺的廣袤領域中,OpenCV?是一座極為關鍵的里程碑。無論是在前沿的學術研究,還是在蓬勃發展的工業界,OpenCV 憑借其強大的功能與高效的性能,為開發者提供了豐富的圖像處理和計算機視覺算法,助力無數項目落地。本文將深入探討 OpenCV 的基礎知識,包括其核心概念、安裝配置、常用操作以及實際應用,希望能幫助讀者全面掌握 OpenCV,為后續的計算機視覺開發筑牢根基。
一、?OpenCV 是什么?
OpenCV,即 Open Source Computer Vision?Library,是一個基于 BSD 許可發行的跨平臺計算機視覺庫。它由英特爾公司發起并參與開發,歷經多年的持續發展與完善,已經成為計算機視覺領域的行業標準之一。OpenCV 支持 C++、Python、Java 等多種主流編程語言,極大地降低了開發者的學習門檻。同時,它擁有超過 2500 種優化算法,從基礎的圖像濾波、特征提取,到復雜的目標檢測、立體視覺和機器學習算法,幾乎涵蓋了計算機視覺的各個方面。OpenCV 的高效性和易用性,使其在學術研究、工業生產和商業產品中都得到了廣泛的應用。
二、?安裝 OpenCV
Python 環境下安裝
在 Python 環境中,使用pip工具可以輕松安裝 OpenCV。打開命令行終端,輸入以下命令:
pip install opencv - python
三、Opencv的簡單操作
1、Opencv的導入
在python中Opencv用cv2來表示
import cv2
2、圖片的讀取
這里的圖片可以是任意一張圖片,網站上隨便下載一張就行,這里就不附文件了
圖片的讀取不能有中文
# a = cv2.imread('mm.jpg')#路徑不可為中文
# cv2.imshow('tu', a)
# b = cv2.waitKey(10000000)
# print(b) # 打印按下按鍵對應的 ASCII 碼,無按鍵則返回 -1
# cv2.destroyAllWindows()#釋放緩存
# print('圖像屬性')
# print("圖像形狀(shape):", a.shape)
# print("圖像數據類型(dtype):", a.dtype)
# print("圖像大小(size):", a.size)
3、圖片的灰度轉換
# b = cv2.imread('mm.jpg', cv2.IMREAD_GRAYSCALE)
# cv2.imshow('xx', b)
# cv2.waitKey(0)
# cv2.destroyAllWindows()#釋放緩存
# print('灰度圖像屬性')
# print("圖像形狀(shape):", b.shape)
# print("圖像數據類型(dtype):", b.dtype)
# print("圖像大小(size):", b.size)
# # 保存灰度圖像
# cv2.imwrite('ting98_GRAY.jpg', b)
4、視頻文件讀取
這里規定了waitKey == 27就表示按下ASCLL碼值為27(ESC鍵)才能退出播放
video_capture = cv2.VideoCapture('your_name.mp4')
if not video_capture.isOpened():print('無法打開文件:')exit()
while True:ret,frame = video_capture.read()if not ret:break# frame = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)cv2.imshow('video',frame)if cv2.waitKey(60) == 27:break
video_capture.release()
cv2.destroyAllWindows()#每次運行完都要釋放緩存
5、ROI提取
這個看上去高大上,但實際上就是python基礎里的切片,將圖片上的某部分提取出來
a = cv2.imread('mm.jpg') # 重新讀圖(確保 a 有效,也可復用之前的 a ,這里為清晰重寫 )
if a is not None:# ROI 切片:行范圍 350-650 ,列范圍 250-500 (根據需求調整)b = a[350:650, 250:500]cv2.imshow('yuantu', a) # 顯示原圖cv2.imshow('qiepian', b) # 顯示 ROI 區域cv2.waitKey(0) # 按任意鍵繼續cv2.destroyAllWindows()
6、RGB 顏色通道提取
a = cv2.imread(r'./img.png')
b = cv2.imread(r'./mm.png')
# 2. 提取顏色通道
a1 = a[:, :, 0] # 藍色通道(B通道)
a2 = a[:, :, 1] # 綠色通道(G通道)
a3 = a[:, :, 2] # 紅色通道(R通道)
blue=np.zeros_like(b)
blue[:, :, 0] =b[:, :, 0]
# 或者使用 cv2.split() 來分離顏色通道
b, g, r = cv2.split(a)# 4. 設置窗口顯示時間,單位為毫秒(這里設置為100秒,可以根據需要調整)
cv2.waitKey(100000)
# 5. 關閉所有窗口
cv2.destroyAllWindows()
注意:我們這里是顯示藍色通道的圖像,但是所顯示的圖片確是灰色的,那是因為只顯示藍色通道時, 實際上是將藍色通道作為亮度值,是單個通道,這會導致圖像呈現為灰色。 想要展示只包含藍色通道信息的彩色圖像,可以將圖像中的綠色通道和紅色通道設為0,即移除綠色和紅色,只保留藍色。
7、合并顏色
這個和上面的顏色通道提取差不多,就是把提取后的數據再拼接回去,可以自由組合,這里演示的是合并原圖片
# '''合并顏色通道'''
# 1. 讀取圖像
a = cv2.imread('img.png')
# 2. 提取顏色通道
a1 = a[:, :, 0] # 藍色通道(B通道)
a2 = a[:, :, 1] # 綠色通道(G通道)
a3 = a[:, :, 2] # 紅色通道(R通道)
# 或者使用 cv2.split() 來分離顏色通道
b, g, r = cv2.split(a)
# b 包含藍色通道 g 包含綠色通道 r 包含紅色通道
# 使用cv2.merge()函數將三個通道重新合并成一個圖像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) #或者使用這行代碼
cv2.imshow('result3', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
8、圖片修改
1、圖片打碼
a = cv2.imread('img.png')
a[100:200, 200:300] = np.random.randint(0, 256, (100, 100, 3)) # 矩陣賦值必須是相同大小
cv2.imshow(winname='masaike', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
2、圖片組合
這里可以將圖片的部分組合起來
a = cv2.imread('img.png')
b = cv2.imread('mm.jpg')
b[200:350, 200:350] = a[50:200, 100:250] # 注意:矩陣的大小必須要統一。
cv2.imshow(winname='b', mat=b)
cv2.imshow(winname='a', mat=a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()
3、圖片縮放
# 圖片縮放cv2.resize
# 用于調整圖像的大小。它有以下幾個參數:
# src: 要調整大小的輸入圖像,可以是numpy數組、PIL圖像或其他類型。
# dsize: 輸出圖像的大小,可以是一個元組,例如(寬, 高), 或者使用整數標量來縮放原始圖像。如果dsize為None, 則根據scale
# fx: 沿x軸的縮放系數。
# fy: 沿y軸的縮放系數。
a = cv2.imread('mm.jpg')
a_new = cv2.resize(a, dsize=(200, 600)) # 寬、高
# a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5)
# print(a.shape) # 高、寬、通道數
cv2.imshow(winname='a', mat=a)
cv2.imshow(winname='a_new', mat=a_new)
cv2.waitKey(1000000)
cv2.destroyAllWindows()