在最開始介紹 Jetbot 的時(shí)候有提到,這套智能小車只使用一個(gè) CSI 攝像頭作為全部輸入的設(shè)備,因?yàn)檫@種設(shè)備的體積輕巧、功耗較低,并且 NVIDIA Jetson 系列針對 CSI 攝像頭提供了一組 Camera SubSystem 來提高效率,非常適合用在智能車方案上的視頻圖像輸入。下表是各種攝像頭的簡單比較表,這樣就能一目了然地理解 Jetbot 為何挑選 CSI 攝像頭作為輸入設(shè)備。
首先要提示的,Jetson Nano(含2GB)所支持的是 CSI-2 版本接口,早期用在樹莓派上 50 元以下的 CSI 接口攝像頭是不能使用的,主要以 IMX219 芯片的攝像頭為主,價(jià)格大約在 100 元以上,因此請勿選購錯(cuò)誤。
本文并不花時(shí)間去說明 CSI 攝像頭的工作原理,主要配合 Jetbot 的安裝,以及執(zhí)行最簡單指令去確認(rèn)您手上的攝像頭是否良好可用,否則等整機(jī)都裝好之后再進(jìn)行測試,如果遇到不良的攝像頭還得再拆卸下來,是一件頗為浪費(fèi)時(shí)間的事情。
將CSI攝像頭裝到Jetson Nano(含2GB)上
這種接口并不支持即插即用(PnP, Plug and Play)功能,不能像 USB 攝像頭可以隨時(shí)插入 Jetson Nano(含2GB),必須在開機(jī)之前就先裝好。如果開機(jī)后測試發(fā)現(xiàn)不成功,就得關(guān)機(jī)后再檢查是否有什么地方安裝不正確?或者接觸不良的問題,就便利性而言不如 USB 攝像頭那么順手。
安裝 CSI 攝像頭的接口如下圖左方的卡座,要拔取卡筍進(jìn)行安裝時(shí)千萬小心力度,這個(gè)塑料件比較脆弱,一不小心弄斷了,不僅無法再安裝 CSI 攝像頭,也嚴(yán)重影響 Jetson Nano(含2GB)的質(zhì)保,需要非常小心處理!
卡座上透過一根專屬的軟排線(如上圖右)與 CSI 攝像頭進(jìn)行連接,這個(gè)軟排線是有方向性的,如上圖右所顯示,軟排線有金屬針腳的一面要朝內(nèi)(核心模塊)方向,將排線完整塞進(jìn)卡座之后,再將卡筍往下壓,確保完全壓倒底,否則攝像頭可能因?yàn)榕啪€接觸不良而無法正常工作。
請參考“菜鳥手冊(2):給 Jetson Nano 安裝 CSI 攝像頭”(https://cloud.tencent.com/developer/article/1421907)一文,有非常詳盡的步驟與動(dòng)態(tài)簡圖能完整表達(dá)過程??偠灾@個(gè)攝像頭的安裝有些細(xì)微之處,需要細(xì)心處理。一旦安裝測試好之后,也盡量不要拆卸。
測試CSI攝像頭的運(yùn)行
由于 Jetbot 會(huì)關(guān)閉 Ubuntu 圖形桌面,因此過去所學(xué)到調(diào)用 nvarguscamera 指令,去啟動(dòng) CSI 攝像頭并在圖形桌面上顯示的方法,在這里都不能適用,但是 v4l2-ctl 工具還是能做最基本的檢測。
下面的測試都在 Jetbot 上的 Jupyter 環(huán)境上進(jìn)行,也順便講解一下 Jupyter 上調(diào)用攝像頭與顯示內(nèi)容的方法,先熟悉一下這方面的使用是很重要,因?yàn)楹竺嫠袑?shí)驗(yàn)都要用到 CSI 攝像頭。
現(xiàn)在從 PC 上的瀏覽器輸入 “:8888” 進(jìn)入 Jetbot 的 Jupyter 操作界面,然后開啟一個(gè)命令終端(如下圖):
現(xiàn)在先用 v4l2-ctl 工具檢查一下 CSI 攝像頭的狀況,請?jiān)诮K端輸入以下指令:
#如果是Docker版,請先安裝v4l-utils工具aptinstallv4l-utils#執(zhí)行檢測指令v4l2-ctl--list-devices#如果檢測到/dev/video0,繼續(xù)檢測這個(gè)設(shè)備的細(xì)部參數(shù)v4l2-ctl --device=/dev/video0 --all
細(xì)部參數(shù)就不花時(shí)間說明,主要讓大家知道當(dāng)有需要的時(shí)候,就可以用 v4l2-ctl 這個(gè)工具查看細(xì)節(jié)。
接下去開始用 Jupyter 的代碼,來測試 CSI 攝像頭的工作狀況。首先創(chuàng)建一個(gè)新的“Notebook”(如下圖步驟),這是 Jupyter 的工作區(qū)域。
每次新開的 Notebook 都是如下圖的狀況,會(huì)有一個(gè)[ ] 與一個(gè)方框:
現(xiàn)在就將下面代碼復(fù)制到在 Notebook 的方框內(nèi)里,由于前面“v4l2-ctl”檢測到這個(gè)攝像頭的寬高為(1640, 1232),因此在代碼中將攝像頭與 widgets 的圖形尺寸都設(shè)為這兩個(gè)數(shù)字:
fromjetbotimportCamera,bgr8_to_jpegimportipywidgets.widgetsaswidgetsfromIPython.displayimportdisplayimporttraitletscamera=Camera.instance(width=1640,height=1232)image=widgets.Image(format='jpeg',width=1640,height=1232)camera_link=traitlets.dlink((camera,'value'),(image,'value'),transform=bgr8_to_jpeg)display(image)
然后按一下“Ctrl-Enter”組合鍵就能執(zhí)行,正常的話就能在下方看到一個(gè)方框顯示攝像頭所捕捉的動(dòng)態(tài)畫面,這樣就完成 CSI 攝像頭的測試。顯示有點(diǎn)小延遲是正常的,畢竟這里選擇的是(1640, 1232)尺寸,試試將尺寸都縮小到 1/2 之后,是不是就流暢的多?
如果要停止攝像頭播放,就用上面的“+”號添加一個(gè)“指令格”,然后在里面輸入:
camera_link.unlink()
然后用“Ctrl-Enter”執(zhí)行這個(gè)指令,這時(shí)候顯示畫面就處于凍結(jié)狀態(tài),不會(huì)播放顯示器所捕捉的內(nèi)容。
假如想要讓攝像頭再次執(zhí)行播放,就在下面再添加一個(gè)“指令格”,輸入:
camera_link.link()
按下“Ctrl-Enter”執(zhí)行,就會(huì)看到顯示框里的內(nèi)容又開始執(zhí)行動(dòng)態(tài)播放了。
代碼解說
由于 Jupyter 并不支持 OpenGL 功能,無法像圖形桌面那樣直接播放視頻,因此在這里需要使用一些固定的技巧,將視頻轉(zhuǎn)成圖形方式去顯示,上面這段代碼可以說是 Jetbot 所有實(shí)驗(yàn)啟動(dòng) CSI 攝像頭的標(biāo)準(zhǔn)內(nèi)容。
這個(gè)代碼中有幾個(gè)關(guān)鍵的部分:
1. jetbot的Camera模塊:
早期 Jetbot 的攝像頭是基于 NVIDIA 的 JetCam 項(xiàng)目,提供對 CSI 與 USB 兩類攝像頭的支持,不過最新版本中仿佛只對 CSI 攝像頭提供支持,并且將底層的代碼放在 jetbot/camera 下面的幾只 .py 里面。
這使得調(diào)用方式變得非常簡單,只要將寬與高提供給 Camera.instance (寬,高)就可以,不需要再指定攝像頭的編號。
2. ipywidgets:
這個(gè)模塊為 jupyter 提供非常好用的“互動(dòng)式小部件”,為原本只提供靜態(tài)顯示的教學(xué)環(huán)境,注入非常生動(dòng)與多樣化互動(dòng)的功能。
熟悉圖形化開發(fā)工具的朋友就應(yīng)該知道,很多這類工具會(huì)提供下拉式選項(xiàng)、滑塊調(diào)整、復(fù)選框、文字框這類的小部件,可以組建較為復(fù)雜的儀表盤。
在后面控制 Jetbot 車輪的實(shí)驗(yàn)中會(huì)使用到多種這類小部件,這里只是用到比較簡單的 widgets.image 功能,設(shè)定輸出為“jpeg”格式圖像。
3. iPython.display:
這是一個(gè) python 互動(dòng)式界面里的顯示功能,這里就是將 widget.image 輸出的 jpeg 圖像顯示在 Jupyter。
4. traitlets:
如果從整個(gè)英文字去翻譯,這個(gè)庫就被稱為“叛徒庫”,其實(shí)是蠻奇怪的東西。但如果將這個(gè)字切割成“trait”與“-let”組合,就能解釋成“小特征”的含義,例如 booklet 是小冊子、eaglet 是小老鷹的意思。
這個(gè)庫的功能非常強(qiáng)大,除了能為我們處理“類型檢查”之外,還能為動(dòng)態(tài)計(jì)算提供預(yù)設(shè)值、修改屬性之后發(fā)出更改的事件信號、處理屬性值之間的交互影響,為我們簡化很多復(fù)雜的交錯(cuò)關(guān)系。
在上述代碼中“camera_link=traitlets.dlink((camera, 'value'), (image, 'value'), transform=bgr8_to_jpeg)”,將攝像頭讀取的圖像與 widgets.image 所創(chuàng)建的 image 對象產(chǎn)生動(dòng)態(tài)關(guān)聯(lián),并將攝像頭圖形執(zhí)行“bgr8_to_jpeg”轉(zhuǎn)換,存放到 image 里,最后再由 display(image)顯示出來。
至于 camera_link 物件就能在后面透過.link()與.unlink()執(zhí)行開關(guān)人任務(wù),以實(shí)現(xiàn)“暫?!迸c“再啟動(dòng)”的功能。
這樣我們對 Jetbot 攝像頭的調(diào)用與使用,就有個(gè)初步的了解,在后面實(shí)驗(yàn)中就能更清楚的感受到這些功能的使用。
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(43):CSI攝像頭安裝與測試
文章出處:【微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
NVIDIA
+關(guān)注
關(guān)注
14文章
4978瀏覽量
102984 -
攝像頭
+關(guān)注
關(guān)注
59文章
4836瀏覽量
95597 -
瀏覽器
+關(guān)注
關(guān)注
1文章
1022瀏覽量
35328
原文標(biāo)題:NVIDIA Jetson Nano 2GB 系列文章(43):CSI攝像頭安裝與測試
文章出處:【微信號:NVIDIA-Enterprise,微信公眾號:NVIDIA英偉達(dá)企業(yè)解決方案】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論