簡體   English   中英

Python:將指向內存中圖像數據的指針添加到采集隊列,而不是檢索到的圖像數據

[英]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()的相同數據響應時間

但是,可能需要編輯兩個設置

  1. USB Steam 最大傳輸大小
  2. cam.GetStreamGrabberNodeMap().GetNode("MaxTransferSize").Value

感謝@ChristophRackwitz 和@ArtiomKozyrev 引導我走上這條偉大的學習之路。

PS 這個問題在 GitHub 上的 pypylon 社區也有討論

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM