Computer Vision
Tags: beginners, python, tutorial, thai
Published: 2023-04-11 13:43:18

**Computer Vision** จะเกี่ยวกับการสร้างแบบจำลองและการจำลองการมองเห็นของมนุษย์โดยใช้ซอฟต์แวร์และฮาร์ดแวร์คอมพิวเตอร์ วันนี้เราจะพาไป เรียนรู้รายละเอียดเกี่ยวกับเรื่องนี้
- ทำความเข้าใจฉาก 3 มิติจากภาพ 2 มิติ ของโครงสร้างที่มีอยู่ในภาพ

> 
**Computer Vision Hierarchy**
1. **Low-level vision** − การประมวณภาพ การแยกคุณลักษณะของภาพ
1. **Intermediate-level vision** − จะรวมถึง การจดจำวัตถุ และการประมั่วผลภาพ 3 มิติ
1. **High-level vision** − จะมีการอธิบาย แนวคิดของภาพ เช่น กิจกรรม ความตั้งใจ และพฤติกรรม

---

อย่างแรกเลยคือต้องติดตั้ง ไลบรารี ที่ชื่อว่า OpenCV (Open Source Computer Vision) เป็นไลบรารีของฟังก์ชั่นการเขียนโปรแกรมที่ ที่เกี่ยวกับ Computer Vision แบบเรียลไทม์เป็นหลัก

```
pip install opencv_python
```

---

## สอนการอ่าน และ เขียนไฟล์ภาพ ด้วยฟังก์ชั่นของ **OpenCV**
`imread()`คือ ฟังก์ชั่นสำหรับการอ่านไฟล์ภาพ 
`imshow()`คือ ฟังก์ชั่นสำหรับโชว์รูปภาพ ตัวรูปภาพจะมีขนาดเท่ากับ ไฟล์ต้นทาง
`imwrite()`คือ ฟังก์ชั่นสำหรับเขียนหรือ สร้างไฟล์ภาพ
(รองรับสกุลไฟล์เช่น PNG, JPEG, JPG, TIFF เป็นต้น)

**ตัวอย่าง** 
(ใช้ colab)

```
import numpy as np
import cv2 as cv 
from google.colab.patches import cv2_imshow # for image display
from skimage import io
from PIL import Image 
import matplotlib.pylab as plt
```
```
img = io.imread("/content/matty.jpg")
```
อ่านไฟล์
```
cv2_imshow(img)
```
แสดงผลภาพ

```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/khvvpp187rr7h6iog8jl.png)


```

```
cv2.imwrite('save_newmatty.png'img)
```
จะทำการเขียนไฟล์ ขึ้นมาใหม่(เป็นสกุลไฟล์อื่นได้) โดยชื่อ save_newmatty 

```
True
```
จะแสดงผล True เมื่อเขียนไฟล์สำเร็จ
---
## Color Space Conversion
ใน OpenCV รูปภาพจะไม่ถูกจัดเก็บโดยใช้ค่าสีใน RGB ทั่วไป แต่ย้อนกลับแทน คือ BGR
`cvtColor()`
ฟังก์ชันการแปลงสี สำหรับการแปลงรูปภาพจากรหัสสีหนึ่งไปเป็นรหัสสีอื่น

**ตัวอย่าง**
```
import numpy as np
import cv2 as cv 
from google.colab.patches import cv2_imshow # for image display
from skimage import io
from PIL import Image 
import matplotlib.pylab as plt
```
ลงไลบรารี

```
img = cv2.imread("/content/matty.jpg")
```

```
img_new = cv.cvtColor(img,cv.COLOR_BGR2RGB)
final_frame = cv.hconcat((img, img_new))
cv2_imshow(final_frame)
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6yame0ftkyl1nqxdtlqx.png)
จะเห็นว่าภาพแรกคือภาพ ค่าสี BGR ส่วนอีกภาพคือกลับเป็นRGB

```
img_gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv2_imshow(img_gray)
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rqyv9y6qb1n6s23v21s2.png)
เปลี่ยนเป็นค่าสี grayscale

---

## Edge Detection
หลังจากที่ได้เห็นภาพร่างคร่าวๆ แล้ว คนเราสามารถจดจำประเภทของวัตถุและท่าทางของพวกมันได้

