OpenCV-Python官方文档学习笔记(上)
整理自O(shè)penCV-Python官方文檔
-
一. OpenCV-Python Tutorials
- 1 安裝及驗(yàn)證
- 2 圖片讀寫,展示
- 3 視頻讀寫,展示
- 4 繪圖功能(繪制幾何形狀:線、圓、橢圓、矩形、文字)
- 5 鼠標(biāo)事件畫筆
- 6 軌跡欄作為調(diào)色板
- 7 核心操作方法
- 8 圖像處理
* 8.1 顏色空間
* 8.2 閾值化
* 8.3 幾何變換
* 8.4 平滑圖像
一、OpenCV-Python Tutorials
Python由于其簡(jiǎn)單性和代碼可讀性,它在短時(shí)間內(nèi)變得非常流行。
另一個(gè)是強(qiáng)大的Numpy,Scipy,Matplot等使其使用非常方便,并且易于C,C++的擴(kuò)展;
OpenCV在機(jī)器學(xué)習(xí),計(jì)算機(jī)視覺等領(lǐng)域的算法支持很多;
1. 安裝及驗(yàn)證
安裝可參考:
https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html
驗(yàn)證安裝
python -c "import cv2"
2. 圖片讀寫,展示
- cv2.imread(“imager.jpg”,cv2.IMREAD_COLOR) 圖片路徑,讀圖方式【cv2.IMREAD_COLOR或者1:加載彩色圖,忽略透明度,默認(rèn)模式;cv2.IMREAD_GRAYSCALE或者0: : 灰度圖;cv2.IMREAD_UNCHANGED或者-1:BGR+alpha透明度4通道圖;】
- cv2.imshow(“image”,image) 窗口名稱,圖片array
- cv2.imwrite(“image.jpg”,image) 保存的圖片路徑名稱,圖片array
3. 視頻讀寫,展示,捕獲窗口
使用筆記本電腦的內(nèi)置網(wǎng)絡(luò)攝像頭,捕獲實(shí)時(shí)視頻流的每一幀,并寫入文件
- cv2.flip(frame,0) 翻轉(zhuǎn)圖像 1水平翻轉(zhuǎn),0垂直翻轉(zhuǎn),-1水平垂直翻轉(zhuǎn)
- cv2.VideoCapture() 內(nèi)置網(wǎng)絡(luò)攝像頭——視頻捕獲
- cv2.VideoWriter() 視頻幀寫入類
# 視頻寫入import numpy as np
import cv2cap = cv2.VideoCapture(0)# 定義編碼器codec 初始化視頻寫入類對(duì)象
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))while (cap.isOpened()):ret, frame = cap.read()if ret == True:# 垂直翻轉(zhuǎn)每一幀圖像frame = cv2.flip(frame, 0)# 寫入翻轉(zhuǎn)后的每一幀out.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakelse:break# 釋放視頻捕獲器以及視頻寫入流
cap.release()
out.release()
cv2.destroyAllWindows()
4. 繪圖功能(繪制幾何形狀:線、圓、橢圓、矩形、文字)
# 繪圖功能(繪制幾何形狀:線、圓、橢圓、矩形、文字)import numpy as np
import cv2# 創(chuàng)建一個(gè)黑色的圖片
img = np.zeros((512,512,3), np.uint8)# 畫一條藍(lán)色的線
# 圖像,起點(diǎn),終點(diǎn),顏色BGR,thickness(線條 -1 實(shí)心)
img = cv2.line(img,(0,0),(511,511),(255,0,0),5)# 矩形
# 圖像,起點(diǎn),終點(diǎn),顏色BGR,thickness
img = cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)# 圓
# 圖像,圓心,半徑,顏色GBR,thickness(-1 實(shí)心)
img = cv2.circle(img,(447,63), 63, (0,0,255), -1)# 橢圓
# 圖像,圓心,(長(zhǎng)軸長(zhǎng)度,短軸長(zhǎng)度),旋轉(zhuǎn)開始角度startAngle,旋轉(zhuǎn)結(jié)束角度endAngle,0~360標(biāo)識(shí)展示多大的橢圓比例,thickness(-1,實(shí)心,否則是線的粗細(xì))
img = cv2.ellipse(img,(256,256),(100,50),0,0,180,255,-1)# 多邊形(一系列的坐標(biāo)向量)
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
# 圖像,向量坐標(biāo)array,True:連成線的封閉多邊形 False:只是依次連線并不封閉(起點(diǎn)、終點(diǎn)并未連在一起),顏色BGR
img = cv2.polylines(img,[pts],False,(0,255,255))font = cv2.FONT_HERSHEY_SIMPLEX
# 文字
# 圖像,文字內(nèi)容,起點(diǎn),字體,字體大小,字體顏色BGR,thickness字體粗細(xì),線的類型(cv2.LINE_AA 鋸齒狀)
cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)cv2.imshow("image",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5. 鼠標(biāo)事件畫筆
默認(rèn)情況下,按下鼠標(biāo)左鍵拖動(dòng),畫綠色的矩形;
按一下m鍵,再次按下鼠標(biāo)左鍵拖動(dòng),畫半徑為5的紅色原形。
理解鼠標(biāo)事件這個(gè)例子對(duì)于創(chuàng)建和理解一些交互式應(yīng)用程序(如對(duì)象跟蹤,圖像分割等)將非常有幫助。
將該例子繪制矩形和圓形參數(shù) thickness調(diào)整為非-1,如1變?yōu)榉菍?shí)心,將非常有趣;
import cv2
import numpy as npdrawing = False # true if mouse is pressed
mode = True # if True, draw rectangle. Press 'm' to toggle to curve
ix, iy = -1, -1# mouse callback function
def draw_circle(event, x, y, flags, param):global ix, iy, drawing, modeif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if drawing == True:if mode == True:cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)else:cv2.circle(img, (x, y), 5, (0, 0, 255), -1)elif event == cv2.EVENT_LBUTTONUP:drawing = Falseif mode == True:cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)else:cv2.circle(img, (x, y), 5, (0, 0, 255), -1)img = np.zeros((512, 512, 3), np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)while (1):cv2.imshow('image', img)k = cv2.waitKey(1) & 0xFFif k == ord('m'):mode = not modeelif k == 27:breakcv2.destroyAllWindows()
6. 軌跡欄調(diào)色板
挪動(dòng)不同的RGB,會(huì)顯示不同的顏色
# 調(diào)色板🎨
# 創(chuàng)建了一個(gè)開關(guān),其中只有在開關(guān)為ON的情況下應(yīng)用程序才能工作,否則屏幕始終為黑色
# 移動(dòng)RGB 調(diào)整自己喜歡的顏色import cv2
import numpy as npdef nothing(x):pass# 創(chuàng)建一個(gè)黑色圖片,窗口
img = np.zeros((300, 512, 3), np.uint8)
cv2.namedWindow('image')# 創(chuàng)建軌跡欄顯示 RGB 顏色變更
cv2.createTrackbar('R', 'image', 0, 255, nothing)
cv2.createTrackbar('G', 'image', 0, 255, nothing)
cv2.createTrackbar('B', 'image', 0, 255, nothing)# 創(chuàng)建用于開/關(guān)功能的開關(guān)
switch = '0 : OFF \n1 : ON'
cv2.createTrackbar(switch, 'image', 0, 1, nothing)while (1):cv2.imshow('image', img)k = cv2.waitKey(1) & 0xFFif k == 27:break# 獲取當(dāng)前軌跡蘭的位置r = cv2.getTrackbarPos('R', 'image')g = cv2.getTrackbarPos('G', 'image')b = cv2.getTrackbarPos('B', 'image')s = cv2.getTrackbarPos(switch, 'image')if s == 0:img[:] = 0else:img[:] = [b, g, r]cv2.destroyAllWindows()
7. 核心操作方法
- 訪問像素值并對(duì)其進(jìn)行修改(img.item img.itemset())
print(img.item(10, 10, 2)) # 獲取紅色通道的值
img.itemset((10, 10, 2), 100) # 修改紅色通道的值
- 訪問圖像屬性 (img.dtype img.shape)
- 設(shè)置圖像區(qū)域(ROI)Numpy切片方法
- 分割通道和合并圖像 (split merge,相比索引的方法快一些)
b, g, r = cv2.split(img)
img = cv2.merge((b, g, r))
b = img[:, :, 0] # 索引的方式更快
img[:, :, 2] = 0 # 索引的方式更快
數(shù)學(xué)運(yùn)算符(+ - * /)
- openCV加法和Numpy加法之間有區(qū)別。OpenCV加法是飽和運(yùn)算,而Numpy加法是模運(yùn)算。OpenCV的方法在圖像相加更好用一些;
- cv2.threshhold二值化圖像
- 圖像融合或者透明度方法
cv2.addWeight(img1,alpha,img2,1-alpha,y)
如果直接相加兩個(gè)圖像,它將改變顏色。如果融合它,將獲得透明效果。還有一種很優(yōu)雅的辦法:位操作(按位與、或、非、異或(輕松改變某個(gè)圖像的一塊ROI區(qū)域)
8. 圖像處理
8.1 顏色空間
- cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
- cv2.inRange()
顏色空間的轉(zhuǎn)換:BGR轉(zhuǎn)RGB,BGR轉(zhuǎn)GRAY,BGR轉(zhuǎn)HSV
對(duì)象跟蹤中最簡(jiǎn)單的方法:根據(jù)HSV顏色空間來提取彩色對(duì)象。在HSV中,表示顏色比RGB顏色空間更容易。
顏色HSV空間的獲取:
green = np.uint8([[[0, 255, 0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv_green)
8.2 閾值化
參考我之前的篇博客:cv2.threshhold二值化圖像
閾值化、自適應(yīng)閾值化、自適應(yīng)高斯濾波后閾值化
高斯濾波去掉了高頻的噪點(diǎn)波,后效果更好
自適應(yīng)性高斯濾波不需要手動(dòng)設(shè)置閥值,使用更簡(jiǎn)單
8.3 幾何變換
將不同的幾何變換應(yīng)用于圖像,例如平移,旋轉(zhuǎn),縮放,仿射變換(Affine Transform),透視變換(Perspective Transform)等。
在放射變換中,原始圖像中的所有平行線在輸出圖像中仍將平行。為了找到變換矩陣,我們需要輸入圖像中的三個(gè)點(diǎn)以及它們?cè)谳敵鰣D像中的對(duì)應(yīng)位置。然后cv2.getAffineTransform將創(chuàng)建一個(gè)2x3矩陣,該矩陣將傳遞給cv2.warpAffine。
仿射變換如下:
透視變換在光學(xué)識(shí)別里會(huì)用到:
對(duì)于透視變換,需要3x3變換矩陣。即使在轉(zhuǎn)換后,直線也將保持直線。要找到此變換矩陣,需要在輸入圖像上有4個(gè)點(diǎn),在輸出圖像上需要相應(yīng)的點(diǎn)。在這4個(gè)點(diǎn)中,其中3個(gè)不應(yīng)共線。然后可以通過函數(shù)cv2.getPerspectiveTransform找到轉(zhuǎn)換矩陣。然后將cv2.warpPerspective與此3x3轉(zhuǎn)換矩陣一起應(yīng)用。
透視變換如下圖:
8.4 平滑圖像
圖像濾波/模糊由倆種方式:
- 使用各種低通濾鏡模糊圖像
- 將自定義濾鏡應(yīng)用于圖像(2D卷積)
- 2D卷積核
LPF低通濾波,有助于消除噪聲或模糊圖像。
HPF高通濾波,過濾器有助于查找圖像的邊緣。cv2.filter2D()
- 平滑圖像
-
均值濾波(直接取平均值,會(huì)模糊邊緣)
-
高斯濾波(比均值濾波效果好,可以高效去除高頻噪音。利用鄰域像素取中值,也會(huì)使邊緣模糊,得到一個(gè)可能在原始圖像中并不存在的像素值)使用更廣泛一些;
-
中值濾波(相比高斯濾波,也基于鄰域像素取中值,區(qū)別:中值一定存在于原像素中)
-
雙邊濾波(效果好,速度比較慢,是高斯濾波的優(yōu)化,其他部分采用高斯濾波,邊緣多加了一些邏輯,使得邊緣也不模糊)
總結(jié)
以上是生活随笔為你收集整理的OpenCV-Python官方文档学习笔记(上)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: elasticsearch 索引 red
- 下一篇: OpenCV-Python形态变换、图像