Jetson Nano 基礎教學 01 – Webcam

Jetson Nano 開發板可以開機後,下一步當然就是接Webcam來照相及錄影!

買了邊緣運算開發板後,開機的下一步通常都是連接鏡頭模組,讓這個裝置可以拍照或錄影。Jetson Nano除了可以使用像是Pi camera這種MIPI CSI-2的鏡頭之外,也可以使用手邊比較容易有的USB Webcam。

本篇要介紹如何在Jetson Nano上使用Webcam及OpenCV套件進行拍照、錄影、縮時攝影,還有做一些有趣的特效,使用的程式語言為Python。

還沒有成功開機的人可以參考製作開機SD卡及基礎設定教學: << NVIDIA Jetson Nano 實際使用難不難?從入手到安裝系統、開機與遠端連線 >>

將Jetson Nano開機後,開始來玩Webcam的各種功能吧!

本文大綱

  • 事前準備 – 安裝OepnCV
  • Let me take a selfie – 拍照
  • 理工文青風 – 縮時攝影
  • 尋找Green flash的天文迷 – 錄影存檔
  • 互動藝術裝置 – 影像串流搭配特效
作者/攝影  蔡雨錡
時間  2小時
難度  ★★☆☆☆
材料表
  • Jetson Nano x 1(商城連結)
  • SD 卡 x 1
  • 電源供應器 x 1
  • Webcam (Logitech C270) x 1
  • HDMI螢幕 x 1
  • 鍵盤 x 1
  • 滑鼠 x 1

事前準備 – 安裝OpenCV

點選Jetson Nano畫面的右上角圖示,搜尋「terminal」。點擊並開啟終端機(terminal)後輸入以下指令。

先更新apt套件清單並升級既有套件,並安裝nano文字編輯器。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential nano

再安裝OpenCV

sudo apt-get install python3-opencv

測試OpenCV是否成功安裝,在terminal中輸入以下指令

python -c "import cv2; print(cv2.__version__)"

如果順利顯示OpenCV版本就代表安裝成功!

Let me take a selfie – 拍照

在terminal中下指令:

ls -ltrh /dev/video*

可以找到USB Webcam編號(本範例中為video0,代表編號為0),填入OpenCV的VideoCapture()指令中,就能順利使用Webcam囉!

 在terminal中執行,建立一個新的python檔案,本範例使用nano文字編輯器,你也可以使用你喜歡的任意程式編輯器,例如vim、jupyter lab等等。

nano LetMeTakeASelfie.py

輸入以下的程式:

# 匯入函式庫
import cv2
# 設定從哪顆鏡頭讀取影像,本範例中為video0
webcam = cv2.VideoCapture(0)
# 讀取影像
return_value, image = webcam.read()
# 儲存名為Me.png的照片
cv2.imwrite("Me.png", image)
# 刪除webcam,養成不佔用資源的好習慣
del(webcam)

按「Ctrl+O」、「Enter」存檔之後,按「Ctrl+X」退出。

在terminal中輸入以下指令

python3  LetMeTakeASelfie.py

將鏡頭對準自己並微笑,然後按下Enter鍵。

將將將將,你就有一張名為Me.png的自拍照啦!

你也可以拍其他喜愛的人物跟景色。開心拍照之餘,建議幫照片取名稱時可以加上日期/時間/用途/地點等重要資訊,能增加可讀性。

開啟新程式檔案、儲存檔案以及執行程式檔案這三步驟,在本篇後面都不會再重複描述,可以使用程式用途替程式命名。

理工文青風 – 縮時攝影

變化多端的天空,今天是什麼樣貌呢?用Jetson Nano搭配羅技C270來做縮時攝影吧!縮時攝影其實就是把固定時間間隔拍的照片全部串聯在一起做成影片。會使用for迴圈來控制拍照的張數、以及time套件來控制縮時攝影拍照的時間間隔。

在縮時攝影開始前,可以先用拍照程式確認照片的構圖、取景是不是自己想要的。

# 匯入函式庫
import os
import cv2
import time

# 設定照片儲存資料夾路徑
path = "pics"

# 如果照片路徑不存在,就建立這個資料夾
if not os.path.isdir(path):
    os.mkdir(path)

# 設定從哪顆鏡頭讀取影像,本範例中為video0
webcam = cv2.VideoCapture(0)

# 範例中為求測試執行,設定拍5張照片,每兩秒拍一張照片
# 也可以設定執行24小時(86400s) - 拍8640張照片,每十秒拍一張照片,以此類推
for i in range(5):
    # 使用try/except防呆
    try:
        # 使用日期以及時間替每張照片命名
        date=time.strftime("%Y-%m-%d_%H-%M-%S")
        
        # 從攝影機擷取影像
        return_value, image = webcam.read()
        
        # 儲存到特定資料夾中,避免放在同資料夾下造成雜亂
        cv2.imwrite("pics/"+date+".png", image)
        
        # 等待兩秒
        time.sleep(2)
    except:
        # 如果無法拍照則印出警告文字,可以自己設定內容
        print("Cannot take pictures!")
