OpenCV效能衡量與優化方法

2022-09-07 05:00:10 字數 4518 閱讀 5221

本次教程我們談及opencv的效能衡量與優化,眾所周知,演算法的不斷的革新其最重要的一點就是不斷的優化再優化,比如我們的後面要講到的邊緣檢測的演算法,又或者是影象分割的演算法,他們都是隨著時間的一步一步的推移,從而完成演算法層面的優化。在以後的學習中,我們會接觸到諸多的框架,這些所謂的api他們都是固定的,如果我們只是單純的呼叫這些api的話,那麼就做不到演算法層面的革新,而當我們自己想從原理層面來寫這些演算法的時候,我們就需要考慮到它的速度,是否能跟得上這些原有api的速度。

本次教程我們需要接觸到幾個函式:

cv.gettickcount()

呼叫此函式之後返回時鐘週期的數目。因此,如果在函式執行之前和之後呼叫它,則會獲得用於執行函式的時鐘週期數。

cv.gettickfrequency()

函式返回時鐘週期的頻率,或每秒時鐘週期的數目。

現在我們來做個實驗,我們採用乙個普通的高斯濾波器,呼叫opencv中的函式api,我們看看呼叫opencv的api速度怎麼樣:

我們執行看看效果:

可以看到執行速度非常快,現在我們自己寫乙個高斯濾波器,不再呼叫官方api,我們看看效果,當然,這裡只是進行乙個實驗,具體**的編寫目前並不要求大家掌握,這些是後面將要學到的內容,我們來看**:

import cv2

import numpy as np

import math

import copy

gauss = np.array([1, 2, 1, 2, 4, 2, 1, 2, 1])

def spilt(a):

if a / 2 == 0:

x1 = x2 = a / 2

else:

x1 = math.floor(a / 2)

x2 = a - x1

return -x1, x2

def gaussian_b0x(a, b):

judge = 10

sum = 0

box =

x1, x2 = spilt(a)

y1, y2 = spilt(b)

for i in range(x1, x2):

for j in range(y1, y2):

t = i * i + j * j

re = math.e ** (-t / (2 * judge * judge))

sum = sum + re

box = np.array(box)

box = box / sum

# for x in box :

# print (x)

return box

def original(i, j, k, a, b, img):

x1, x2 = spilt(a)

y1, y2 = spilt(b)

temp = np.zeros(a * b)

count = 0

for m in range(x1, x2):

for n in range(y1, y2):

if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1:

temp[count] = img[i, j, k]

else:

temp[count] = img[i + m, j + n, k]

count += 1

return temp

def gaussian_function(a, b, img, gauss_fun):

img0 = copy.copy(img)

for i in range(0, img.shape[0]):

for j in range(2, img.shape[1]):

for k in range(img.shape[2]):

temp = original(i, j, k, a, b, img0)

img[i, j, k] = np.**erage(temp, weights=gauss_fun) # 按權分配

我們來看執行效果,跟官方api的效果一致:

但是其執行時間讓人覺得難以接受,竟然長達18秒:

由此我們可以用這兩個函式檢驗自己所寫的演算法是否已經足夠優化,執行時間就是最好的證明。

opencv中的預設優化

許多opencv功能都使用sse2,**x等進行了優化,當然它也包含未經優化的**。 因此,如果我們的系統支援這些功能,我們應該利用它們(幾乎所有現代處理器都支援它們).編譯時預設啟用它, 因此,opencv執行優化**(如果已啟用),否則執行未優化**。 我們可以使用cv2.useoptimized()來檢查它是否已啟用/禁用,並使用cv2.setuseoptimized()來啟用/禁用它:

import cv2

print(cv2.useoptimized())

cv2.setuseoptimized(false)

print(cv2.useoptimized())

我們可以檢視輸出:

現在我們將其綜合起來,看看優化之後與不優化的速度差異,我們先來看優化之後的:

我們再來看看未優化的效果:

事實證明,opencv在開啟優化之後其執行速度得到了提公升。

到本次教程為止,opencv入門篇的教程就結束了,從下乙個教程開始,將進行opencv基礎篇的講解。

效能優化方法

效能是 的乙個很重要的指標,除非是沒有選擇,否則使用者是無論如何都不會忍受乙個響應緩慢的 那麼具體有哪些手段可以優化 呢 從瀏覽器端到資料庫端,影 響使用者請求的所有環節都可以進行效能優化。一 瀏覽器端 瀏覽器快取 頁面優化 css和js壓縮 啟用gzip 合理布局頁面 頁面靜態化 減少cookie...

效能優化 二 優化方法

1.優化思路 1 公升級伺服器的硬體,換成更快 更大的機器。2 增加伺服器的數量。3 對系統和應用程式進行仔細的調優,以提高響應時間 吞吐量和資源利用率的效能指標。2.優化方法 1 每次改變乙個系統引數或者乙個應用邏輯。2 使用固定的負載 比如保持相同的併發使用者數 3 測試另乙個設定之前收集本次效...

前端效能優化方法

一 減少http請求數 1.合併 當較多時候,可以合併為一張大圖,從而減少http請求數 2.合併壓縮css樣式表和js指令碼 3.去掉不必要的請求 無效的連線請求可以通過firebug等工具檢視 4.充分利用快取 客戶端側快取 二 優化 1.盡可能地使用png格式的,它相對來說體積較小 2.對於不...