# OpenCV in Python ## Introduction (簡介) :::info - OpenCV 是 Open Source Computer Vision 的縮寫,是一個功能強大的開放原始碼的電腦視覺套件 - 它主要用於即時電腦視覺應用程式 - 主要用途 - OpenCV 的主要用途包括但不限於影像處理、視訊擷取和分析、物體識別與跟蹤、臉部識別和影像增強等 - 它支持多種功能,如影像讀取與寫入、影像轉換、濾波、形態學變換、邊緣偵測和特徵比對等 - 優點 1. **支援跨平台**:OpenCV 支持在多個操作系統上運行,包括 Windows、Linux 和 MacOS。 2. **GPU 加速**:OpenCV 支持 GPU 加速,能顯著提高計算速度。 3. **豐富的套件函數**:提供了多種影像處理和電腦視覺演算法,方便開發者使用。 4. **與其他套件的兼容性**:OpenCV 可以與 NumPy、SciPy 等科學計算套件無縫整合,使數據處理更加高效 - 缺點 1. **學習曲線陡峭**:對於初學者來說,OpenCV 的學習曲線較為陡峭,尤其是在處理複雜的電腦視覺任務時 2. **說明文件不夠詳細**:雖然 OpenCV 的說明文件已經相對完善,但在某些高級功能上仍有不夠詳細之處,可能需要開發者自己去研究和試驗 - OpenCV 適用於多種情境,包括但不限於: 1. **實時視頻處理**:如監控系統中的即時視訊串流分析 2. **物體識別與追踪**:如自動駕駛中的行人識別與追踪 3. **面部識別**:如安全防護系統中的臉部識別 4. **圖像增強與修復**:如醫療影像的增強與修復 ::: ## =========== For Windows ============= ### Step 1: 環境建立 :::info #### 建立資料匣 <kbd>![Screenshot 2024-06-02 at 7.59.17 AM](https://hackmd.io/_uploads/HyliIEFNC.jpg)</kbd> #### 進入資料匣,開啟 VSCode,建立此目錄下的 conda 環境 <kbd>![Screenshot 2024-06-02 at 8.05.28 AM](https://hackmd.io/_uploads/S1GiOVKVR.png)</kbd> <kbd>![Screenshot 2024-06-02 at 8.07.18 AM](https://hackmd.io/_uploads/H1ZJt4tEA.png)</kbd> <kbd>![Screenshot 2024-06-02 at 8.08.02 AM](https://hackmd.io/_uploads/Bk-lFEYVC.png)</kbd> #### 進入剛建立的環境下的終端機 <kbd>![Screenshot 2024-06-02 at 8.18.19 AM](https://hackmd.io/_uploads/SJSs9NYE0.jpg)</kbd> ::: ### Step 2: 在 conda 環境裡安裝 opencv 套件 :::success #### 尋找 opencv 在 conda 下安裝的指令 <kbd>![Screenshot 2024-06-02 at 8.24.46 AM](https://hackmd.io/_uploads/Bk5mnVYEC.png)</kbd> <kbd>![Screenshot 2024-06-02 at 8.25.01 AM](https://hackmd.io/_uploads/ryt43EFNR.jpg)</kbd> <kbd>![Screenshot 2024-06-02 at 8.30.08 AM](https://hackmd.io/_uploads/B1T3-HtVC.jpg)</kbd> #### 建一個 test.py 程式檔引用 `import cv2` 執行看看有沒有錯誤訊息 <kbd>![Screenshot 2024-06-02 at 8.53.08 AM](https://hackmd.io/_uploads/SJzJXHtVA.jpg)</kbd> ::: ### OpenCV 使用範例 :::warning #### 讀入影像,並顯示影像 <kbd>![Screenshot 2024-06-02 at 9.04.31 AM](https://hackmd.io/_uploads/Hy_3rSKVR.jpg)</kbd> <kbd>![Screenshot 2024-06-02 at 9.00.35 AM Large](https://hackmd.io/_uploads/BJbAHStE0.jpg)</kbd> #### 讀入彩色影像,轉換成灰階,顯示後將灰階影像存成檔案 <kbd>![Screenshot 2024-06-02 at 9.16.13 AM](https://hackmd.io/_uploads/ryM8uHF4R.jpg) </kbd> <kbd>![Screenshot 2024-06-02 at 9.11.34 AM Large](https://hackmd.io/_uploads/SyxvOBtNR.jpg) </kbd> #### 讀入影像,加入藍色矩形框框,將結果儲存成檔案 <kbd>![Screenshot 2024-06-02 at 9.32.48 AM Large](https://hackmd.io/_uploads/HkfshSYVA.jpg) </kbd> <kbd>![Screenshot 2024-06-02 at 9.24.27 AM Large](https://hackmd.io/_uploads/rJW23HF4C.jpg) </kbd> #### 使用 opencv 進行影像人臉辨識 先點 [<a href='https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml'>這個連結</a>] 下載檔案 <kbd>![Screenshot 2024-06-02 at 2.01.48 PM](https://hackmd.io/_uploads/SJ8InFKER.jpg)</kbd> <kbd>![Screenshot 2024-06-02 at 2.02.00 PM](https://hackmd.io/_uploads/rkywntKE0.png)</kbd> <kbd>![Screenshot 2024-06-02 at 4.05.05 PM](https://hackmd.io/_uploads/HyZSOsKVA.jpg)</kbd> <kbd>![Screenshot 2024-06-02 at 2.15.38 PM Large](https://hackmd.io/_uploads/HktwdiK4A.jpg) </kbd> **補充說明** ```python= faces = face_cascade.detectMultiScale(grayImg, 1.1, 4) ``` 在 `detectMultiScale(grayImg, 1.1, 4)` 指令參數為 1. **grayImg**: - 這是輸入圖像,應該是一個灰度圖像。為了提高檢測速度和準確性,通常先將彩色圖像轉換為灰度圖像。 2. **1.1 (scaleFactor)**: - 這個參數指定了圖像大小在每個圖像金字塔層級縮放的比例。1.1 意味著每次圖像尺寸減少 10%。如果設置為 1.05,則每次尺寸縮小 5%。這個參數可以控制檢測的細緻程度,數值越小檢測越精細,但也會增加計算量。 3. **4 (minNeighbors)**: - 這個參數指定每個候選矩形應該具有多少個鄰近矩形才能被保留。數值越高,檢測結果越少但質量越高(即,誤檢的可能性更小)。這個參數可以過濾掉一些誤檢的結果。 <kbd>![OpenCV_FaceRecognition](https://hackmd.io/_uploads/SJ6enotV0.jpg)</kbd> source: <a href="https://pyimagesearch.com/2018/09/24/opencv-face-recognition/">https://pyimagesearch.com/2018/09/24/opencv-face-recognition/</a> ::: ## =========== For Mac ============= ### Package installation (套件安裝) (Mac OS) Step 1: 建立一個資料匣 Step 2: 進入資料匣之後 以 VSCode 建立 Conda env (舉例 OpenCV_Project) Step 3: 進入 OpenCV_Project 環境的終端機畫面 Step 4: 使用 `conda install conda-forge::opencv` 指令安裝 OpenCV 套件 <kbd>![Screenshot 2024-06-01 at 9.19.29 PM](https://hackmd.io/_uploads/BJguWjO4C.png)</kbd> <kbd>![Screenshot 2024-06-01 at 9.19.06 PM](https://hackmd.io/_uploads/HyW3bidV0.png)</kbd> Step 5: 使用 `python -m pip install opencv-python` 安裝 OpenCV 套件 <kbd>![Screenshot 2024-06-01 at 9.24.59 PM](https://hackmd.io/_uploads/BJoWMjdE0.png)</kbd> Step 6: 建立一個 python 檔測試看看 套件是否安裝成功 <kbd>![Screenshot 2024-06-01 at 9.30.21 PM](https://hackmd.io/_uploads/H1voModE0.png) </kbd> ### 使用 opencv 讀入影像並顯示影像 :::success <kbd>![Screenshot 2024-06-01 at 10.22.29 PM](https://hackmd.io/_uploads/BJV8fhdVR.png) </kbd> <kbd>![Screenshot 2024-06-01 at 10.29.02 PM Large](https://hackmd.io/_uploads/ByMRf3dEC.jpg)</kbd> ```python= import cv2 if __name__ == "__main__": img = cv2.imread('imgs/IMG_0464.jpeg') cv2.imshow('image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` ::: ### 讀入影像將影像轉成灰階影像後顯示影像並儲存成檔案 :::info <kbd>![Screenshot 2024-06-01 at 10.48.37 PM](https://hackmd.io/_uploads/BkYsrnu4R.png)</kbd> <kbd>![Screenshot 2024-06-01 at 10.43.54 PM Large](https://hackmd.io/_uploads/rJ6hB3OEA.jpg) </kbd> ```python= import cv2 if __name__ == "__main__": img = cv2.imread('imgs/IMG_0464.jpeg') gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) cv2.imshow('Gray image', gray_image) cv2.waitKey(0) cv2.destroyAllWindows() cv2.imwrite('imgs/gray_image.jpg', gray_image) ``` ::: ### 讀入影像在影像中畫紅色框框 :::warning <kbd>![Screenshot 2024-06-01 at 11.04.25 PM](https://hackmd.io/_uploads/HysLqhOVC.png) </kbd> <kbd>![Screenshot 2024-06-01 at 11.08.54 PM](https://hackmd.io/_uploads/r1aY5h_4C.jpg) </kbd> ```python= import cv2 img = cv2.imread('imgs/IMG_0464.jpeg') imgH, imgW = img.shape[0], img.shape[1] start_point = (int(imgW/4), int(imgH/4)) end_point = (int(imgW*3/4), int(imgH*3/4)) color = (0, 0, 255) # BGR 中的紅色 thickness = 8 image = cv2.rectangle(img, start_point, end_point, color, thickness) cv2.imwrite('imgs/rectangle_output.jpg', image) ``` ::: ### 讀入影像並識別影像中的人臉 :::info 先前往 <a href='https://github.com/kipr/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml'>連結</a> 下載人臉檢測的 xml 檔,並將檔案放到程式相同資料匣內 <kbd>![Screenshot 2024-06-01 at 11.27.43 PM](https://hackmd.io/_uploads/HykWWpdVC.png)</kbd> **範例程式** <kbd>![Screenshot 2024-06-03 at 9.25.36 AM](https://hackmd.io/_uploads/Hk_Ts954A.jpg) </kbd> **執行結果** <kbd>![Screenshot 2024-06-01 at 11.36.44 PM](https://hackmd.io/_uploads/Hy8UZaOE0.jpg)</kbd> ```python= import cv2 if __name__ == '__main__': # 載入人臉檢測的 xml 檔案 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') image = cv2.imread('imgs/IMG_0464.jpeg') gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.1, 4) for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 255), 6) cv2.imshow('Face Detection', image) cv2.waitKey() cv2.destroyAllWindows() cv2.imwrite('imgs/face_detection.jpg', image) ``` :::