OpenCV-Python速查表:從導(dǎo)入圖像到人臉檢測
——本文對圖像裁剪、調(diào)整大小、旋轉(zhuǎn)、閾值、模糊、在圖像上繪圖和書寫、人臉檢測和使用輪廓圖像檢測對象都進行了解釋。

什么是OpenCV-Python?
OpenCV是一個開源的計算機視覺(computer vision)和機器學(xué)習(xí)庫。它擁有超過2500個優(yōu)化算法,包括經(jīng)典和最先進的計算機視覺和機器學(xué)習(xí)算法。它有很多語言接口,包括Python、Java、c++和Matlab。
這里,我們將處理Python接口。
安裝
在Windows上, 請在這里查看指南。地址:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_setup/py_setup_in_windows/py_setup_in_windows.html
在 Linux上, 請在這里查看指南。地址:https://docs.opencv.org/trunk/d7/d9f/tutorial_linux_install.html
圖像導(dǎo)入&顯示

警告1: 通過openCV讀取圖像時,它不是以RGB 顏色空間來讀取,而是以BGR 顏色空間。有時候這對你來說不是問題,只有當你想在圖片中添加一些顏色時,你才會遇到問題。
有兩種解決方案:
將R?—?第一個顏色值(紅色)和B ?—?第三個顏色值(藍色) 交換, 這樣紅色就是 (0,0,255) 而不是(255,0,0)。
將顏色空間變成RGB:

使用rgb_image代替image繼續(xù)處理代碼。
警告2: 要關(guān)閉顯示圖像的窗口,請按任意按鈕。如果你使用關(guān)閉按鈕,它可能會導(dǎo)致窗口凍結(jié)(我在Jupyter筆記本上運行代碼時發(fā)生了這種情況)。
為了簡單起見,在整個教程中,我將使用這種方法來查看圖像:


來源:Pixabay
裁剪

來源:Pixabay

裁剪后的狗狗

其中:image[10:500,500:200] 是 image[y:y+h,x:x+w]。
調(diào)整大小

來源:Pexels

調(diào)整大小到20%后

