OpenCV簡介
OpenCV(Open Source Computer Vision Library)是一個開源的計算機視覺和機器學習庫。它包含超過2500種優化算法,涵蓋圖像處理、物體識別、人臉檢測、3D重建、視頻分析等任務。
核心功能
- 圖像處理:濾波、邊緣檢測、幾何變換。
- 視頻分析:運動估計、背景減除。
- 物體檢測:人臉、行人、文本等。
- 相機標定:3D重建、AR應用。
- 機器學習:SVM、KNN、神經網絡等集成。
下載與安裝
Python環境安裝
通過pip直接安裝:
pip install opencv-python # 僅核心模塊
pip install opencv-contrib-python # 包含額外模塊
資源推薦
- 官方文檔:docs.opencv.org
- GitHub倉庫:github.com/opencv/opencv
- 教程:OpenCV官方提供的Python和C++示例代碼。
基礎功能
1 讀取圖片
import cv2
import numpy as np
a=cv2.imread('test.png')
cv2.imshow('tu',a)
print(a.shape)
print(a.size)
print(a.dtype)
b=cv2.waitKey(0)
# cv2.destroyAllWindows()
這里線導入了opencv的庫CV2,讀取了一張圖片,這里我們讀取后的數據為(*,*,3),因為默認讀取的是RGB三個通道的。然后cv2.show()可以展示圖片,cv2.waitKey(0)表示停留時間,如果參數為0,表示一直停留,如果是其他表示停留n毫秒。cv2.destroyAllWindows()表示關閉所有界面
2 轉化灰度圖和保存
import cv2
import numpy as np
# a=cv2.imread('test.png',cv2.IMREAD_GRAYSCALE)
# a=cv2.imread('test.png',0)#等效
a=cv2.imread('test.png')
a=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow('tu',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
#圖片保存
cv2.imwrite('test0.jpg',a)
這里采用了三種方法來轉化灰度圖,前兩種都是在讀取的同時就轉化為灰度圖了,第一種用cv2.IMREAD_GRAYSCALE來直接轉換,其實吧這個替換為0也是同樣效果。還有一種是用cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)來轉的。最后可以用cv2.imwrite('test0.jpg',a)來保存。
3 摳圖
#摳圖
import cv2
import numpy as np
a=cv2.imread('test.png')#等效b=a[100:300,280:500]
cv2.imshow('b',b)
cv2.imshow('tu',a)
cv2.waitKey(0)
#圖片保存
cv2.imwrite('test0.jpg',a)
這里就像數組一樣,可以進行切片。然后選取我們要選中的區域
我們可以這樣理解圖片,圖片是由一個一個像素組成的,cv2庫把像素點量化了(0-255)。通過cv2,我們可以把一組數組轉化為圖片,也可以把圖片轉化為數組。所有我們可以選中一塊區域來轉化為圖片。
4 讀取視頻
#讀取視頻
import cv2
import numpy as np
video=cv2.VideoCapture('test.mp4')
# video=cv2.VideoCapture(0) #0表示打開攝像頭
if not video.isOpened(): #判斷是否打開print("視頻打開失敗")
while True:ret,frame=video.read() #ret表示是否讀取到下一幀,用于終止畫面的if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY) #把圖像轉化為黑白的cv2.imshow('frame',frame)if cv2.waitKey(30) == 27: #27為esc的ASCII碼,只有esc才能退出breakvideo.release()
cv2.destroyAllWindows()
我們用cv2.VideoCapture('test.mp4')來讀取一個視頻,然后判斷是否打開了(防止意外發生),然后如果打開了就進入一個循環,就是讀取視頻的每一幀,然后如果存在這里ret就為True
:幀讀取成功,可繼續處理,否則就停止了。然后對這一幀進行展示,然后下面cv2.waitKey()中填參數來控制速度越大就會播放的速度。最后要對視頻資源進行釋放,否則如果視頻資源太多會卡頓。
5 提取RGB通道
提取RGB通道
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a1=a[:,:,0]
a2=a[:,:,1]
a3=a[:,:,2]
cv2.imshow('Red Channel (Grayscale)', a2)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)
cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)
cv2.waitKey(0)a_new=a.copy()
a_new[:,:,0]=0
a_new[:,:,1]=0
# a_new[:,:,2]=0
cv2.imshow('Red',a_new)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)n=cv2.merge([b,g,r])
cv2.imshow('new',n)
cv2.waitKey(0)
上面提供了三種提供RGB的方式,但是如果我們展示單通道的時候會自動轉化為灰白的圖片,只有當我們將其與兩種設為0,這樣才會展現出。(RGB順序和RGB不一樣,他是以BGR順序存在的)
?6 圖片打碼
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a[100:300,280:500]=np.random.randint(0,255,(200,220,3))
cv2.imshow('a',a)
cv2.waitKey(0)
還是和上面說的一樣,圖片由像素表示,像素由數字控制大小,如果我們把指定區域的數字取隨機數,那么這塊就相當于打碼了
7?圖片組合
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
b=cv2.imread('img.png')
a[100:300,280:500]=b[100:300,200:420]
cv2.imshow('a',a)
cv2.waitKey(0)
這個就是把像素的一塊,替換為另一張圖片的一塊,和上面圖片打碼的核心是差不多的。值得注意的是,這里兩張圖片取的大小要對應。
8 圖片縮放
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
cv2.imshow('a',a)
# b=cv2.resize(a,(300,300))
b=cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
cv2.imshow('b',b)
cv2.waitKey(0)
這里由兩種方法,雖然都是用resize,但一個 是直接給出你要放大或縮小到多少像素大小,另一種是要橫向x和縱向y要放大或縮小多少倍
總結? ? ? ??
????????OpenCV是一個開源的計算機視覺庫,提供2500多種優化算法,支持圖像處理、視頻分析、物體檢測等任務。摘要介紹了OpenCV的基礎功能:1)讀取和顯示圖片;2)灰度圖轉換與保存;3)圖像區域裁剪;4)視頻讀取與處理;5)RGB通道分離與合并;6)圖像打碼處理;7)圖像組合;8)圖像縮放。這些功能展示了OpenCV如何通過像素級操作實現基礎圖像處理,為更復雜的計算機視覺應用奠定基礎。