我有一個影像,其中有多個檢測結果與重疊的邊界框。我希望能夠將重疊框的不同組合提取到空白畫布上,然后將其另存為影像。
想象一下,如果有這樣的檢測:

我希望能夠測驗框 1 2、1 3、2 3,并將不包含的框設定為白色。為此,我使用以下代碼:
import numpy as np
import cv2
import time
#orig = cv2.imread("Orig.jpg")
orig = np.zeros((9536, 13480, 3), dtype=np.uint8) # dummy
print(orig.shape)
rects = [[1000,1000,1100,1100], [1100,1000,1200,1100],[1100,1100,1200,1200]]
loops = 10
starttime = time.perf_counter()
blankCanvas = np.full(orig.shape, (255,255,255), np.uint8)
for i in range(loops):
canvas = blankCanvas.copy()
for rect in rects:
x1,y1,x2,y2 = rect
canvas[y1:y2,x1:x2] = orig[y1:y2, x1:x2]
xs = np.hstack((np.array(rects)[:,0],np.array(rects)[:,2]))
ys = np.hstack((np.array(rects)[:,1],np.array(rects)[:,3]))
cv2.imwrite(str(i) ".jpg", canvas[min(ys):max(ys), min(xs):max(xs)])
fulltime = time.perf_counter()-starttime
looptime = fulltime/loops
recttime = looptime/len(rects)
print("Time taken per loop:: ", looptime)
print("Time taken per rect:: ", recttime)
Output:::
(9536, 13480, 3)
Time taken per loop:: 0.22753073000000001
Time taken per rect:: 0.07584357666666668
每個回圈大約需要四分之一秒,問題是我必須做數千個回圈。我設法通過復制空白畫布而不是在每個回圈中重新初始化畫布來加快速度,但我不確定我還能如何優化跨部分復制到畫布的程序。
回圈中的大部分時間花在這部分:
canvas = blankCanvas.copy()
for rect in rects:
x1,y1,x2,y2 = rect
canvas[y1:y2,x1:x2] = orig[y1:y2, x1:x2]
寫入磁盤似乎對時間沒有任何影響。
提前致謝。
uj5u.com熱心網友回復:
回圈時間主要由np.full(~500 ms) 和.copy()(100 ms) 決定。
實際計算花費的時間少了四個數量級。
你純粹為了時間測量而引入.copy()操作,所以你的測量方法干擾了你試圖測量的東西。
np.full當您僅嘗試確定實際計算的成本時,您還包括了常數設定成本 (the )。
請使用分析器:https ://docs.python.org/3/library/profile.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/534914.html
上一篇:我想從numpy中洗掉'
下一篇:如何將陣列轉換為串列中的浮點數