這個調(diào)整大小函數(shù)會保持原始圖像的尺寸比例。
更多圖像縮放函數(shù),請查看這里。(https://www.tutorialkart.com/opencv/python/opencv-python-resize-image/ )
旋轉(zhuǎn)

左圖: 圖片來自Pexels的Jonathan Meyer。右圖: 進行180度旋轉(zhuǎn)之后的狗狗。

image.shape輸出高度、寬度和通道。M是旋轉(zhuǎn)矩陣——它將圖像圍繞其中心旋轉(zhuǎn)180度。
-ve表示順時針旋轉(zhuǎn)圖像的角度 & +ve逆表示逆時針旋轉(zhuǎn)圖像的角度。
灰度和閾值(黑白效果)

來源:Pexels

gray_image 是灰度圖像的單通道版本。
這個threshold函數(shù)將把所有比127深(小)的像素點陰影值設(shè)定為0,所有比127亮(大)的像素點陰影值設(shè)定為255。
另一個例子:

這將把所有陰影值小于150的像素點設(shè)定為10和所有大于150的像素點設(shè)定為200。
更多有關(guān)thresholding函數(shù)的內(nèi)容,請查看這里。(https://docs.opencv.org/3.4/d7/d4d/tutorial_py_thresholding.html )

左圖:灰階狗狗。右圖:黑白狗狗。
模糊/平滑

左圖:圖像來自Pixabay。右圖:模糊后的狗狗。

高斯模糊函數(shù)接受3個參數(shù):
第一個參數(shù)是要模糊的圖像。
第二個參數(shù)必須是一個由兩個正奇數(shù)組成的元組。當它們增加,模糊效果也會增加。
第三個參數(shù)是sigmaX和sigmaY。當左邊位于0時,它們會自動從內(nèi)部大小計算出來。
更多關(guān)于模糊函數(shù)的內(nèi)容,請查看這里。(https://docs.opencv.org/3.1.0/d4/d13/tutorial_py_filtering.html )
在圖像上繪制矩形框或邊框

左圖:圖像來自Pixabay。右圖:臉上有一個矩形框的狗狗。

rectangle函數(shù)接受5個參數(shù):
第一個參數(shù)是圖像。
第二個參數(shù)是x1, y1 -左上角坐標。
第三個參數(shù)是x2, y2 -右下角坐標。
第四個參數(shù)是矩形顏色(GBR/RGB,取決于你如何導(dǎo)入圖像)。
第五個參數(shù)是矩形線寬。
繪制一條線

左圖:圖像來自Pixabay。右圖:兩只狗狗用一條線分開。

line函數(shù)接受5個參數(shù):
第一個參數(shù)是要畫的線所在的圖像。
第二個參數(shù)是x1, y1。
第三個參數(shù)是x2, y2。
第四個參數(shù)是線條顏色(GBR/RGB,取決于你如何導(dǎo)入圖像)。
第五個參數(shù)是線寬。
在圖片上寫入文字

左圖:圖像來自Pixabay。右圖:兩只狗狗用一條線分開。

putText函數(shù)接受 七個參數(shù):
第一個參數(shù)是要寫入文本的圖像。
第二個參數(shù)是待寫入文本。
第三個參數(shù)是x, y——文本開始的左下角坐標。
第四個參數(shù)是字體類型。
第五個參數(shù)是字體大小。
第六個參數(shù)是顏色(GBR/RGB,取決于你如何導(dǎo)入圖像)。
第七個參數(shù)是文本線條的粗細。
人臉檢測
這里沒有找到狗狗照片,很遺憾:(

圖片來自Pixabay,作者:Free-Photos。

detectMultiScale函數(shù)是一種檢測對象的通用函數(shù)。因為我們調(diào)用的是人臉級聯(lián),所以它會檢測到人臉。
detectMultiScale函數(shù)接受4個參數(shù):
第一個參數(shù)是灰階圖像。
第二個參數(shù)是scaleFactor。因為有些人臉可能離鏡頭更近,所以看起來會比后臺的人臉更大。比例系數(shù)彌補了這一點。
檢測算法使用一個移動窗口來檢測對象。minNeighbors定義在當前對象附近檢測到多少對象,然后再聲明檢測到人臉。
與此同時,minsize給出了每個窗口的大小。

檢測到兩張人臉。
輪廓——一種對象檢測方法
使用基于顏色的圖像分割,你可以來檢測對象。
cv2.findContours & cv2.drawContours 這兩個函數(shù)可以幫助你做到這一點。
最近,我寫了一篇非常詳細的文章,叫做《使用Python通過基于顏色的圖像分割來進行對象檢測》。你需要知道的關(guān)于輪廓的一切都在那里。(https://towardsdatascience.com/object-detection-via-color-based-image-segmentation-using-python-e9b7c72f0e11 )
最終,保存圖片

總結(jié)
OpenCV是一個非常容易使用的算法庫,可以用于3D建模、高級圖像和視頻編輯、跟蹤視頻中的標識對象、對視頻中正在做某個動作的人進行分類、從圖像數(shù)據(jù)集中找到相似的圖像,等等。
最重要的是,學(xué)習(xí)OpenCV對于那些想要參與與圖像相關(guān)的機器學(xué)習(xí)項目的人來說是至關(guān)重要的。
英文原文:https://qiniumedia.freelycode.com/vcdn/1/%E4%BC%98%E8%B4%A8%E6%96%87%E7%AB%A0%E9%95%BF%E5%9B%BE3/opencv-python-cheetsheet.pdf
譯者:好酒不上頭
來源:Python程序員
End 
聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)術(shù)交流之目的。文章版權(quán)歸原作者所有。如有不妥,請聯(lián)系刪除。
