見出し画像

Python(基礎編:顔認証・画像処理)

おはようございます。今日は画像処理のライブラリ「OpenCV」を勉強していきます。

・Pillow(PIL): 画像処理ライブラリ
・NumPy: 科学計算ライブラリ
・OpenCV: コンピュータビジョンライブラリ

OpenCV(Open Souece Computer Vision Library)

画像1

画像や動画を処理するための機能がまとめて実装されているオープンソースライブラリー。

ではさっそくやっていきましょう。

新規プロジェクト追加

画像2

画像3

lesson5のフォルダを作りました。

画像4

OpenCV(cv2)

画像5

OpenCVはAnacondaに含まれていないので、インストールが必要となる。Anaconda Promptでインストールする。

・スタートボタンからAnaconda Promptを選ぶ。

画像6

・pipを使って、「opencv-python」をインストールする。

pip install opencv-python

画像7

入力して実行。

画像8

「Successfully installed」で成功が確認できる。
「numpy」という数学的モジュールも追加されています。

「PyCharm」に戻り、「ファイル」「設定」のプロジェクトインタープリターから追加する。

画像9

画像10

「opencv」で検索して、出てきたら選択して「パッケージのインストール」

画像11

「opencv」が追加されたことを確認して「OK」

画像12

main.pyに書き込んでいきます。
モジュールはimportしないと使えないので、importします。

import cv2

画像13

ちょっと見えにくいので、色を変えます。

外観の変更方法

画像14

画像15

「設定」「外観」「ルック&フィール」▼から変更します。

画像16

画像17

変更できました。これで見やすくなりましたね。
フォントなどの変更もできるので、自分好みのものに変えておきましょう。

画像18

バージョン確認

画像19

import cv2
print('opencv:{}'.format(cv2.__version__))

画像20

ちゃんと出ました。importにも成功しています。

画像21

画像はデスクトップに「gazou」フォルダーをつくって中に入れました。

画像ファイルを読み込み(imread)

画像22

cv2.imread(filepath , flags )
第一引数:filepath
第二引数:どういう形で読み込むか。省略するとIMREAD_COLORになる。
import cv2

# 画像ファイルを読み込む
image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')

・グレースケールで読み込む

画像23

image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png', cv2.IMREAD_GRAYSCALE)

画像ファイルの表示(imshow)

画像24

import cv2

# 画像ファイルを読み込む
image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')

# 画像ファイルの表示
cv2.imshow('o-i',image)

# キーイベントの待機処理
cv2.waitKey(0)

画像25

でました。画像が表示されました。

画像26

ここは表示されたときに出る名前っぽいです。👆

cv2.waitKey(0)👈コレがないと、画像が走ってすぐ消えました。

グレースケールで読み込み、表示

画像27

import cv2

# 画像ファイルを読み込む
image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png', cv2.IMREAD_GRAYSCALE)

# 画像ファイルの表示
cv2.imshow('o-i',image)

# キーイベントの待機処理
cv2.waitKey(0)

画像28

カラーで読み込み、グレースケールに変換して表示

画像29

import cv2

# 画像ファイルを読み込む
image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
cv2.imshow('o-i',image)

# 画像を変換
image2 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow('wa-i', image2)

# キーイベントの待機処理
cv2.waitKey(0)

画像30

画像31

o-iがカラーで、wa-iがグレイスケールになりました。

何かキーを押したら閉じる

画像32

cv2.destroyWindow('o-i')
cv2.destroyWindow('wa-i')

👇これで全部いっぺんに閉じることもできる。

cv2.destroyWindow()

エラー回避

画像33

import cv2

try:
    image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
    cv2.imshow('o-i',image)
    image2 = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    cv2.imshow('wa-i', image2)
    cv2.waitKey(0)
    cv2.destroyWindow('o-i')
    cv2.destroyWindow('wa-i')
except cv2.error as e:
    print(e)
    print('ファイルがみつかりません')

画像34

何かを押すと、両方とも消える。

ない画像を指定すると、エラーを出さずに👇が表示されるようになる。

画像35

RBGを分離させる

画像36

blue, green, red = cv2.split(image)
import cv2
try:
   image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
   blue, green, red = cv2.split(image)
   cv2.imshow('o-i/blue',blue)
   cv2.imshow('o-i/green', green)
   cv2.imshow('o-i/red', red)
   cv2.waitKey(0)
