OpenCV-Python,計算機視覺開發利器

人工智能 ,一個已經被談論了幾十年的概念(最先是 圖靈1950年 提出)。現在這幾年,相關技術的發展速度是愈來愈快。高大上如無人駕駛、智能安防、AI輔助診斷,接地氣如刷臉支付、內容推薦、自動翻譯等,衆多領域藉助人工智能的力量而進化。從百度搜索指數的變化,也能從一個側面反映出關注度在不斷上升。python

而這其中,不少應用都涉及到「 計算機視覺 」這樣一個細分領域。簡單來講,就是將圖像信息轉化爲計算機能夠處理的數字信息,從而讓計算機能「看得見」。這個信息不單單是二維的圖片,也包括三維場景、視頻序列等。基本上全部須要用到攝像頭、圖片、視頻的應用場景,都離不開計算機視覺的支持。所以,這也是人工智能領域中比較熱門的一個方向。git

來自《2017年人工智能行業發展研究報告白皮書》- IT耳朵&IT桔子github

而說到計算機視覺,就不能不提到 OpenCV ,它是一個歷史悠久、功能豐富、社區活躍的開源視覺開發庫。一方面,它提供了計算機視覺以及圖像處理方面最經常使用最基礎的功能支持,是開發的必備工具;另外一方面,它在新版本中緊跟潮流,加入對新的算法、硬件的支持(v3.3 正式引入 DNN)。算法

OpenCV 基於 C++ 編寫,但提供了 Python、Ruby、MATLAB 等多種語言接口。這對於習慣使用 Python 開發的人工智能從業者來講很是方便。以前的很多習題和開發案例中,咱們都有用到過。今天咱們再用幾個常見的例子,演示下 OpenCV-Python 的強大功能。編程

安裝:

OpenCV 的安裝,不一樣平臺不一樣版本會有一些差別。安裝前須要裝好 numpy ,強烈建議先安裝好 Anaconda ,而後直接經過命令安裝:工具

pip install opencv-python

若是你運氣好,代碼裏運行 import cv2 沒報錯就是成功了。學習

但大多數時候可能不行。你能夠考慮去這裏下載安裝文件:測試

https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencvui

而後經過命令從本地安裝:人工智能

pip install opencv_python3.4.3cp37cp37mwin_amd64.whl

這裏下載的安裝文件 版本 號務必要和你本機的 Python 版本位數 相對應。

若是安裝時還有其餘問題,可在網上直接搜索報錯,一般都會有解決方案,這裏不一一贅述。

基本的圖像讀寫:

咱們用圖像處理的經典範例 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 裏還提供了一些經典開發案例:

人臉檢測

https://github.com/opencv/opencv/blob/master/samples/python/facedetect.py

使用方法

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 的人臉識別代碼。獲取代碼請在公衆號(Crossin的編程教室)裏回覆關鍵字 聖誕帽

姿態識別

https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.py

使用方法

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()

詳情參見文章: 用 Python 實現抖音尬舞機
獲取代碼請在公衆號(Crossin的編程教室)裏回覆關鍵字 姿態

風格遷移

https://github.com/opencv/opencv/blob/master/samples/dnn/fast_neural_style.py

使用方法

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()

詳情參見文章: Python+OpenCV 十幾行代碼模仿世界名畫
獲取代碼請在公衆號(Crossin的編程教室)裏回覆關鍵字 名畫

以上即是 OpenCV-Python 的一些簡單應用。OpenCV 官方 Samples 代碼裏還有不少有趣的例子(地址:https://github.com/opencv/opencv )更強大的功能也有待你在開發中逐步體會。

但願這篇管中窺豹的文章可讓各位對 OpenCV 和計算機視覺有一個初步的瞭解和直觀的認識,進而共同參與到人工智能這場技術浪潮中來。

獲取更多學習資源和代碼實例,請在公衆號(Crossin的編程教室)裏回覆關鍵字 項目

════

其餘文章及回答:

如何自學Python|新手引導|精選Python問答|Python單詞表|人工智能|嘻哈|爬蟲|我用Python|高考|requests|AI平臺

歡迎搜索及關注: Crossin的編程教室

相關文章
相關標籤/搜索