[英]Python: Add a pointer to image data in memory to acquisition queue, not the retrieved image data
我有一個多線程圖像處理 Python 軟件,其中:
我的問題是pypylon命令cam.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
需要 ~100ms pr。 相機,那是當圖像已經在緩沖區中時(外部觸發信號已經發生)。
這是我今天如何做的偽代碼:
采集線程:
queu_element = type('queue_element', (object,), {})()
images = [None] * 3
for i, cam in enumerate(cameras):
grab_result = cam.RetrieveResult(5000, pylon.TimeoutHandling_ThrowException)
images[i] = grab_result.GetArray().copy()
grab_result.Release()
queu_element.images = images
queu_element.metadate = get_metadata()
queue.append(queu_element)
處理線程:
queue_element = queue.pop()
do_awsome_processing(queue_element.images, queue_element.metadata)
我加快圖像采集的想法是將RetriveResult
命令從我的采集線程移動到我的處理線程。 我在想我的采集隊列應該包含指向內存地址的指針,而不是檢索到的結果本身。 處理線程應檢索結果。 這是我的想法的一些偽代碼:
采集線程:
queu_element = type('queue_element', (object,), {})()
pointers = [None]*len(cameras)
while cameras[0].no_new_image_in_buffer():
sleep(0.01)
for i, cam in enumerate(cameras):
pointers[i] = cam.PointerToNewestBufferedImage()
queue_element.pointers = pointers
queue_element.metadata = get_metadata()
queue. Push(queue_element)
處理線程:
queue_element = queue.pop()
images = [None] * len(queue_element.pointers)
for i, pointer in enumerate(queue_element.pointers)
images[i] = RetrieveResultFromMemoryAddess(pointer, pylon.TimeoutHandling_ThrowException)
do_awsome_processing(images, queue_element.metadata)
我希望有人知道引導我走向這個解決方案的方法
我有基於pypylon 示例代碼的功能代碼。 但是,我想優化獲取和將新數據添加到隊列所需時間盡可能短的位置。
這個 python 問題的答案不是指針。 在了解了 python Real Python 中的指針之后,這對我來說變得很清楚了。
當涉及到來自相機的流圖像時,pypylon 命令的響應時間與Pylon Viewer Software相同。 如果你可以在那里達到一定的 fps,那么你應該能夠看到運行cam.RetrieveResult()
的相同數據響應時間
但是,可能需要編輯兩個設置
感謝@ChristophRackwitz 和@ArtiomKozyrev 引導我走上這條偉大的學習之路。
PS 這個問題在 GitHub 上的 pypylon 社區也有討論
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.