簡體   English   中英

如何有效地從后台線程執行圖像流預覽到Delphi 6框架或窗體?

[英]How to perform an image stream preview to a Delphi 6 frame or form from a background thread efficiently?

我有一個Delphi 6應用程序,它接收並處理來自外部攝像頭的圖像流。 我在后台線程上有代碼,因為它很重,我不希望它干擾在主線程上運行的用戶界面代碼。 我想用我從相機的JPEG幀創建的TBitmaps更新表格或框架上的矩形區域,這些JPEG幀以每秒25幀的速度接收。

我想知道什么方法會給我最好的性能以及Windows API調用或Delphi調用它來使用它。 我猜我不應該使用TImage或TPicture或類似的VCL組件,因為它們在主線程上運行,我很確定嘗試通過Synchronize()調用完成任何事情將會效率低下並且可能會變慢涉及的線程。 我還想要一種提供平滑視頻顯示的技術,如雙緩沖控制,沒有任何“條紋”效果。 此外,任何有關正確的Canvas鎖定或設備上下文管理等的提示都將受到贊賞,尤其是避免在釋放資源時常見錯誤的提示。

當然,鏈接到一個很好的代碼示例,它可以完成我需要的工作。

如果您只在畫布上工作,AFAIK TBitmap是線程安全的。 如果您發送GDI消息並需要刷新屏幕,則需要Synchronize ,但是從我的實驗中,使用TBitmap.Canvas只是線程安全的Windows API的包裝器。 如果您使用像素算術處理位圖(使用例如Scanline ),每個線程一個唯一的位圖,您可以在背景上執行。

但我懷疑使用TBitmap並不是最有效的方法。 嘗試http://graphics32.orghttp://aggpas.org ,這是非常快速的位圖工作方式。

如果你能夠像imajoosy提出的那樣,處理輸入流的最佳方法是使用直接的X流處理能力。

對於線程安全的進程,如果每個線程即將占用其核心的100%(很可能是圖像處理),通常假設您應該更好地為您的處理創建NumberOfCPU-1線程。 例如,您可以創建一個線程池,然后讓那些線程從輸入流中消耗位圖。

暫無
暫無

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

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