文章目錄
- 一、OpenCV
- 1.介紹
- 2.下載
- 3.圖像的表示
- 4.圖像的基本操作
- 4.1圖片讀取或創建
- 4.1.1讀取
- 4.1.2創建
- 4.2創建窗口
- 4.3顯示圖片
- 4.3.1設置讀取的圖片
- 4.3.2設置顯示多久
- 4.3.3釋放
- 4.4.保存圖片
- 4.5圖片切片(剪裁)
- 4.6圖片大小調節
- 5.在圖像中繪值
- 5.1繪制直線
- 5.2繪制圓形
- 5.3繪制矩形
- 5.4添加文字
- 5.5綜合案例
- 6.讀取視頻
一、OpenCV
1.介紹
-
OpenCV(開放源代碼計算機視覺庫)是一個開源的計算機視覺和機器學習軟件庫。由一系列 C++ 類和函數構成,用于圖像處理、計算機視覺領域的算法實現。
-
OpenCV-Python使用Numpy,這是一個高度優化的數據庫操作庫。所有OpenCV數組結構都轉換為Numpy數組。這也使得與使用Numpy的其他庫(如SciPy和Matplotlib)集成更容易。
2.下載
x pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
3.圖像的表示
- 圖像一般是RGB三原色圖。RGB圖上的每個點都是由紅(R)、綠(G)、藍(B)三個顏色按照一定比例混合而成的;在OpenCV中,默認情況下,彩色圖像是以BGR(藍-綠-紅)順序存儲。
- 彩色圖像:三維數組存儲【行數,列數,通道數(一般是3)】
- 灰色圖像:二維存儲【行數,列數】
- 數組存儲的數據類型(dtype):圖像中的每個像素值的數據類型決定了可以存儲的最大值。例如,8位無符號整數(uint8)允許的范圍是從0到255。
4.圖像的基本操作
4.1圖片讀取或創建
4.1.1讀取
- cv2.imread(filename)
- 參數:
- filename:圖像路徑
4.1.2創建
import cv2
import numpy as np# 設置圖像尺寸
height, width = 512, 512
# 創建一個空白的彩色圖像-----三維數組,8位
img = np.zeros((height, width, 3), dtype=np.uint8)
# 修改像素值-----0~255的隨機整數,大小相同的數組
img[::] = np.random.randint(0, 256, img.shape)# 設置顯示的圖像---z'd
cv2.imshow('Random Color Image', img)
# 顯示時間
cv2.waitKey(0)
# 釋放內存
cv2.destroyAllWindows()
4.2創建窗口
用于顯示圖片。不創建也可以,在顯示的時候可以自動創建。
-
cv2.namedWindow(winname [,窗口屬性])
-
使用
cv2.namedWindow()
方法創建一個新的窗口。你可以為這個窗口指定一個名稱,并且可以選擇窗口的屬性(例如,是否可調整大小)。 -
參數:
-
winname
:窗口名 -
窗口屬性:窗口大小是否可調整
cv2.WINDOW_AUTOSIZE
:默認,窗口自適應大小,不能調整cv2.WINDOW_NORMAL
:窗口大小是可調整的,用戶可以通過鼠標拖動窗口邊緣來自由改變窗口大小。
4.3顯示圖片
4.3.1設置讀取的圖片
cv2.imshow(winname,img)
參數:
- winname:顯示圖像的窗口名,以字符串類型表示
- img:要顯示的圖像
注意:在調用顯示圖像的API后,要調用cv2.waitKey(0)給圖像繪制留下時間,否則窗口會出現無響應情況,并且圖像無法顯示出來。
4.3.2設置顯示多久
cv.waitKey(n):
-
n = 0:一直顯示
-
n > 0:顯示 n毫秒
4.3.3釋放
在關閉圖像后執行
cv2.destroyAllWindows()
:立即銷毀所有(打開的)窗口cv2.destroyWindow(winname)
:關閉指定名稱的窗口。省略則銷毀所有已打開的窗口。
4.4.保存圖片
cv2.imwrite(path,img)
參數:
- path:圖片保存的路徑和圖片名
- img:要保存的圖像
4.5圖片切片(剪裁)
從圖像中提取一個子區域(矩形區域)。
讀取到的圖片是一個numpy.ndarray
類型的數組,所以可以直接切片操作。
img[y:y+h,x:x+w]
提取的是從(x,y)
開始,高度為h
,寬度為w
的矩形區域
示例:
import numpy as np
import cv2 as cv
# 讀取圖像
img=cv.imread("images/001.jpg")
print(img.shape)
# 定義剪裁后圖像的寬度和高度(以像素為單位)
h = 300
w = 500
# 定義剪裁的起始點,坐標小于圖片的寬高
y=100
x=200
# 剪裁
img2=img[y:y+h,x:x+w]
print(img2.shape)
4.6圖片大小調節
cv2.resize
是Opencv庫中用于調整圖像大小的函數,在圖像處理中很常用,特別是在要對圖像進行縮放以適應不同需求時。- cv2.resize(img,dsize)
- img:輸入圖像,通常是二維或三位NumPy數組。
- dsize:輸出圖像的尺寸,是一個二元組
(w,h)
- 示例:
import cv2 as cv
# 讀取圖片
img=cv.imread("images/001.jpg")
print(img.shape)
# 調整的大小
dsize=(100,200)
new_img=cv.resize(img,dsize)
print(new_img.shape)
5.在圖像中繪值
5.1繪制直線
-
cv2.line(img,sart,end,color,thickness)
-
參數
- img:要繪制直線的圖像
- start、end:直線的起點和終點坐標
- color:直線的顏色(對于彩色圖像,使用 BGR 格式指定顏色)
- thickness:線條寬度
5.2繪制圓形
-
cv2.circle(img,centerpoint,r,color,thickness,cv.LINE_AA)
-
參數:
- img:要繪制圓形的圖片
- centerpoint、r:圓心坐標和半徑
- color:線條顏色
- tnickness:線條寬度,為-1時完全填充顏色
- cv.LINE_AA: 反走樣技術,讓圖行邊緣更光滑
5.3繪制矩形
-
cv2.rectangle(img,leftupper,rightdown,color,thickness)
-
參數:
- img:要繪制矩形的圖像
- leftupper、rightdown:矩形的左上角和右下角坐標
- color:線條的顏色
- thickness:線條的寬度
5.4添加文字
-
cv2.putText(img,text,station,font,Fontscale,color,thickness,cv2.LINE_AA)
-
參數:
- img:要添加文字的圖像
- text:要寫入的文本數據
- station:文本的放置位置
- font:字體樣式
- Fontscale:字體大小
- thickness:字體線條寬度
- cv2.LINE_AA: 反走樣技術,讓圖行邊緣更光滑
5.5綜合案例
import cv2 as cv
# 讀取圖片
img = cv.imread("./imgs/cat1.png")
# 繪制直線---起點,終點,顏色,粗細
cv.line(img, [100,100], [400, 400], [0, 0, 255], 2)
# 繪制圓形---圓心,半徑,顏色,粗細,抗鋸齒(平滑)
cv.circle(img, [300, 300], 50, [0, 255, 0], 2,cv.LINE_AA)
# 繪制矩形---左上角,右下角,顏色,粗細,抗鋸齒(平滑)
cv.rectangle(img, [100, 100], [400, 400], [255, 0, 0], 2, cv.LINE_AA)
# 繪制文字---文字內容,哪里開始寫,字體類型,字體大小,顏色,字體粗細
cv.putText(img, "Hello World!",(450,450), cv.FONT_ITALIC, 1, [255, 0, 0], 2)cv.imshow("Cat", img)
cv.waitKey(0)
cv.destroyAllWindows()
6.讀取視頻
-
cap = cv2.VideoCapture(path)
- path:視頻流資源路徑設置為;填0,代表從默認攝像頭捕獲視頻流(自拍)
-
ret,frame = cap.read()
-
返回值cap調用read()方法得到一個布爾值和一幀圖像,布爾值表示是否成功讀取到幀,如果為False,可能是因為視頻結束或讀取失敗,如果為True,frame則是當前幀的圖像數據。
示例:
import cv2 as cv
# 創建VideoCapture對象,參數為攝像頭索引(通常為0,如果為單一攝像頭)
vi=cv.VideoCapture(0)
while True:ret,frame=vi.read()if not ret:print("error")breakcv.imshow("frame",frame)# 等待40毫秒并檢查按鍵事件,獲取按鍵的ASCII碼,判斷按鍵是否為q鍵if cv.waitKey(40) & 0xFF==ord('q'):break
vi.release()# 釋放攝像頭資源
cv.destroyAllWindows()