# 如何帥氣D上網課-python篇 今天我們要來學習python+opencv的一些簡易用法,也增添一下遠距上課的樂趣~ ## opencv環境建置 首先最重要也是最麻煩的就是opencv的環境建置拉,因為每個人電腦環境的差異,在安裝時可能會遇到很多小問題,這邊寫出來也很麻煩,所以遇到問題的話就麻煩大家問個google大神拉~可以用**anaconda opencv安裝**當關鍵字來找,這邊就示範最基礎的安裝~~ ### anaconda 首先要有python的環境,最簡單的方法就是安裝anaconda,他自帶了很多opencv的模組,這樣我們就不用一個一個去安裝了。 首先先到anaconda官網下載 ![](https://i.imgur.com/gJtjTOJ.png) 按照自己電腦的版本選擇 ![](https://i.imgur.com/sO1N3ag.png) 下載下來之後就按照指令完成安裝就好了。 ### opencv 雖然opencv需要的numpy、matplotlib在anaconda裡就包含了,但opencv本身是沒有的,所以這裡要額外安裝一下。 安裝好anaconda後,打開內附的anaaconda powershell prompt(如下)並用系統管理員身分執行 ![](https://i.imgur.com/cv8oBpB.png) 在命令列中貼上`conda install -c conda-forge opencv`並等待他跑完 最後我們打開anaconda內附的spyder,試著輸入以下內容, ```python import cv2 print(cv2.__version__) ``` 如果跑出版本號(應該是4.0.1)就代表成功了! ## 程式撰寫 接下來就要進到python程式的部分了,雖然有些人可能沒學過python或是程式語言,但今天教的內容都十分容易理解,不需要基礎,如果你不想糾纏這些內容的話也可以直接複製最終的程式來用。當然,如果你想要趁這個機會學python的話,網路上也有很多U質教學可以參考~ 首先先來看看最基本的範例和裡面的註解~ ```python import cv2 as cv #匯入opencv模組並取名為cv cap = cv.VideoCapture(0) #建立一個webcam物件 while True: _, img = cap.read() #不斷從webcam物件讀取圖片 cv.namedWindow('img', cv.WINDOW_NORMAL) #開啟一個img視窗 cv.imshow('img', img) #在img視窗將圖片秀出來 if cv.waitKey(1) & 0xFF == ord('q'): #如果按下'q'就跳出迴圈 break cap.release() #釋放webcam cv.destroyAllWindows() #關閉所有視窗 ``` 在稍微了解了這些程式到底在做什麼後,可以試著按上方的綠色三角形,來執行程式碼。開始執行後,會看到跳出一個叫img的視窗,裡面就會即時顯示webcam所錄下來的影像。 ![](https://i.imgur.com/lvK3Dec.png) 綠色三角形 ![](https://i.imgur.com/qTgssta.png) (給各位看個梅茵(? 既然能順利運作了,我們就再加一點程式碼來玩一下吧! ```python import random as rd import time time.sleep(rd.randint(1,13)/10) ``` 來看看這兩行程式碼,第一行`import random as rd`就是加入一個產生隨機數的模組,第二行`import time`則是控制時間的模組。第三行可以分成兩部份,一個是`time.sleep()`,可以讓程式暫停一段時間,以秒為單位,第二部份是`rd.uniform(0.1,1.3)`可以取得在0.1到1.3之間的浮點數。加上了這些程式,就能讓我們在while迴圈中間隔一段不固定時間才讀取資料,這樣輸出的畫面就看起來像是網路當掉了一樣。下面就是完整的程式碼。 另外,要停止程式的話,記得要對著視窗按q鍵才行,不然內核可是會當掉的。 ### 假裝網路lag(?程式碼 ```python import cv2 as cv import time import random as rd #import numpy as np cap = cv.VideoCapture(0) while True: time.sleep(rd.uniform(0.1,1.3)) _, img = cap.read() cv.namedWindow('img', cv.WINDOW_NORMAL) cv.imshow('img', img) if cv.waitKey(1) & 0xFF == ord('q'): break # Release the VideoCapture object cap.release() cv.destroyAllWindows() ``` ### 再來點更進階的! 接下來我們來試試加上一些濾鏡吧!我們這次來試素描濾鏡 ![](https://i.imgur.com/nC22tto.png) (梅茵素描版?) 要做出這個特效就要將基本範例中的讀到的圖片做一些修改,以下是要新增的程式碼: ```python gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #轉換成灰階影像 gaussian = cv.GaussianBlur(gray, (5,5), 0) #高斯模糊 用來律波 canny = cv.Canny(gaussian, 50, 100) #canny運算元設定 用來偵測邊緣 ret, result = cv.threshold(canny, 0, 255, cv.THRESH_BINARY_INV+cv.THRESH_OTSU) #套用canny運算元 ``` 裡面提到了高斯模糊、canny運算元等專有名詞,要理解這這些內容需要一定的數學基礎,我目前也還不是十分了解,不過大家可以參考[這篇文章](https://medium.com/@bob800530/opencv-%E5%AF%A6%E4%BD%9C%E9%82%8A%E7%B7%A3%E5%81%B5%E6%B8%AC-canny%E6%BC%94%E7%AE%97%E6%B3%95-d6e0b92c0aa3),裡免有針對這兩個名詞的說明。下面就直接來看完整的程式吧! ### 素描濾鏡程式碼 ```python # -*- coding: utf-8 -*- import cv2 as cv import numpy as np cap = cv.VideoCapture(0) while True: _, img = cap.read() gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) gaussian = cv.GaussianBlur(gray, (5,5), 0) canny = cv.Canny(gaussian, 50, 100) ret, result = cv.threshold(canny, 0, 255, cv.THRESH_BINARY_INV+cv.THRESH_OTSU) cv.imshow('result',np.vstack((result))) if cv.waitKey(1) & 0xFF == ord('q'): break cap.release() cv.destroyAllWindows() ``` ## 假裝成攝影機 在成功輸出後製後的影片視窗後,接下來就要模擬成相機,讓視訊軟體去讀他~ 這裡我們要用的是obs studio這個軟體,他也常用在電腦直播上。首先先到官網去下載,這個軟體也是有支援linux的。 ![](https://i.imgur.com/VG0ye3Y.png) 安裝完畢後,開啟程式,新增來源 ![](https://i.imgur.com/6eIXaOQ.png) 選擇視窗剪取並新增 ![](https://i.imgur.com/jrbaE5O.png) 選擇剛才python產生出的視窗(又是梅茵了~~) ![](https://i.imgur.com/JuBKQ5q.png) 適當的調整大小並按下右下角的**虛擬攝影機**按鍵 ![](https://i.imgur.com/5O1qeWC.png) 這樣就完成設定啦!只要再到classroom將鏡頭來源改為 obs vitual camera 就可以在會議中看到了!其他會議軟題也是通用的。 除了這個用途,obs studio本身也有很多功能,大家也可以順便試試看! ## 參考 - [anaconda opencv安裝](https://anaconda.org/conda-forge/opencv) - [python doc random](https://docs.python.org/3/library/random.html) - [邊緣偵測懶人包-Canny演算法](https://medium.com/@bob800530/opencv-%E5%AF%A6%E4%BD%9C%E9%82%8A%E7%B7%A3%E5%81%B5%E6%B8%AC-canny%E6%BC%94%E7%AE%97%E6%B3%95-d6e0b92c0aa3) - [python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)](https://zhuanlan.zhihu.com/p/335826924) - [OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學](https://blog.gtwang.org/programming/opencv-webcam-video-capture-and-file-write-tutorial/ "OpenCV 擷取網路攝影機串流影像,處理並寫入影片檔案教學")