# 如何帥氣D上網課-python篇
今天我們要來學習python+opencv的一些簡易用法,也增添一下遠距上課的樂趣~
## opencv環境建置
首先最重要也是最麻煩的就是opencv的環境建置拉,因為每個人電腦環境的差異,在安裝時可能會遇到很多小問題,這邊寫出來也很麻煩,所以遇到問題的話就麻煩大家問個google大神拉~可以用**anaconda opencv安裝**當關鍵字來找,這邊就示範最基礎的安裝~~
### anaconda
首先要有python的環境,最簡單的方法就是安裝anaconda,他自帶了很多opencv的模組,這樣我們就不用一個一個去安裝了。
首先先到anaconda官網下載

按照自己電腦的版本選擇

下載下來之後就按照指令完成安裝就好了。
### opencv
雖然opencv需要的numpy、matplotlib在anaconda裡就包含了,但opencv本身是沒有的,所以這裡要額外安裝一下。
安裝好anaconda後,打開內附的anaaconda powershell prompt(如下)並用系統管理員身分執行

在命令列中貼上`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所錄下來的影像。

綠色三角形

(給各位看個梅茵(?
既然能順利運作了,我們就再加一點程式碼來玩一下吧!
```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()
```
### 再來點更進階的!
接下來我們來試試加上一些濾鏡吧!我們這次來試素描濾鏡

(梅茵素描版?)
要做出這個特效就要將基本範例中的讀到的圖片做一些修改,以下是要新增的程式碼:
```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的。

安裝完畢後,開啟程式,新增來源

選擇視窗剪取並新增

選擇剛才python產生出的視窗(又是梅茵了~~)

適當的調整大小並按下右下角的**虛擬攝影機**按鍵

這樣就完成設定啦!只要再到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 擷取網路攝影機串流影像,處理並寫入影片檔案教學")