นั่นเป็นเหตุผลที่ Edge(เส้นขอบ/ขอบ) มีบทบาทสำคัญกับการประยุกต์ใช้ ใน Computer Vision

OpenCV มีฟังก์ชันที่เรียบง่ายและมีประโยชน์ที่เรียกว่า `Canny()` สำหรับการตรวจจับเส้นขอบ

**ตัวอย่าง**
```
import numpy as np
import cv2 as cv 
from google.colab.patches import cv2_imshow # for image display
from skimage import io
from PIL import Image 
import matplotlib.pylab as plt
```
ลงไลบรารี
```
cv2.imwrite('img_edge.jpg',cv2.Canny(img,200,300))
```
เขียนไฟล์ใหม่ ที่เป็นรูปแบบ edge

```
cv2_imshow(io.imread("/content/img_edge.jpg"))
```
แสดงผลภาพดังกล่าว
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fk2vfxkidow1xkahgqme.png)

---

## Face Detection
การตรวจจับใบหน้าเป็นอีกหนึ่งเทคโนโลยี ที่น่าทึ่งของ Computer Vision ซึ่งตัว OpenCv จะมีฟังก์ชั้นในเรื่องของการตรวจจับใบหน้าอยู่ด้วย เรียกว่า  Haar cascade classifier
Haar Cascade Data

เราต้องการ ข้อมูล data เพื่อใช้ Haar Cascade Classifier ไฟล์ cascade
จำเป็นที่จะต้องติดตั้งไฟล์ haarcascade_frontalface_default.xml

**ตัวอย่าง**

```
import cv2 
import common 
import numpy as np 

%matplotlib inline 
from matplotlib import pyplot as plt # this lets you draw inline pictures in the notebooks
import pylab # this allows you to control figure size 
pylab.rcParams['figure.figsize'] = (10.0, 8.0)
```
ลงไลบรารี
```
base_image = cv2.imread('matty.jpg')
grey = cv2.cvtColor(base_image, cv2.COLOR_BGR2GRAY)
```
ลองเรียกรูปภาพ และ เปลี่ยนค่าสี
```
test_image = cv2.imread('matty.jpg')
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(grey,1.01)
for (x,y,w,h) in faces:
     cv2.rectangle(test_image,(x,y),(x+w,y+h),(255,0,0),2)
plt.imshow(cv2.cvtColor(test_image, cv2.COLOR_BGR2RGB))
```
เรียกฟังก์ขั่น มาใช้ กับภาพที่เปลี่ยนสีแล้ว จากนั้น วาดรูปสี่เหลี่ยม ตรงจุดที่พบใบหน้า
แสดงผลบนภาพต้นฉบับที่ถูกเปลี่ยนค่าสีกลับเป็น RGB

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/he27dtfh2xr5srqj927b.png)
ความแม่นยำมาก น้อย อยู่ที่สูตรคำนวณและ ภาพต้นฉบับด้วย

---

## Eye Detection
การตรวจจับดวงตา ก็เป็นอีกเทคโนโลยีนึงที่ มาใน haarcascade
ซึ่งจำเป็นต้องติดตั้งไฟล์ haarcascade_eye.xml

**ตัวอย่าง**
(ใช้ไลบรารี เดิม)
```
test_image = cv2.imread('matty.jpg')
eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')
eyes = eye_cascade.detectMultiScale(grey, 1.3, 1)
for (x,y,w,h) in eyes:
     cv2.rectangle(test_image,(x,y),(x+w,y+h),(255,255,255),2)
plt.imshow(cv2.cvtColor(test_image, cv2.COLOR_BGR2RGB))
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r75pnq2hcu4qe8lntk65.png)
แสดงผล

---

> **reference**
{% embed https://colab.research.google.com/github/computationalcore/introduction-to-opencv/blob/master/notebooks/4-Cascade_classification.ipynb %}
{% embed https://www.tutorialspoint.com/artificial_intelligence_with_python/artificial_intelligence_with_python_computer_vision.htm %}
{% embed https://colab.research.google.com/github/computationalcore/introduction-to-opencv/blob/master/notebooks/1-Fundamentals.ipynb %}
{% embed https://www.ultimatepython.co/post/face-detection-opencv-python %}