OpenCV-Python從載入圖片到人臉識別

本文為 AI 研習社編譯的技術博客,原標題 :

OpenCV-Python Cheat Sheet: From Importing Images to Face Detection

作者 |?Salma Ghoneim

翻譯 |?linlh、肯恩?阿瑟? ? 編輯 | 王立魚

原文鏈接:

https://heartbeat.fritz.ai/opencv-python-cheat-sheet-from-importing-images-to-face-detection-52919da36433

注:本文的相關鏈接請訪問文末【閱讀原文】

?什么是OpenCV-Python?

OpenCV是一個計算機視覺和機器學習的開源庫。擁有2500+個優化算法——一套非常全面的既經典又最先進的計算機視覺和機器學習算法的集合,具備很多接口,包括Python,Java,C++和Matlab。

這次,讓我們來攻克Python的接口:

目錄:

  • 安裝方式

  • 導入/查看圖像

  • 裁剪:Cropping

  • 調整:Resizing

  • 旋轉:Rotating

  • 灰度和閾值:Grayscaling and Thresholding

  • 模糊/平滑:Blurring/Smoothing

  • 繪制矩形/邊界框

  • 畫線

  • 在圖片上寫入文字

  • 人臉識別

  • 輪廓(Contours)——一種物體檢測的方法

  • 保存圖像

安裝方式有兩種:Window用戶,Linux用戶;不管是使用哪種方式都請閱讀原文查看。

導入圖像 & 顯示

import cv2image = cv2.imread("./Path/To/Image.extension")cv2.imshow("Image", image)cv2.waitKey(0)cv2.destroyAllWindows()

提醒1:通過OpenCV的種方式讀取圖像,它不是RGB色域的——而是BGR色域的。有時候這不會是一個問題,只有在你想加入彩色內容到你的圖像中的時候會有麻煩。

有兩個解決辦法:

  1. 將R - 1st(紅色)與B - 3rd(藍色)切換,使紅色為(0,0,255)而不是(255,0,0)。

  2. 改變色域為RGB

    rgb_image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

然后在你的rgb_image上繼續編寫代碼,而不是在image上。

提醒2:按下任意按鍵,來關閉顯示圖像的窗口。如果你使用關閉按鈕可以能會導致卡主(在我使用Jupyter Notebook時,有發生這樣的情況)

簡單起見,整個教程中我會使用下面的方法來顯示圖像:

import cv2def viewImage(image, name_of_window):    cv2.namedWindow(name_of_window, cv2.WINDOW_NORMAL)    cv2.imshow(name_of_window, image)    cv2.waitKey(0)    cv2.destroyAllWindows()

圖片來源:?Pixabay

? ?裁剪:Cropping

圖片來源: Pixabay

裁剪后的狗狗

import cv2cropped = image[10:500, 500:2000]viewImage(cropped, "Doggo after cropping.")

在圖像:image[10:500, 500:2000]?中以(y, x)為起點,裁剪大小為(h, w)的圖像:?image[y:y+h, x:x+w]

調整大小:Resizing

圖像來源:?Pexels

調整20%之后

import cv2scale_percent = 20 # percent of original sizewidth = int(img.shape[1] * scale_percent / 100)height = int(img.shape[0] * scale_percent / 100)dim = (width, height)  
resized = cv2.resize(img, dim, interpolation = cv2.INTER_AREA)  
viewImage(resized, "After resizing with 20%")

調整大小的函數保持了和原來圖像一樣的尺寸比。

更多關于圖像縮放的函數,查看原文。

旋轉:Rotating

上方: 照片來自Pexels的Jonathan Meyer.下方:旋轉180度后的狗狗

import cv2(h, w, d) = image.shapecenter = (w // 2, h // 2)M = cv2.getRotationMatrix2D(center, 180, 1.0)rotated = cv2.warpAffine(image, M, (w, h))viewImage(rotated, "Doggo after rotation by 190 degrees")

image.shape輸出了圖像的高度,寬度和通道數。M是旋轉矩陣——根據圖像中心旋轉180度。-ve按照順指針方向旋轉圖像 & +ve 則是按照逆時針方向旋轉。

灰度和閾值(黑&白效果)

圖像來源:?Pexels

import cv2gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)ret, threshold_image = cv2.threshold(im, 127, 255, 0)viewImage(gray_image, "Gray-scale doggo")viewImage(threshold_image, "Black & White doggo")

gray_image是圖像的灰度單通道版本。閾值函數將所有陰影變為比127更暗(更小)到0并且所有更亮(更大)到255。

另外一個例子:

ret, threshold = cv2.threshold(im, 150, 200, 10)

這將使所有陰影小于150到10并且全部大于200。

更多關于閾值函數,查閱原文。

上方: 灰度圖像狗狗 下方: 黑白狗狗

模糊/平滑

