📷
OpenCV チュートリアル サンプルコード集
概要
基本的にコード(.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