# 電算社資訊營
## 第三天:圖像處理與人臉辨識
---
## 講師:昱山
---
## 目錄
* OpenCV 是什麼?
* 影像的讀取與顯示
* 影像儲存與操作
* 圖像運算與繪圖
* 文字標註
* 臉部辨識與馬賽克處理(實作)
---
# OpenCV 是什麼?
* 全名:**Open Source Computer Vision Library**
* 一個跨平台、開源的電腦視覺函式庫
* 用於:影像處理、人臉辨識、物件追蹤、手勢偵測...等
---
## 安裝套件(Colab)
```python
!pip install opencv-python
!pip install opencv-contrib-python
```
---
# 影像基本操作
---
## 讀取圖像
```python
import cv2
img = cv2.imread('圖片路徑')
```
---
## 顯示圖像
```python
cv2.imshow("視窗名稱", img) # 需桌面 GUI 支援
```
> 在 Colab 中無法使用 `imshow()`,需改用:
```python
from google.colab.patches import cv2_imshow
cv2_imshow(img)
```
---
## 儲存圖像
```python
cv2.imwrite("儲存路徑.jpg", img)
```
---
## 等待按鍵 & 關閉視窗
```python
cv2.waitKey(0) == ord('q') # 等待按下 q 鍵
cv2.destroyWindow("視窗名稱")
cv2.destroyAllWindows() # 關閉所有視窗
```
---
# 繪圖功能
---
## 畫直線、矩形、圓形
```python
cv2.line(img, (x1, y1), (x2, y2), (255, 0, 0), 2)
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 3)
cv2.circle(img, (cx, cy), r, (0, 0, 255), -1) # 實心
```
---
## 橢圓、多邊形
```python
cv2.ellipse(img, (cx, cy), (40, 20), 0, 0, 360, (255,255,0), 2)
pts = np.array([[100,50],[200,80],[150,150]], np.int32)
cv2.polylines(img, [pts], isClosed=True, color=(0,255,255), thickness=2)
```
---
## 加入文字
```python
cv2.putText(img, "Hello OpenCV", (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 0, 0), 2)
```
---
# 圖像運算
---
## 圖片加法、減法(疊圖)
```python
img1 = cv2.imread('img1.jpg')
img2 = cv2.imread('img2.jpg')
result = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
```
---
## 區域遮罩與裁切
```python
roi = img[100:200, 150:250] # 裁切區域
img[0:100, 0:100] = roi # 貼到新位置
```
---
# 臉部辨識與馬賽克
---
## 前置作業
```python
import cv2
from google.colab.patches import cv2_imshow
from google.colab import files
```
* 上傳圖片:
```python
uploaded = files.upload()
```
---
## 灰階處理 + 載入模型
```python
img = cv2.imread('mona.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(gray, 1.2, 3)
```
---
## 馬賽克處理程式碼
```python
for (x, y, w, h) in faces:
mosaic = img[y:y+h, x:x+w]
mosaic = cv2.resize(mosaic, (w//15, h//15), interpolation=cv2.INTER_LINEAR)
mosaic = cv2.resize(mosaic, (w, h), interpolation=cv2.INTER_NEAREST)
img[y:y+h, x:x+w] = mosaic
cv2.imwrite("amoo.jpg", img)
cv2_imshow(img)
```
{"title":"電算社資訊營第三天","description":"OpenCV 是什麼?","contributors":"[{\"id\":\"b831f9fa-52bb-4a09-bfbb-148e4fdadd0f\",\"add\":2518,\"del\":147,\"latestUpdatedAt\":1755218214588}]"}