我正在使用 OpenCV 將數千張影像與一張參考影像進行比較。這個程序非常漫長,我正在考慮將多處理作為加速它的一種方式。
我應該如何讓它為每個影像執行“cv.matchTemplate(...)”函式,并且不回圈在同一影像上重新執行該函式?
def myFunction():
values_for_each_image =[]
for image in thousands_of_images:
result = cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED)
values_for_each_image.append(result[1])
return values_for_each_image
從理論上講,我知道我可以做這樣的事情(但對于成千上萬的影像來說這是不現實的):
def do_image1():
return cv.matchTemplate(reference_image, image1, cv.TM_CCOEFF_NORMED)
def do_image2():
return cv.matchTemplate(reference_image, image2, cv.TM_CCOEFF_NORMED)
p1 = multiprocessing.Process(target=do_image1)
p2 = multiprocessing.Process(target=do_image2)
if __name__ == '__main__':
p1.start()
p2.start()
...
uj5u.com熱心網友回復:
這就是我使用 concurrent.futures 解決它的方法:
from concurrent.futures import ThreadPoolExecutor, as_completed
def do_image(reference_image, image):
return(cv.matchTemplate(reference_image, image, cv.TM_CCOEFF_NORMED))
def myFunction():
values_for_each_image = []
with ThreadPoolExecutor(20) as executor:
results = {executor.submit(do_image, reference_image, image) for image in thousands_of_images}
for result in as_completed(results):
values_for_each_image.append(result.result())
return(values_for_each_image)
uj5u.com熱心網友回復:
您可以使用python 的多處理庫中的Pool ,而不是單個行程。池將根據需要負責啟動每個行程。
鑒于您的函式沒有任何引數,我想說您可以通過使用池的apply或apply_async函式獲得最佳結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/450173.html
