原型是開發(fā)機(jī)器視覺解決方案的重要組成部分。除了允許開發(fā)人員探索和了解手頭的問題之外,它還允許向客戶或涉眾提供臨時(shí)解決方案,以確保一切都朝著正確的方向發(fā)展。這樣,每個(gè)人都可以看到提議的解決方案是如何工作的,并理解項(xiàng)目是如何取得進(jìn)展的,因?yàn)榭梢愿玫毓烙?jì)解決方案的時(shí)間和成本。
加快原型制作過(guò)程對(duì)每一個(gè)參與的人都是非常有益的。在CVB 2019中引入了支持C++、.NET和Python的三種新的面向?qū)ο蟮腁PI,為開發(fā)機(jī)器視覺解決方案提供了一種新的方法。共同視覺Blox。新的API與現(xiàn)有的CVB API兼容,這意味著用戶可以在現(xiàn)有應(yīng)用程序的基礎(chǔ)上構(gòu)建,而不必重寫他們的代碼庫(kù)。
使用Python的好處
CVBpy將CVB的功能和速度帶給了一組新的用戶,他們習(xí)慣于使用Python進(jìn)行快速的結(jié)果和簡(jiǎn)單的編程。Python是一種免費(fèi)的、開源的、解釋的、通用的編程語(yǔ)言.Python易學(xué)易用,是使用較廣泛的編程語(yǔ)言之一。
一項(xiàng)調(diào)查顯示,Python不僅是開發(fā)人員較喜愛的語(yǔ)言之一。但也是較受歡迎的語(yǔ)言。它是可移植的,所以對(duì)編譯器和硬件以及它可以在嵌入式、Linux和Windows平臺(tái)上運(yùn)行。因?yàn)樗乃胶芨?,而且很容易學(xué)習(xí),所以它可以很快地做很多事情,使它具有很高的生產(chǎn)力,因此特別適合于原型制作。在許多應(yīng)用領(lǐng)域中已經(jīng)使用了Python框架,包括物聯(lián)網(wǎng)、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)和人工智能,這意味著接口可以用于大量的庫(kù)。
結(jié)合CVB和Python
為了充分利用CVB令人印象深刻的功能,須創(chuàng)建優(yōu)化的CVB Python綁定。生成Python接口的一般方法是使用現(xiàn)成的工具從C接口生成它。但是,由于Python可以完成比C更多的任務(wù),這并不是較好的方法,因?yàn)樗雎粤嗽S多強(qiáng)大的Python特性。原則上,是從更現(xiàn)代的面向?qū)ο蟮摹⒐δ軓?qiáng)大的體系結(jié)構(gòu)(如C++)中生成Python綁定器。雖然這是一個(gè)改進(jìn),但它仍然缺乏Python的一些特殊特性由于生成器采用一種語(yǔ)言并將其壓縮到另一種語(yǔ)言中,因此忽略了這兩種語(yǔ)言的一些關(guān)鍵特性。
結(jié)果通常包含較小的一組公共特性,這與開發(fā)人員所需要的功能相去甚遠(yuǎn)。解決方案是手動(dòng)創(chuàng)建包裝器。雖然乍一看這似乎很復(fù)雜,但Stemmer映像公司的開發(fā)團(tuán)隊(duì)對(duì)CVB和Python都非常熟悉,能夠快速高效地完成任務(wù)。
生成的CVBpy綁定器提供了對(duì)許多特殊Python特性的訪問,這些特性可用于用CVB進(jìn)行編程和原型開發(fā)。這些措施包括:
1、顯示資源管理。
Python負(fù)責(zé)管理內(nèi)存或文件等資源,CVBpy支持這一點(diǎn)。這避免了手動(dòng)釋放內(nèi)存或關(guān)閉文件或?qū)⑦@些資源的管理外包的需要。顯式資源管理對(duì)于涉及大圖像的獲取或處理以及使用高幀速率和或大量不同設(shè)備的成像應(yīng)用尤其重要,這些設(shè)備產(chǎn)生大量數(shù)據(jù)并需要大量?jī)?nèi)存。
2、內(nèi)置文檔。
Python特性內(nèi)置文檔,因此使用CVBpy,IDE將顯示每個(gè)函數(shù)的文檔幫助。這是內(nèi)置在庫(kù)本身中的,因此不需要安裝單獨(dú)的文檔。
3、改進(jìn)了手動(dòng)操作的多線程和異步支持。
這允許啟動(dòng)本機(jī)線程并使用Python的異步特性,它本質(zhì)上是通過(guò)事件處理程序工作的。
4、穩(wěn)定API
Python在Python 3的生存期內(nèi)提供了一個(gè)穩(wěn)定的API,即ABI(應(yīng)用程序二進(jìn)制接口),這要?dú)w功于PEP 384。這意味著CVBPy將在每個(gè)Python版本上運(yùn)行,從V3.5到當(dāng)前的V3.8及更高版本,以后的Python 3版本不需要進(jìn)行任何調(diào)整。
5、CVBpy為Python的NumPy提供了一個(gè)接口。
NumPy增加了對(duì)大型多維數(shù)組和矩陣的支持,以及對(duì)這些數(shù)組進(jìn)行操作的大量數(shù)學(xué)函數(shù)的集合。CVBpy接口允許從實(shí)際設(shè)備中獲取的圖像直接傳輸?shù)絅umPy,在NumPy中開發(fā)的任何算法都可以應(yīng)用。
6、使用PySide 2的UI。
成像應(yīng)用需要有適當(dāng)?shù)娘@示能力來(lái)顯示原始圖像和任何已經(jīng)開發(fā)的算法的效果。由于Python本身不附帶任何用戶界面,CVBpy包含到PySide2的接口,PySide2是Python用于創(chuàng)建UI的Qt5包裝器。
支持C++、.NET和Python的新的面向?qū)ο蟮腃VB API的結(jié)構(gòu)
目標(biāo)定向
CVBpy可以從面向?qū)ο蟮慕嵌扰c許多基本類進(jìn)行交互。這個(gè)訪問硬件設(shè)備的主要入口點(diǎn),例如照相機(jī),是設(shè)備工廠,它還提供對(duì)不同類型設(shè)備的訪問。(見上圖)。有一個(gè)通用的接口,視頻設(shè)備背后有的硬件,或非標(biāo)式設(shè)備,只有一個(gè)控制路徑。還有一些具有定義數(shù)據(jù)的模擬設(shè)備–要么作為經(jīng)典媒體文件,要么作為仿真文件格式。
設(shè)備可以有一個(gè)或多個(gè)流,并且正在開發(fā)多個(gè)流的使用,但是通常至少有一個(gè)流可用。在這上有一個(gè)環(huán)形緩沖器獲取圖像的方法。此流提供了用于處理的圖像。圖像本身由多個(gè)平面組成。設(shè)備本身具有節(jié)點(diǎn)映射,例如用于控制路徑的GenAPI節(jié)點(diǎn)映射。在不同的層次,地圖、節(jié)點(diǎn)和特征可以從每個(gè)通過(guò)xml描述自己的設(shè)備中獲得。此外,在設(shè)備上還有一些方便的接口,以便更容易地訪問公共功能。
這個(gè)簡(jiǎn)單的CVBpy‘hello world’示例顯示了獲取大量圖像所需的代碼。
CVBpy的實(shí)例
簡(jiǎn)單的例子之一是Python‘hello world’程序。這個(gè)CVBpy‘hello world’示例顯示了獲取大量圖像所需的代碼(上圖)。這是一段相當(dāng)簡(jiǎn)單的代碼。第一個(gè)操作是從設(shè)備工廠打開一個(gè)模擬設(shè)備并從中獲取一個(gè)流。然后啟動(dòng)流并獲取10幅圖像。檢查每個(gè)圖像的狀態(tài),以確保其正常,然后打印出圖像的數(shù)量。為了事后清理,收購(gòu)被簡(jiǎn)單地中止了。
較好的例子,需要一個(gè)響應(yīng)性更強(qiáng)、適應(yīng)性更強(qiáng)的實(shí)時(shí)顯示。UI應(yīng)用程序需要多線程,以允許攝像機(jī)異步運(yùn)行到UI。還需要對(duì)獲取硬件進(jìn)行通用處理,對(duì)于實(shí)踐,UI應(yīng)該與邏輯代碼分離。
Python支持的出現(xiàn)共同視覺Blox為腳本應(yīng)用程序帶來(lái)了新的可能性,這些應(yīng)用程序可以在運(yùn)行時(shí)進(jìn)行修改,較大地加快了原型開發(fā)過(guò)程。使用CVBpy與使用普通Python模塊一樣,為程序員和開發(fā)人員提供了CVB的好處。