OpenCV-Python,計算機視覺開發利器
人工智慧,一個已經被談論了幾十年的概念。如今這幾年,相關技術的發展速度是越來越快。高大上如無人駕駛、智慧安防、AI輔助診斷,接地氣如刷臉支付、內容推薦、自動翻譯等,眾多領域藉助人工智慧的力量而進化。從百度搜尋指數的變化,也能從一個側面反映出關注度在不斷上升。

而這其中,很多應用都涉及到“ 計算機視覺 ”這樣一個細分領域。簡單來說,就是將影象資訊轉化為計算機可以處理的數字資訊,從而讓計算機能“看得見”。這個資訊不僅僅是二維的圖片,也包括三維場景、視訊序列等。基本上所有需要用到攝像頭、圖片、視訊的應用場景,都離不開計算機視覺的支援。因此,這也是人工智慧領域中比較熱門的一個方向。

而說到計算機視覺,就不能不提到 OpenCV ,它是一個歷史悠久、功能豐富、社群活躍的開源視覺開發庫。一方面,它提供了計算機視覺以及影象處理方面最常用最基礎的功能支援,是開發的必備工具;另一方面,它在新版本中緊跟潮流,加入對新的演算法、硬體的支援(v3.3 正式引入 DNN)。
OpenCV 基於 C++ 編寫,但提供了 Python、Ruby、MATLAB 等多種語言介面。這對於習慣使用 Python 開發的人工智慧從業者來說非常方便。Python 本身的易用性和數值計算庫(如 numpy、pandas),加上 OpenCV 在視覺方面的眾多功能,讓 OpenCV-Python 成為一個效率極高的視覺開發利器。今天我們就用幾個常見的例子,演示下 OpenCV-Python 的強大和易用。
OpenCV 的安裝,不同平臺不同版本會有一些差異,網上有很多教程,這裡不贅述。需要提醒的是,由於 Python 和 OpenCV 版本都比較多,安裝時務必要 確認版本及系統位數 的對應。另外我個人建議使用 Anaconda 環境安裝。
我們用影象處理的經典範例 Lenna 來做測試:

最基本的 影象讀寫 :
import cv2 as cv # 讀圖片 img = cv.imread('img/Lenna.png') # 圖片資訊 print('圖片尺寸:', img.shape) print('圖片資料:', type(img), img) # 顯示圖片 cv.imshow('pic title', img) cv.waitKey(0) # 新增文字 cv.putText(img, 'Learn Python with Crossin', (50, 150), cv.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 4) # 儲存圖片 cv.imwrite('img/Lenna_new.png', img) 複製程式碼
輸出:


OpenCV-Python 中的影象資料使用了 numpy 庫的 ndarray 型別進行管理,便於進行各種數值計算和轉換。
常見的影象處理:
import numpy as np # 灰度圖 img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) cv.imwrite('img/Lenna_gray.png', img_gray) # 二值化 _, img_bin = cv.threshold(img_gray, 127, 255, cv.THRESH_BINARY) cv.imwrite('img/Lenna_bin.png', img_bin) # 平滑 img_blur = cv.blur(img, (5, 5)) cv.imwrite('img/Lenna_blur.png', img_blur) # 邊緣提取 _, contours, _ = cv.findContours(img_bin, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) img_cont = np.zeros(img_bin.shape, np.uint8) cv.drawContours(img_cont, contours, -1, 255, 3) cv.imwrite('img/Lenna_cont.png', img_cont) 複製程式碼
輸出:

這幾種都屬於 數字影象處理 的常用方法。OpenCV-Python 基本都封裝好的介面,只需一兩行程式碼就能完成,在實際專案開發中非常方便。
我們程式設計教室之前的“ 每週習題 ”裡,和影象相關的題目基本都可以用 OpenCV-Python 來解決。
對這方面知識感興趣的,可以找本數字影象處理的相關教材系統地看一遍,瞭解數字影象處理的理論基礎會很有幫助。
除了基礎功能,OpenCV 在程式碼附帶的 Samples 裡還提供了一些經典開發案例:
人臉檢測 ofollow,noindex">github.com/opencv/open…
使用方法:
python facedetect.py 複製程式碼
核心程式碼:
cascade = cv.CascadeClassifier("haarcascade_frontalface_alt.xml") rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30), flags=cv.CASCADE_SCALE_IMAGE) 複製程式碼
此功能基於** Haar 分類器**實現,專案中附帶有訓練好的分類器檔案。此外,你還可以使用 OpenCV 訓練針對其他目標特徵的分類器,以用來檢測其他物體。
我們之前的開發案例《 Python 送你一頂聖誕帽 》就使用了 OpenCV-Python 的人臉識別程式碼。

使用方法:
python openpose.py --model pose.caffemodel --proto pose.prototxt --dataset MPI 複製程式碼
核心程式碼:
net = cv.dnn.readNetFromCaffe(args.proto, args.model) inp = cv.dnn.blobFromImage(frame, 1.0 / 255, (inWidth, inHeight), (0, 0, 0), swapRB=False, crop=False) net.setInput(inp) out = net.forward() 複製程式碼
在 3.3 版本後,OpenCV 正式引入 DNN(深度神經網路) ,支援 Caffe、TensorFlow、Torch/PyTorch 等主流框架的模型,可用以實現影象的識別、檢測、分類、分割、著色等功能。
姿態識別程式碼基於 CMU 的 openpose 專案實現( github.com/CMU-Percept… ),執行時所需的模型(.caffemodel)和配置檔案(.prototxt)可從此專案中下載。

使用方法:
python fast_neural_style.py --model starry_night.t7 複製程式碼
核心程式碼:
net = cv.dnn.readNetFromTorch(args.model) net.setPreferableBackend(cv.dnn.DNN_BACKEND_OPENCV); inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight), (103.939, 116.779, 123.68), swapRB=False, crop=False) net.setInput(inp) out = net.forward() 複製程式碼
風格遷移程式碼基於 ECCV 2016 的論文《 Perceptual Losses for Real-Time Style Transfer and Super-Resolution 》實現( github.com/jcjohnson/f… ),使用了 Torch 訓練好的模型,多種風格模型檔案可從此專案中下載。

我們之前的文章 Python+OpenCV 十幾行程式碼模仿世界名畫 裡有關於影象風格遷移更詳細的介紹。
以上便是 OpenCV-Python 的一些簡單應用。OpenCV 官方 Samples 程式碼裡還有很多有趣的例子( github.com/opencv/open… ),更強大的功能也有待你在開發中逐步體會。希望這篇管中窺豹的文章可以讓各位對 OpenCV 和計算機視覺有一個初步的瞭解和直觀的認識,進而共同參與到人工智慧這場技術浪潮中來。
想獲取更多學習資源和程式碼例項,歡迎關注我們的公眾號 Crossin的程式設計教室 ,並在其中回覆關鍵字 專案