---
# System prepended metadata

title: 如何帥氣D上網課-python篇

---

# 如何帥氣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 擷取網路攝影機串流影像，處理並寫入影片檔案教學")
