嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

[第一次用Jetson Nano 就上手]OpenCV基礎應用(繁體)

上篇文章教大家使用NVIDIA Jetson Nano來開機,這篇則會帶著大家使用常用來做視覺處理的OpenCV,想要一起嘗試的朋友可以點我取得NVIDIA Jetson Nano Developer Kit!

作者 吳怡庭
難度 簡單
材料表
  • NVIDIA Jetson Nano Developer Kit
  • 5V4A變壓器
  • 64GB Samsung micro SD卡
  • 外接螢幕(HDMI接頭)
  • USB鍵盤
  • USB滑鼠
  • USB Wi-Fi dongle(也可使用有線網路)
  • USB攝影機(本文使用羅技C270 webcam)

 

一、OpenCV介紹

OpenCV,全名Open Source Computer Vision Library,是一個被廣泛使用的電腦視覺函式庫,可用於圖像處理、運動追蹤、圖形識別等不同的領域,不僅擁有跨平台的優勢(Linux、Windows、Mac等作業系統都可執行),也提供了不同程式語言的介面(例如:C++、Python、Java等),更重要的是,它以BSD條款授權發行,無論是商業或者研究領域,都可以免費使用!

二、OpenCV安裝

將Jetson Nano開機(如果您還不會開機操作,請參考我們的開機教學),開啟terminal,輸入以下指令更新apt套件清單並升級既有套件。

sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install build-essential
sudo pip3 install opencv-python
sudo apt-get install python3-opencv

由於需要撰寫程式碼,請安裝nano文字編輯器,也可以使用您習慣的任何編輯器,像是vim、jupyter lab等。

sudo apt-get install nano

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

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

如果顯示OpenCV的版本編號就代表安裝成功囉!

0128_102918e113aaa1b4db853df97cd299160158c7ad.png

三、拍張照!

在teriminal中輸入以下指令查詢webcam的編號

ls -ltrh /dev/video*

此範例中查詢完得到結果編號為0。

0224_710ec7a00b7e26bc184376d3076423749464d4bd.png

在teriminal中輸入以下指令,使用nano文字編輯器建立並撰寫Python程式碼,如果後續想編輯程式也可使用相同指令,本文以檔名TakePicture作為範例

nano TakePicture.py

打開文字編輯器後在裡面輸入以下程式,此範例中使用到OpenCV的VideoCapture()讀取影像以及imwrite()儲存檔案的功能

# 匯入OpenCV函式庫
import cv2
# 設定從哪顆鏡頭讀取影像,在括弧中填入先前查詢到的webcam編號
webcam = cv2.VideoCapture(0)
# 讀取影像
return_value, image = webcam.read()
# 儲存名為Picture.png的照片
cv2.imwrite("Picture.png", image)
# 刪除webcam,避免影像佔用資源
del(webcam)

寫完程式請記得按「Ctrl+O」、「Enter」存檔,如果要退出編輯請按「Ctrl+X」。

在terminal中輸入以下指令,按下「Enter」即可執行程式使用攝影機拍照啦!

python3 TakePicture.py

0326_e059209c90204820e5f61abecd3c67478f6e8802.png

四、讀取、編輯、展示影像

此範例使用imread()讀取先前使用webcam拍攝的影像,cvtColor()中的cv2.COLOR_BGR2GRAY參數設定將影像從OpenCV預設的BGR格式轉換為灰階,並使用imshow()啟動視窗展示影像。

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

# 讀取影像
img = cv2.imread('Picture.png')
# 將影像轉換為灰階
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
# 存檔
cv2.imwrite('img_gray.jpg',img_gray)
# 開啟視窗顯示影像
cv2.imshow('img_gray',img_gray)
# 不刷新影像
cv2.waitKey(0)
# 釋放資源
cv2.destroyAllWindows()

和前一個範例一樣,在terminal中使用python3指令執行上方程式。

0413_9de11b420b5bb36aa52225031982e6f73d76e058.jpg

五、提取顏色

OpenCV中可以透過一些運算提取影像中的顏色,如果影像中的顏色較為單一,這項技術可用於簡單的對象檢測、物體追蹤或是去除背景。

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

# 讀取圖片
img = cv2.imread('Picture.png')

# OpenCV的顏色預設是BGR格式,這邊將其轉換為HSV格式
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 以HSV格式決定要提取的顏色範圍,顏色格式的說明請參考後續內容
lower = np.array([100,43,46])
upper = np.array([124,255,255])
# 將HSV影像的閾值設定為想要提取的顏色
mask = cv2.inRange(hsv, lower, upper)
# 使用bitwise_and()合併掩膜(mask)和原來的影像
img_specific = cv2.bitwise_and(img,img, mask= mask)
# 存檔
cv2.imwrite('img_specific.jpg', img_specific)
# 展示原圖、掩膜、抽取顏色後的影像
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow(' img_specific ', img_specific)
cv2.waitKey(0)
cv2.destroyAllWindows()

成果如下圖,藍色區域被提取出來囉!

058_18c4b920f0e242c341d4434ecc179b13d9b2d657.jpg