except cv2.error as e:
   print(e)
   print('ファイルがみつかりません')

画像37

ぼかしの種類

画像38

blur
cv2.blur( 入力画像 , ksize )
ksize(平滑化カーネル):平均値を求める領域サイズ
gaus
cv2.GaussianBlur(入力画像, ksize=(5, 5), sigmaX=1.5)

ksize(平滑化カーネル):平均値を求める領域サイズ
sigmaX:ガウシアンカーネルのX方向の標準偏差
bilateral
cv2.bilateralFilter(入力画像, d , sigmeColor , sigmeSpace)

d:各ピクセル近傍値領域の直径
sigmeColor :色空間のフィルターシグマ
sigmeSpace:座標空缶におけるフィルターシグマ
import cv2
import numpy as np

try:
   image = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
   
   blur = cv2.blur(image,(10, 1))
   cv2.imshow('o-i/blur', blur)
   
   gaus = cv2.GaussianBlur(image, ksize=(5, 5), sigmaX=1.5)
   cv2.imshow('o-i/gaus', gaus)
   
   bila = cv2.bilateralFilter(image, 9,75,75)
   cv2.imshow('o-i/bila', bila)
   
   cv2.waitKey(0)
   cv2.destroyWindow()
except cv2.error as e:
   print(e)
   print('ファイルがみつかりません')

画像39

画像40

画像41

画像42

顔認証

画像43

anacondaの中に顔認証セットがあるので、どこにあるのか検索する。

画像44

pathをクリックします

画像45

画像46

これを使います。コピーして、

画像47

貼り付ける

画像48

OKを押す

画像49

はいったみたい。これで使えるようになりました。

画像50

色々書いていますが、全くわからないので飛ばします。
main.pyに戻ります。

import cv2

try:
   cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
   face = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
   image3 = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
   faces = cascade.detectMultiScale(image3, scaleFactor=1.1)
   print(faces)
except cv2.error as e:
   print(e)
   print('ファイルがみつかりません')

➤実行すると、顔の座標がでます。

画像51

では表示してみましょう。

import cv2

try:
   cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
   face = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
   image3 = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
   faces = cascade.detectMultiScale(image3, scaleFactor=3.0)
   
   for(x, y, w, h) in faces:
       cv2.rectangle(face,(x, y), (x + w, y + h), (200,100,255))
       
   cv2.imshow('kao', face)
   cv2.waitKey(0)
   cv2.destroyWindow()
except cv2.error as e:
   print(e)
   print('ファイルがみつかりません')

画像52

じゃーん。顔認証されました。

faces = cascade.detectMultiScale(image3, scaleFactor=3.0)
scaleFactor=3.0の数値が上がると精度があがります。ここを1.1にしてみると

画像53

若干制度が下がって、顔っぽいところも認識されています。

for(x, y, w, h) in faces:
cv2.rectangle(face,(x, y), (x + w, y + h), (200,100,255))👈これは色です。
import cv2
try:
   cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
   face = cv2.imread(r'C:\Users\admin\Desktop\gazou\picture2.png')
   image3 = cv2.cvtColor(face, cv2.COLOR_BGR2GRAY)
   faces = cascade.detectMultiScale(image3, scaleFactor=3.0)
   
   for(x, y, w, h) in faces:
       cv2.rectangle(face,(x, y), (x + w, y + h), (255,255,255))
       
   cv2.imshow('kao', face)
   cv2.waitKey(0)
   cv2.destroyWindow()
except cv2.error as e:
   print(e)
   print('ファイルがみつかりません')

(255,255,255)白にして➤実行すると、

画像54

白でマークされました!

他の写真でも試してみます。

faces = cascade.detectMultiScale(image3, scaleFactor=3.0)

画像55

マークされないときもあります。

faces = cascade.detectMultiScale(image3, scaleFactor=2.1)

画像56

    faces = cascade.detectMultiScale(image3, scaleFactor=1.8)

画像57

よし全部認証された。微調整は必要な模様。今回選んだのは正面だから、そういうの色々あるみたいです。

画像58

写真によって違う模様。

画像59

今日はここまでー!

画像60





この記事が参加している募集

スキしてみて

おうち時間を工夫で楽しく

なにとぞ なにとぞー