# 刪除webcam,養成不佔用資源的好習慣
del(webcam)

也可以修改時間總長度、拍的照片張數、拍照間隔時間。存了許多照片後,我們可以使用以下的程式碼將這些照片製作成影片。

# 匯入函式庫
import os
import cv2
 
# 用於儲存圖檔位置的清單
imagefile_list = []
img_array = []

# 設定照片儲存資料夾路徑
path = "pics"

# 搜集圖檔位置清單
for r,d,f in os.walk(path):
    for file in f:
        imagefile_list.append(os.path.join(r,file))

# 按圖檔名稱排列順序
sorted_imagefile_list=sorted(imagefile_list)

# 將圖檔按清單順序讀出並加到
for filename in sorted_imagefile_list:
    #讀圖
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width,height)
    img_array.append(img)
 
# 定義要輸出的影片名稱為TimeLapse.mp4,fps為10,長寬大小按照原圖片比例
out = cv2.VideoWriter("TimeLapse.mp4",cv2.VideoWriter_fourcc(*'DIVX'), 10, size)
 
# 寫入新影片
for i in range(len(img_array)):
    out.write(img_array[i])
out.release()

程式跑完了之後,縮時影片TimeLapse.mp4就完成啦!

尋找Green flash的天文迷 – 錄影存檔

有些美好的景色有如曇花一現,稍縱即逝。如果想要尋找夕陽西沉時,僅有在天氣晴朗、太陽接近地平線的那瞬間的Green flash。除了每天癡情的等待,也可以使用Jetson Nano錄影存檔,幫你記錄每一時刻,絕對不會錯過綠閃的那一剎那。與架設腳架及攝影機相比也有另一番浪漫,而且成本較低且不容易被偷。

錄影片的程式如下,按下Q鍵即可結束錄影,也可以改成用time.sleep(秒數)來控制影片長度:

# 匯入函式庫
import cv2

# 設定從哪顆鏡頭讀取影像,本範例中為video0
webcam = cv2.VideoCapture(0)

# 設定擷取影像的尺寸大小
webcam.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
webcam.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 使用 XVID 編碼
fourcc = cv2.VideoWriter_fourcc(*'XVID')

# 建立 VideoWriter 物件,輸出影片至 Video.mp4
# FPS 值為 20.0,解析度為 640x480
out = cv2.VideoWriter("Video.mp4", fourcc, 20.0, (640, 480))

while(webcam.isOpened()):
    return_value, frame = webcam.read()
    if return_value == True:
        # 寫入影格
        out.write(frame)
        # 顯示影像
        cv2.imshow('frame',frame)
    else:
        break
    # 按下 q 鍵跳出迴圈結束錄影
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放所有資源
webcam.release()
out.release()
cv2.destroyAllWindows()

接下來你只需要架設好Jetson Nano套組,就可以在你想要的時間錄下影片了!

 互動藝術裝置 – 影像串流搭配特效

 辦活動或是展覽時,有時會需要有跟來賓或是路過民眾有互動的大型裝置藝術單單使用Jetson Nano搭配攝影鏡頭及大螢幕,就可以做很多有趣的互動題目。

在搭配特效之前,要先讓Jetson Nano可以做到即時顯示影像串流。光是可以做到影像串流,就可以製作常見的魔鏡效果,讓異地的人可以透過面前的魔鏡看到另一片魔鏡中的他/她。

影像串流程式如下:

# 匯入函式庫
import numpy as np
import cv2

# 選擇攝影機video0
webcam = cv2.VideoCapture(0)

while(True):
    # 從攝影機擷取影像
    return_value, frame = webcam.read()

    ####特效放這裡####
    
    # 顯示影像
    cv2.imshow("frame", frame)

    # 按下 q 鍵跳出迴圈
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 釋放攝影機
webcam.release()

# 關閉所有 OpenCV 視窗
cv2.destroyAllWindows()

以下的不同特效程式碼取代 ####特效放這裡#### 後,會有不一樣的效果唷!

變色效果特效:

frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)

圖片模糊化:

frame  = cv2.blur(frame , (11, 11))

圖片銳利化:

kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)
frame = cv2.filter2D(frame, -1, kernel=kernel)

可以搭配特效後,除了拍貼機、自動化妝、服裝搭配、場景切換等效果,還可以搭配人臉辨識、人體骨架辨識、距離深度辨識,製作各式各樣的遊戲。

對其他攝影鏡頭相關的教學有興趣想了解或是有不錯的作品想分享,歡迎在下面留言讓我們知道~

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *