初識OpenCV 練習筆記整理--學習七。
阿新 • • 發佈:2018-12-19
# 程式效能檢測及優化
"""
目標:
在影象處理中你每秒鐘都要做大量的運算,所以你的程式不僅要能給出正確的結果,同時還必須要快。所以我們這節我們將學習:
1 檢測程式的效率
2 一些能夠提高程式效率的技巧
3 學到的函式將會有:cv2.getTickCount, cv2.getTickFrequency
"""
# 第一小節 使用OpenCV檢測程式效率 2018/10/27 15:07 import cv2 e1 = cv2.getTickCount() # 過讀取函式來測量函式執行時間,相當於time.time()模組 e2 = cv2.getTickCount() time = (e2 - e1) / cv2.getTickFrequency() # 程式碼執行的時間以秒進行計算 print(time) # 具體應用 import cv2 import numpy as np img1 = cv2.imread('./66.jpg') e1 = cv2.getTickCount() for i in range(5, 49, 2): img1 = cv2.medianBlur(img1, i) # KSIZE -孔徑線性大小,它必須是奇數和大於1,例如:3, 5, 7… 過濾 使圖片更加的光滑。 # cv2.imshow('iamge', img1) # cv2.waitKey(1000) # input() e2 = cv2.getTickCount() t = (e2 - e1) / cv2.getTickFrequency() print(t)
# 第二小節 OpenCV中的預設優化 2018/10/27 15:38 """ OpenCV中的很多函式都被優化。也包含一些沒有被優化的程式碼,因此OpenCV執行的就是優化後的程式碼,如果你把優化關閉的話就只能執行低效的程式碼。 使用函式cv2.useOptimized()來檢視優化是否被開啟了,使用函式cv2.setUseOptimized()來開啟優化 """ import cv2 import numpy as np print(cv2.useOptimized()) # 結果是:True cv2.setUseOptimized(False) print(cv2.useOptimized()) # 結果是:False
# 第三小節 檢測程式的效率 2018/10/27 16:10
"""
使用IPython進行測試,一會如下圖
1,000 納秒 = 1微秒
ns = 納秒
us = 微秒
從結果來看:
第一種寫法,它居然比Numpy 快了20倍。如果考慮陣列構建的話,能達到100倍的差。
再看以下幾個例子。cv2.countNonZero()和np.count_nonzero()。
"""
# 部分IV OpenCV中影象的處理 # 第四小節 轉換顏色空間 2018/10/27 16:18 """ 目標: 學習如何對影象進行顏色空間轉換,比如BGR到灰度圖,或者從BGR到HSV等。HSV 指的是:色調H,飽和度S,明度V。 建立一個程式用來從一幅影象中獲取某個特定顏色的物體。 學習的函式有:cv2.cvtColor(),cv2.inRange()等。 我們要用到的函式是:cv2.cvtColor(input_image,flag),其中flag 就是轉換型別。 對於BGR↔Gray的轉換,我們要使用的flag就是cv2.COLOR_BGR2GRAY。 同樣對於BGR↔HSV的轉換,我們用的flag就是cv2.COLOR_BGR2HSV。 你還可以通過下面的命令得到所有可用的 flag """ import cv2 flags = [i for i in dir(cv2) if i.startswith('COLOR_')] print(flags) img1 = cv2.imread('./66.jpg') img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV) cv2.imshow('image', img2) cv2.waitKey(0) """ 注意在OpenCV的HSV格式中,H(色彩/色度)的取值範圍是[0, 179],S(飽和度)的取值範圍[0, 255],V(亮度)的取值範圍[0, 255]。 但是不同的軟體使用的值可能不同。所以當你需要拿OpenCV的HSV值與其他軟體的HSV值進行對比時,一定要記得歸一化。 """
# 第五節 物體跟蹤 2018/10/27 17:07
"""
現在我們知道怎樣將一幅影象從BGR轉換到HSV了,我們可以利用這一點來提取某個特定顏色的物體。在HSV顏色空間中要比在BGR空間中更容易
表示一個特定顏色。在我們的程式中,我們要提取一個藍色的物體。下面就是我們要做的幾步:
1:從視訊中獲取每一幀影象
2:將影象轉換到HSV空間
3:設定HSV閾值到藍色範圍
4:獲取藍色物體,當然我們還可以做其他任何我們想做的事,比如:在藍色物體周圍畫一個圈。
下面就是我們的程式碼:
"""
import cv2
import numpy as np
cap = cv2.VideoCapture(r'D:\WeChat_20181022093320.mp4')
while 1:
ret, frame = cap.read()
if ret:
# 轉換到 HSV
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# 設定藍色的閾值
lower_blue = np.array([50, 0, 0])
upper_blue = np.array([130, 255, 255])
# 根據閾值構建掩模
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 對原影象和掩模進行位運算
res = cv2.bitwise_and(frame, frame, mask=mask)
# 顯示影象
cv2.imshow('frame', frame)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
k = cv2.waitKey(500) & 0xFF
if k == 27:
break
cv2.destroyAllWindows()
"""
那麼怎樣找到要跟蹤物件的HSV值呢?
其實著真的很簡單,函式cv2.cvtColor()也可以用到這裡。但是現在你要傳入的引數是(你想要的)BGR值
而不是一幅圖。例如,我們要找的綠色的HSV值,我們只需在終端輸入以下命令:
"""
import cv2
import numpy as np
green = np.uint8([[[0, 255, 0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print(hsv_green)
繼續努力學習 後期更難。