上方: 圖像來自Pixabay. 下方: 模糊的狗狗

import cv2blurred = cv2.GaussianBlur(image, (51, 51), 0)viewImage(blurred, "Blurred doggo")

GussianBlur函數接收3個參數:

  • 第一個參數是你想要模糊的圖像

  • 第二個參數必須是兩個正奇數的元組。當他們增加時,模糊效果會增加。

  • 第三個參數是sigmaX和sigmaY。當保留為0時,他們將根據內核大小自動計算

更多的模糊函數,參看原文。

在圖像上繪制矩形/邊界框

上方: 圖像來自Pexels. 下方: 狗狗臉上畫了一個矩形框

import cv2output = image.copy()cv2.rectangle(output, (2600, 800), (4100, 2400), (0, 255, 255), 10)viewImage(output, "Doggo with a rectangle on his face")

矩形框函數接收5個參數:

  • 第一個參數是圖像

  • 第二個參數是x1, y1 ——對應左上角

  • 第三個參數是x2, y2 ——對應右下角

  • 第四個參數是矩形顏色(GBR/RGB,具體取決于你導入圖像的方式)

  • 第五個參數矩形線條的粗細

在圖片上繪制線段

上方: 圖像來自Pexels. 下方: 2只狗狗被一條直線分隔

import cv2output = image.copy()cv2.line(output, (60, 20), (400, 200), (0, 0, 255), 5)viewImage(output, "2 Doggos separated by a line")

line函數需要傳入5個參數:

  • 第一個參數是你需要在上面繪制線段的圖像。

  • 第二個參數是直線的x1,?y1坐標。

  • 第三個參數是直線的x2?y2坐標。

  • 第四個參數是線段的顏色(可以是GBR/也可以是RGB,這取決于你導入的圖片的格式)。

  • 第五個參數是線段的粗細。

在圖片上輸入文字

上方: 圖像來自Pexels. 下方: 含有文字的圖片

import cv2output = image.copy()cv2.putText(output, "We <3 Dogs", (1500, 3600),cv2.FONT_HERSHEY_SIMPLEX, 15, (30, 105, 210), 40) viewImage(output, "image with text")

putText 函數包含七個參數:

  • 第一個參數是您需要在上面輸入文字的圖片

  • 第二個參數是需要輸入的文字內容

  • 第三個參數是文字開始區域的左下角的x,y坐標

  • 第四個參數是字體

  • 第五個參數是字體大小

  • 第六個參數是字體顏色(可以是GBR/也可以是RGB,這取決于你導入的圖片的格式)。

  • 第七個參數是字體的粗細

人臉識別

非常抱歉,此處我們不能放狗狗的圖片了。:(

來自于?Pixabay的免費圖片

import cv2  
image_path = "./Path/To/Photo.extension"face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')  
image = cv2.imread(image_path)gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(    gray,    scaleFactor= 1.1,    minNeighbors= 5,    minSize=(10, 10))  
faces_detected = format(len(faces)) + " faces detected!"print(faces_detected)# Draw a rectangle around the facesfor (x, y, w, h) in faces:    cv2.rectangle(image, (x, y), (x+w, y+h), (255, 255, 0), 2)    viewImage(image,faces_detected)

detectMultiScale函數是一個檢測物體的通用函數。當我們把它用于人臉檢測時,它就會從圖像中檢測出人臉。

**detectMultiScale函數 包含四個參數 :

  • 第一個參數是灰度圖

  • 第二個參數是縮放比例。因為在我們的圖片中,有些人臉由于更靠近照相機,導致他們看起來比后面的人臉更大些。縮放參數就是為了解決這種問題的。

  • 檢測算法使用了滑動窗口來檢測目標物體。minNeighbors參數定義了當識別出一個人臉之前在當前物體周圍需要檢測的物體數目。

  • 同時minSize參數給出了窗口的大小

在圖片中檢測出兩張人臉

? ?輪廓—— 一種物體檢測的方法

使用基于顏色的圖片分段,我們可以實現物體的檢測。cv2.findContours?和?cv2.drawContours? 兩個函數可以幫我們實現上述目標。

近期,我寫了一篇非常詳細的文章,文章的題目是使用python來實現基于顏色的圖片分段的物體檢測。如果你想了解關于輪廓的知識,你可以去閱讀這篇文章。

最后,保存圖片

import cv2image = cv2.imread("./Import/path.extension")cv2.imwrite("./Export/Path.extension", image)

? ?最后總結

想要繼續查看該篇文章相關鏈接和參考文獻?



?------------------------------------------------

原文地址:https://mp.weixin.qq.com/s/aq8_aDv7nQ6KBcVacIPYng

轉載請標明來之:阿貓學編程
更多教程:阿貓學編程-python基礎教程

所有評論

如果對文章有異議,請加qq:1752338621