六、RGB、BGR、HSV

這裡簡單說明一下各個顏色表示的格式。

RGB中文為三原色光模式,是用紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,合成產生各種色彩,而OpenCV中預設的格式為BGR,也就是將順序調動,如果在程式中需要改變格式,可以使用以下程式碼轉換。

cv2.crtColor(影像來源, BGR2RGB)

或是

cv2.crtColor(影像來源, RGB2BGR)

RGB或BGR轉換成HSV就比較麻煩一點,各位朋友可以直接參考下表進行此篇文章的提取顏色實作。

0620_dae56431f006947df3ba9f274bafb6ac0c58a323.png

也可以使用網路上的RGB轉HSV色碼轉換器找到自己需要的顏色,修改上面程式碼中要提取的顏色範圍,不過一般的HSV色碼為H(0~360∘)、S(0%~100%)、V(0%~100%),如要在OpenCV中使用,需要將數字等比例轉換成H(0~180、S(0~255)、V(0~255)的範圍。例如藍色的RGB色碼為(0,0,255),經過色碼轉換器後HSV的色碼為(240,100%,100%),在OpenCV實作時需輸入(120,255,255)。

七、圖片疊合及抽色影像

有些攝影家拍攝完會再後製成凸顯特定顏色的藝術照片,有了前面實作的成果,我們也可以利用OpenCV的函式來做到類似的效果。

由於直接用使用add()將兩張影像疊合會容易導致顏色改變,所以我們需要做一些處理,以下程式也可應用於影像大小一樣的圖片去背及疊合。

import cv2
import numpy as np
# 讀取影像
img_gray = cv2.imread('img_gray.jpg')
img_specific = cv2.imread('img_specific.jpg')

# 將提取顏色的影像轉換為灰階
img_specific_gray = cv2.cvtColor(img_specific,cv2.COLOR_BGR2GRAY)     
# 下方數字50為閾值,可修改閾值範圍(0~255)來調整掩膜區域,並轉換為二元影像
ret, mask = cv2.threshold(img_specific_gray,50, 255, cv2.THRESH_BINARY)
# 將掩膜反相
mask_inv = cv2.bitwise_not(mask)

# 使用bitwise_and()和掩膜從灰階圖中排除已被提取顏色的區域
img_gray_bg = cv2.bitwise_and(img_gray,img_gray,mask = mask_inv)
# 使用bitwise_and()和掩膜設定提取顏色的區域
img_specific_fg = cv2.bitwise_and(img_specific,img_specific,mask = mask)

# 使用add()將兩張圖片疊加
img_result = cv2.add(img_gray_bg,img_specific_fg)
# 存檔並展示
cv2.imwrite(' img_result.jpg', img_result)
cv2.imshow(' img_result ', img_result)
cv2.waitKey(0)
cv2.destroyAllWindows()

呈現結果就會如下圖所示,將提取藍色的圖片和灰階圖結合在一起。

075_b51de14a1a20141283c1430828e261ee59b163c8.jpg

調整參數,lower和upper分別改為[60,43,46]和[88,255,255],疊合圖片中的閾值改為30,即會呈現綠色的抽色影像。

085_19143af1fb755866fb4caa5f112bf2818bb3cd93.jpg

八、添加文字

最後教大家在影像中添加文字內容,我們使用putText()函式。

在程式中加入以下內容

cv2.putText(img_result, 'Blue', (100,200), cv2.FONT_HERSHEY_PLAIN, 5, (255, 0, 0), 7, cv2.LINE_AA)

095_bb00947185537bc778796e6c22b61870f7ab0062.jpg

括弧中的各項參數分別代表

cv2.putText(影像來源, 文字內容, 座標, 字型, 字體大小,文字顏色, 線條寬度, 線條種類)

其中座標是以字串的左下角為定位,常用的字體可將上方程式碼的PLAIN改為SIMPLEX、DUPLEX、COMPLEX、TRIPLEX、COMPLEX_SMALL、SCRIPT_SIMPLEX、SCRIPT_COMPLEX,文字顏色則為前面提過的BGR格式。

本次實作教學就到這邊,大家有沒有成功做出自己的抽色圖片呢?未來我們將會推出更多豐富的內容,有興趣歡迎關注我們!

看完文章想要使用Jetson Nano實作的朋友可以點此取得Jetson Nano開發套件。

資料來源&相關連結:

OpenCV官網:https://opencv.org/

OpenCV Wikihttps://zh.wikipedia.org/wiki/OpenCV

OpenCV Github:https://github.com/opencv/opencv

OpenCV Tutorials:https://docs.opencv.org/master/d9/df8/tutorial_root.html

OpenCV中文網站:http://www.opencv.org.cn/

圖片疊合:https://www.twblogs.net/a/5bb03a202b7177781a0fdf6d

CAVEDU Education is devoted into robotics education and maker movement since 2008, and is intensively active in teaching fundamental knowledge and skills. We had published many books for readers in all ages, topics including Deep Learning, edge computing, App Inventor, IoT and robotics. Please check CAVEDU's website for more information: http://www.cavedu.com, http://www.appinventor.tw