你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
上篇文章教大家使用NVIDIA Jetson Nano來開機,這篇則會帶著大家使用常用來做視覺處理的OpenCV,想要一起嘗試的朋友可以點我取得NVIDIA Jetson Nano Developer Kit!
作者 | 吳怡庭 |
難度 | 簡單 |
材料表 |
|
一、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的版本編號就代表安裝成功囉!
三、拍張照!
在teriminal中輸入以下指令查詢webcam的編號
ls -ltrh /dev/video*
此範例中查詢完得到結果編號為0。
在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
四、讀取、編輯、展示影像
此範例使用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指令執行上方程式。
五、提取顏色
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()
成果如下圖,藍色區域被提取出來囉!
六、RGB、BGR、HSV
這裡簡單說明一下各個顏色表示的格式。
RGB中文為三原色光模式,是用紅(Red)、綠(Green)、藍(Blue)三原色的色光以不同的比例相加,合成產生各種色彩,而OpenCV中預設的格式為BGR,也就是將順序調動,如果在程式中需要改變格式,可以使用以下程式碼轉換。
cv2.crtColor(影像來源, BGR2RGB)
或是
cv2.crtColor(影像來源, RGB2BGR)
RGB或BGR轉換成HSV就比較麻煩一點,各位朋友可以直接參考下表進行此篇文章的提取顏色實作。
也可以使用網路上的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()
呈現結果就會如下圖所示,將提取藍色的圖片和灰階圖結合在一起。
調整參數,lower和upper分別改為[60,43,46]和[88,255,255],疊合圖片中的閾值改為30,即會呈現綠色的抽色影像。
八、添加文字
最後教大家在影像中添加文字內容,我們使用putText()函式。
在程式中加入以下內容
cv2.putText(img_result, 'Blue', (100,200), cv2.FONT_HERSHEY_PLAIN, 5, (255, 0, 0), 7, cv2.LINE_AA)
括弧中的各項參數分別代表
cv2.putText(影像來源, 文字內容, 座標, 字型, 字體大小,文字顏色, 線條寬度, 線條種類)
其中座標是以字串的左下角為定位,常用的字體可將上方程式碼的PLAIN改為SIMPLEX、DUPLEX、COMPLEX、TRIPLEX、COMPLEX_SMALL、SCRIPT_SIMPLEX、SCRIPT_COMPLEX,文字顏色則為前面提過的BGR格式。
本次實作教學就到這邊,大家有沒有成功做出自己的抽色圖片呢?未來我們將會推出更多豐富的內容,有興趣歡迎關注我們!
看完文章想要使用Jetson Nano實作的朋友可以點此取得Jetson Nano開發套件。
資料來源&相關連結:
OpenCV官網:https://opencv.org/
OpenCV Wiki:https://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/
评论