1. 程式人生 > >初識OpenCV 練習筆記整理--學習七。

初識OpenCV 練習筆記整理--學習七。

# 程式效能檢測及優化
"""
目標:
    在影象處理中你每秒鐘都要做大量的運算,所以你的程式不僅要能給出正確的結果,同時還必須要快。所以我們這節我們將學習:
        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)

繼續努力學習 後期更難。