📷

OpenCV チュートリアル サンプルコード集

2024/08/11に公開

概要

基本的にコード(.py)をコピーして保存して実行するだけで動くはずです
自由にsample.pngを用意して試してみてください

環境

Windows 11
Python 3.11.9
opencv-contrib-python 4.10.0.84

OpenCVとは

OpenCV (Open Source Computer Vision Library)の略称
画像処理や動画処理に頻繁に用いられるオープンソースのライブラリ
(機械学習の要素も充実している点が流行した理由であると個人的に思う)

OpenCVのインストール

Python環境にOpenCVをインストールする
Powershellにて以下を実行する

> pip install opencv-python

拡張機能が含まれたOpenCVをインストールする場合

> pip install opencv-contrib-python

本記事で想定しているファイル構造

画像(sample.png)とプログラム(.py)は同じフォルダに保存してください

プロジェクトフォルダ/
├── sample.png
├── read_display_img.py
├── convert_to_grayscale.py
├── resize_img.py
├── rotate_img.py
├── detect_edges.py
├── detect_faces.py
└── save_img.py

画像の読み込みと表示 (read_display_img.py)

画像を読み込んで表示する

read_display_img.py
# OpenCVライブラリをインポート
import cv2

# 画像を読み込み
def read_img(image_path):
    # 指定されたパスから画像を読み込む
    image = cv2.imread(image_path)
    return image

# 画像を表示
def display_img(window_name,image):
    # 画像表示用のウィンドウを作成して表示 
    # ウインドウ名:window_name / 表示データ:image
    cv2.imshow(window_name, image)
    # キーが押されるまでウィンドウを保持
    cv2.waitKey(0)
    # ウィンドウを閉じてリソースを解放
    cv2.destroyAllWindows()

if __name__ == "__main__":
    image_path = '.\sample.png'
    image = read_img(image_path)
    display_img('image',image)

グレースケール変換 (convert_to_grayscale.py)

カラー画像をグレースケールに変換する

convert_to_grayscale.py
import cv2

# 画像を読み込み
def read_img(image_path):
    image = cv2.imread(image_path)
    return image

# 画像を表示
def display_img(window_name,image):
    cv2.imshow(window_name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像をグレースケールに変換
def convert_to_grayscale(image):
    # 画像(image)をBGRからグレースケールに変換
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return gray_image

if __name__ == "__main__":
    image_path = '.\sample.png'
    image = read_img(image_path)
    gray_image = convert_to_grayscale(image)
    display_img('gray_image',gray_image)

リサイズ (resize_img.py)

画像を指定したサイズにリサイズする

resize_img.py
import cv2

# 画像を読み込み
def read_img(image_path):
    image = cv2.imread(image_path)
    return image

# 画像を表示
def display_img(window_name,image):
    cv2.imshow(window_name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像を指定されたサイズにリサイズ
def resize_img(image, width, height):
    # 画像(image)を指定された幅(width)と高さ(height)にリサイズ
    resized_image = cv2.resize(image, (width, height))
    return resized_image

if __name__ == "__main__":
    image_path = '.\sample.png'
    image = read_img(image_path)
    # width:200px, height:200pxを指定
    resized_image = resize_img(image, 200, 200)
    display_img('resized_image',resized_image)

回転 (rotate_img.py)

画像を回転させる

rotate_img.py
import cv2

# 画像を読み込み
def read_img(image_path):
    image = cv2.imread(image_path)
    return image

# 画像を表示
def display_img(window_name,image):
    cv2.imshow(window_name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

def rotate_img(image, angle):
    # 画像の高さと幅を取得
    (h, w) = image.shape[:2]
    # 画像の中心座標を計算 (//は切り捨て割算)
    center = (w // 2, h // 2)
    # 回転行列を生成
    # (center: 回転の中心, angle: 回転角度(反時計回り), scale: スケール(1.0で元のサイズ))
    matrix = cv2.getRotationMatrix2D(center, angle, scale=1.0)
    # アフィン変換を使って画像を回転
    rotated_image = cv2.warpAffine(image, matrix, (w, h))
    return rotated_image

if __name__ == "__main__":
    image_path = '.\sample.png'
    image = read_img(image_path)
    # angle:20°を指定
    rotated_image = rotate_img(image, 20)
    display_img('rotated_image', rotated_image)

エッジ検出 (detect_edges.py)

Cannyエッジ検出を使用して画像のエッジを検出する

detect_edges.py
import cv2

# 画像を読み込み
def read_img(image_path):
    image = cv2.imread(image_path)
    return image

# 画像を表示
def display_img(window_name,image):
    cv2.imshow(window_name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像をグレースケールに変換
def convert_to_grayscale(image):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return gray_image

# エッジ検出
def detect_edges(image):
    # 画像をグレースケールに変換
    gray_image = convert_to_grayscale(image)
    # Cannyアルゴリズムを使用してエッジを検出
    # (threshold1: 最小閾値, threshold2: 最大閾値)
    edges = cv2.Canny(gray_image, threshold1=100, threshold2=200)
    return edges

if __name__ == "__main__":
    image_path = '.\sample.png'
    image = read_img(image_path)
    edges = detect_edges(image)
    display_img('edges', edges)

顔検出 (detect_faces.py)

Haarカスケードを使用して顔を検出する

detect_faces.py
import cv2

# 画像を読み込み
def read_img(image_path):
    image = cv2.imread(image_path)
    return image

# 画像を表示
def display_img(window_name,image):
    cv2.imshow(window_name, image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

# 画像をグレースケールに変換
def convert_to_grayscale(image):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    return gray_image

# エッジ検出
def detect_faces(image):
    # Haarカスケード分類器を読み込み
    # 顔検出用の事前学習済みカスケードファイルを指定
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
    # 画像をグレースケールに変換
    gray_image = convert_to_grayscale(image)
    # 顔を検出 (scaleFactor: 画像サイズを縮小する比率,
    # minNeighbors: 顔とみなす領域に含まれる最小の矩形数, minSize: 検出される顔の最小サイズ)
    faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=2, minSize=(20, 20))
    # 顔が検出された部分に枠を描画するために元画像(image)を新たな画像(faces_image)にコピー
    faces_image = image
    # 顔が検出された部分に枠を描画
    for (x, y, w, h) in faces:
        # 青い矩形を描画
        cv2.rectangle(faces_image, (x, y), (x+w, y+h), (255, 0, 0), 2)
    return faces_image

if __name__ == "__main__":
    image_path = '.\sample.png'
    image = read_img(image_path)
    faces_image = detect_faces(image)
    display_img('faces_image', faces_image)

画像の保存 (save_img.py)

処理した画像を保存する

save_img.py
# 画像の保存
cv2.imwrite('output_image.png', image)

まとめ

少しずつ増やします。

Discussion