theme: scrolls-light
一起用代碼吸貓!本文正在參與【喵星人征文活動】,
彭于晏又酷帥又積極向上,討人喜歡,貓咪很粘人很可愛,也很討人喜歡,那么強行發問,現在有一張彭于晏的帥照,我們怎么讓機器知道這張照片描述是是貓還是人呢?本文借助于計算機視覺庫,識別圖片描述的內容是人還是貓?
一、前言
為了快速識別圖片的內容,我們借助于Python的兩個庫,分別是opencv和Pillow,
1.1 OpenCV
OpenCV全稱是Open Source Computer Vision Library,是一個跨平臺的計算機視覺庫,
OpenCV可用于解決如下領域的問題:
- 增強現實
- 人臉識別
- 手勢識別
- 人機互動
- 動作識別
- 運動跟蹤
- 物體識別
- 影像分割
- 機器人
OpenCV已經包含臉部,眼睛,微笑等許多預先訓練的分類器,這些XML檔案存盤在GitHub倉庫上,
cat face
二選一即可 - haarcascadefrontalcatfaceextended.xml - haarcascade_frontalcatface.xml
human face
haarcascadefrontalfacedefault.xml
下載兩個檔案到工程目錄,cat face 檔案重命名為catfacedetector.xml;human face 檔案重命名為humanfacedetector.xml,
1.2 Pillow
Python Imaging Library 是一個免費的開源附加庫,可以支持打開、操作和保存多種不同的影像檔案格式,剛開始名為PIL,但在2011年停止了開發,后面一個名為Pillow的專案基于PIL分支繼續支持了影像的相關操作,并且支持了Python 3,
1.3 環境安裝
在一個安裝了Python 3環境的機器執行以下命令安裝對應的庫, python pip install opencv-python pillow
1.4 圖片準備
為了驗證撰寫程式的準確性,我們下載兩張圖片,分別是彭于晏和貓咪, 彭于晏這張照片命名為test1.jpg,

貓咪這張照片命名為test2.jpg,

二、代碼實踐
2.1 代碼分解
首先我們創建一個python的檔案cv.py,檔案先宣告匯入Python環境下我們要使用到的兩個庫,
python import cv2 from PIL import Image
然后加載工程目錄下得臉部特征模型檔案到程式,
```python catfacecascade = cv2.CascadeClassifier('catfacedetector.xml') humanfacecascade = cv2.CascadeClassifier('humanfacedetector.xml')
```
接下來首先讓我們調整影像大小,以便它們的大小相同,接下來,我們將它們轉換為灰度,我們的模型使用灰度影像更快,最后,讓我們將編輯的準備影像匯入我們的程式,以便我們可以運行貓面和人臉檢測模型
```python newsize = (600, 600) imgr1 = Image.open("test1.jpg") imgr1 = imgr1.resize(newsize) imgr1.save("resized1.jpg")
imgr2 = Image.open("test2.jpg") imgr2 = imgr2.resize(newsize) imgr2.save("resized2.jpg")
imgr1 = imgr1.convert('L') imgr1.save('ready1.jpg')
imgr2 = imgr2.convert('L') imgr2.save("ready2.jpg")
Read the input image
img1 = cv2.imread('ready1.jpg') img2 = cv2.imread('ready2.jpg') ```
現在是時候探測面孔了,我們將運行兩行代碼,第一個檢測影像中的人面,第二行是檢測影像中的貓面,
python human_faces = humanface_cascade.detectMultiScale(img1, scaleFactor=1.3, minNeighbors=5, minSize=(75, 75)) cat_faces = catface_cascade.detectMultiScale(img2, scaleFactor=1.3, minNeighbors=5, minSize=(75, 75))
接下來我們將在檢測到的面上繪制矩形,這些矩形可以是不同的顏色,并且它們的厚度水平也是可調的,
```python for (i, (x, y, w, h)) in enumerate(humanfaces): cv2.rectangle(img1, (x, y), (x+w, y+h), (220, 90, 230), 3) cv2.putText(img1, "Human Face - #{}".format(i + 1), (x, y - 10), cv2.FONTHERSHEY_SIMPLEX, 0.55, (220, 90, 230), 2)
for (i, (x, y, w, h)) in enumerate(catfaces): cv2.rectangle(img2, (x, y), (x+w, y+h), (0,255, 0), 3) cv2.putText(img2, "Cat Faces - #{}".format(i + 1), (x, y - 10), cv2.FONTHERSHEY_SIMPLEX, 0.55, (0, 0, 255), 2) ``` 最后,我們將使用檢測的面部保存影像,
```python cv2.imwrite("faces_detected1.png", img1)
cv2.imwrite("faces_detected2.png", img2) ```
總的來說我們的工程目錄結構如下,

2.2 執行結果
執行程式后,目錄中多了許多檔案,如下圖所示,

看看最終結果,


從結果來看,這一組實驗識別結果是準確的,
三、總結
本篇文章算是入門級別的計算機影像識別例子,對于整個OpenCV來說,算是小試牛刀吧!程序并不復雜,有興趣的同學可以上手實踐一把,
在整個實踐程序中,OpenCV的模型檔案對于識別的程序相當重要,有些貓咪是不能成功識別的,比如加菲貓,銀漸層,可以去找找合適的模型檔案,
還有由于篇幅的限制,本文的沒有講到對照實驗,比如交換圖片,用貓的模型檔案去識別人,用人的模型檔案去識別貓,讀者自己去試試吧,程序不難得,
對于更加準確的識別,還是要用資料集訓練機器,以便它可以為您提供更好的預測,期待大家評論交流,
少年,沒看夠?點擊石頭的主頁,隨便點點看看,說不定有驚喜呢?歡迎支持點贊/關注/評論,有你們的支持是我更文最大的動力,多謝啦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/354496.html
標籤:AI
