騰訊雲技術社群-掘金主頁持續為大家呈現雲端計算技術文章,歡迎大家關注!
作者:劉瀟龍
OpenCV
OpenCV是時下最流行的基於C++的開源計算機視覺庫,它功能豐富,函式眾多,從最基本的讀寫圖片,到簡單的影象處理(比如降噪濾波、邊緣檢測、影象變換、特徵提取等),再到更加高階的行人檢測、人臉識別、文字識別等,盡皆包含。在OpenCV提供的函式的基礎上,我們可以很方便地開發自己的應用,實現自己的演算法。總的來說,就是OpenCV非常強大。具體有多強大?那得用了才知道。
很多要做人臉識別,要用到SIFT特徵的人都問過的一個問題是,為什麼配置好opencv之後,卻找不到人臉識別的標頭檔案,找不到SIFT在哪?這是因為OpenCV3.0之後,把一些還在最新的,但不是很穩定的,還在測試階段的東西放在了contrib模組裡面。而且官方預設不帶contrib模組。不幸的是,我們最想用的人臉識別和SIFT特徵都在contrib裡面。如果需要用的話,那就需要自己編譯了。opencv在Visual Studio上的配置和編譯contrib的方法可以參考我之前的部落格。今天的內容仍然是用Python語言,最近用Python用著比較順手。
OpenCV的Python環境配置
顯然,跟眾多基於C++的庫一樣, OpenCV也是有Python介面的。Python下配置OpenCV可以用下面兩種方法:
官網下載並安裝OpenCV之後,在目錄
\opencv\build\python\2.7\x64
之下有一個cv2.pyd
檔案,把它拷貝到python安裝目錄下的\Lib\site-packages
資料夾下面即可。需要注意的是版本要對應,比如這裡就要對應64位的Python2.7。而且目前官方自帶的只有Python2.7版本的包。如果想要其他版本怎麼辦?那就要說到一個神奇的網站了:Unofficial Windows Binaries for Python Extension Packages,這裡麵包含了幾乎所有的能用到的Python庫的安裝包,比如我們需要的OpenCV,這裡可以找到下面這麼多版本,可以適應不同的需求,還有編譯的contrib版本的,簡直是驚喜。
按照自己的環境下載相應的版本,然後還是用pip安裝,命令如下:
pip install *.whl
請把星號換成對應的名字。
我這裡用的是Python3.6包含contrib的64位的包。
貓臉檢測
喵星人真的是要統治世界了。不然為什麼OpenCV自帶的檢測器中除了人臉檢測、行人檢測這些意料之中就應該存在的檢測器之外,還悄悄多出了貓臉檢測器呢。
今天我們就來試一下這個貓臉檢測到底 是什麼樣的?基於OpenCV的貓臉檢測十分簡單。用Python的話只有區區20行程式碼。其中20行程式碼中發揮主要作用的只有一個函式:
detectMultiScale()
此函式的作用是,在輸入影象中檢測不同尺寸的物件,返回包含物件的矩形框。它接收的引數:
1.image——輸入影象
2.scaleFactor——表示每輪檢測影象齒輪減少的比例
3.minNeighbors——指明物件要至少被檢測到幾次才能判定物件確實存在
4.minSize——檢測物件的最小尺寸
5.maxSize——檢測物件的最大尺寸
程式碼
按照慣例,註釋齊全,無需多說。
# -*- coding=utf-8 -*-
import cv2
# 載入貓臉檢測器
catPath = "haarcascade_frontalcatface.xml"
faceCascade = cv2.CascadeClassifier(catPath)
# 讀取圖片並灰度化
img = cv2.imread("cat1.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 貓臉檢測
faces = faceCascade.detectMultiScale(
gray,
scaleFactor= 1.02,
minNeighbors=3,
minSize=(150, 150),
flags=cv2.CASCADE_SCALE_IMAGE
)
# 框出貓臉並加上文字說明
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 0, 255), 2)
cv2.putText(img,'Cat',(x,y-7), 3, 1.2, (0, 255, 0), 2, cv2.LINE_AA)
# 顯示圖片並儲存
cv2.imshow('Cat?', img)
cv2.imwrite("cat.jpg",img)
c = cv2.waitKey(0)複製程式碼
效果
執行Python指令碼後效果如下:
舉一反三
本文雖然只是在說貓臉檢測,但是在OpenCV下,人臉檢測、行人檢測、人眼檢測等都是同樣的道理,同樣的流程。只需要把最開始相應的檢測器換掉,然後按照實際情況調節detectMultiScale()
的引數即可。比如以下是人臉檢測的效果:
相關閱讀
OpenCV檢測篇(二)——笑臉檢測
超級無敵鑑黃師-永珍優圖