コンテンツにスキップ

Python/OpenCV

出典: フリー教科書『ウィキブックス(Wikibooks)』

OpenCVモジュール

[編集]

OpenCV(Open Source Computer Vision)は、コンピュータビジョンタスクをサポートするオープンソースのライブラリです。

画像処理

[編集]

画像の読み込みと表示

[編集]
import cv2

# 画像の読み込み
image = cv2.imread('image.jpg')

# 画像の表示
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像の変換とフィルタリング

[編集]
import cv2

# 画像の読み込み
image = cv2.imread('image.jpg')

# 画像のリサイズ
resized_image = cv2.resize(image, (800, 600))

# 明度とコントラストの調整
adjusted_image = cv2.convertScaleAbs(resized_image, alpha=1.2, beta=10)

# ぼかし処理
blurred_image = cv2.GaussianBlur(adjusted_image, (5, 5), 0)

# 画像の表示
cv2.imshow('Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

画像の二値化と閾値処理

[編集]
import cv2

# 画像の読み込み
image = cv2.imread('image.jpg')

# グレースケールへの変換
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 二値化処理
ret, binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 画像の表示
cv2.imshow('Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

動画処理

[編集]

動画の読み込みと表示

[編集]
import cv2

# 動画の読み込み
video = cv2.VideoCapture('video.mp4')

# 動画のフレームごとの処理
while video.isOpened():
    ret, frame = video.read()

    if not ret:
        break

    # フレームの表示
    cv2.imshow('Frame', frame)

    # 'q'キーで終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video.release()
cv2.destroyAllWindows()

動画のキャプチャ

[編集]
import cv2

# カメラデバイスのキャプチャ
camera = cv2.VideoCapture(0)

# キャプチャしたフレームの処理
while camera.isOpened():
    ret, frame = camera.read()

    if not ret:
        break

    # フレームの表示
    cv2.imshow('Frame', frame)

    # 'q'キーで終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

camera.release()
cv2.destroyAllWindows()

動画の編集と変換

[編集]
import cv2

# 動画の読み込み
video = cv2.VideoCapture('video.mp4')

# 動画のフレームごとの処理
while video.isOpened():
    ret, frame = video.read()

    if not ret:
        break

    # フレームの処理(例: フレームのリサイズ)
    resized_frame = cv2.resize(frame, (640, 480))

    # 処理後のフレームの表示
    cv2.imshow('Frame', resized_frame)

    # 'q'キーで終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video.release()
cv2.destroyAllWindows()

物体検出とトラッキング

[編集]

物体検出

[編集]
import cv2

# 物体検出用の事前学習済みモデルの読み込み
net = cv2.dnn.readNetFromCaffe('deploy.prototxt', 'model.caffemodel')

# 画像の読み込み
image = cv2.imread('image.jpg')

# 画像の前処理
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 1.0, (300, 300), (104.0, 177.0, 123.0))

# モデルによる物体検出
net.setInput(blob)
detections = net.forward()

# 検出結果の表示
for i in range(detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    if confidence > 0.5:
        box = detections[0, 0, i, 3:7] * np.array([image.shape[1], image.shape[0], image.shape[1], image.shape[0]])
        (startX, startY, endX, endY) = box.astype("int")
        cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 2)

# 画像の表示
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

物体トラッキング

[編集]
import cv2

# トラッカーの作成
tracker = cv2.TrackerKCF_create()

# ==== 特徴抽出と記述 ====

==== 特徴点の検出 ====
<source lang="python">
import cv2

# 画像の読み込み
image = cv2.imread('image.jpg')

# 特徴点の検出器の作成
detector = cv2.SIFT_create()

# 特徴点の検出
keypoints = detector.detect(image, None)

# 特徴点の描画
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)

# 画像の表示
cv2.imshow('Image', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

特徴記述

[編集]
import cv2

# 画像の読み込み
image = cv2.imread('image.jpg')

# 特徴点の検出器と特徴記述器の作成
detector = cv2.SIFT_create()
descriptor = cv2.SIFT_create()

# 特徴点の検出と特徴記述
keypoints = detector.detect(image, None)
keypoints, descriptors = descriptor.compute(image, keypoints)

# 特徴点の描画
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)

# 画像の表示
cv2.imshow('Image', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()

カメラキャリブレーション

[編集]

カメラパラメータの推定

[編集]
import cv2
import numpy as np

# チェスボードのグリッドサイズ
grid_size = (9, 6)

# チェスボード画像の読み込み
images = [cv2.imread(f'calibration_image{i}.jpg') for i in range(1, 10)]

# チェスボードのコーナー検出
object_points = []
image_points = []
for image in images:
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    ret, corners = cv2.findChessboardCorners(gray, grid_size, None)

    if ret:
        object_points.append(np.zeros((grid_size[0] * grid_size[1], 3), np.float32))
        object_points[-1][:, :2] = np.mgrid[0:grid_size[0], 0:grid_size[1]].T.reshape(-1, 2)
        image_points.append(corners)

# カメラパラメータの推定
ret, camera_matrix, dist_coeffs, rvecs, tvecs = cv2.calibrateCamera(object_points, image_points, gray.shape[::-1], None, None)

# カメラパラメータの表示
print("Camera Matrix:")
print(camera_matrix)
print("Distortion Coefficients:")
print(dist_coeffs)

画像解析とコンピュータビジョンタスク

[編集]

モーション検出

[編集]
import cv2
import numpy as np

# 前のフレーム
previous_frame = None

# 動画の読み込み
video = cv2.VideoCapture('video.mp4')

# 動画のフレームごとの処理
while video.isOpened():
    ret, frame = video.read()

    if not ret:
        break

    # グレースケールへの変換
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    # フレーム差分の計算
    if previous_frame is None:
        previous_frame = gray
        continue

    frame_diff = cv2.absdiff(previous_frame, gray)
    threshold = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)[1]

    # モーション領域の検出
    contours, _ = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        if cv2.contourArea(contour) > 1000:
            (x, y, w, h) = cv2.boundingRect(contour)
            cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

    # フレームの表示
    cv2.imshow('Frame', frame)

    # 'q'キーで終了
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

    # 現在のフレームを前のフレームとして保存
    previous_frame = gray

video.release()
cv2.destroyAllWindows()

レタッチと修復

[編集]
import cv2

# 画像の読み込み
image = cv2.imread('image.jpg')

# レタッチ用のクローンを作成
clone = image.copy()

# 画像の修復領域の指定
rect = (100, 100, 200, 200)

# 修復領域のマスク作成
mask = np.zeros(image.shape[:2], np.uint8)
mask[rect[1]:rect[1] + rect[3], rect[0]:rect[0] + rect[2]] = 255

# 修復領域の修復
inpainted = cv2.inpaint(clone, mask, 3, cv2.INPAINT_TELEA)

# 画像の表示
cv2.imshow('Image', inpainted)
cv2.waitKey(0)
cv2.destroyAllWindows()

検出機

[編集]

OpenCVの検出機とメソッド例:

1. Haar Cascade 物体検出器:

  - `cv2.CascadeClassifier.detectMultiScale(image, scaleFactor, minNeighbors, flags, minSize, maxSize)`

2. HOG 特徴検出器:

  - `cv2.HOGDescriptor()`
  - `compute()`: HOG特徴を計算
  - `detectMultiScale()`: 物体検出

3. ディープラーニングをベースにした物体検出器:

  - `cv2.dnn.readNet(model, config)`
  - `net.forward(layerNames)`: フォワードパスの実行
  - `cv2.dnn.blobFromImage(image, scalefactor, size, mean, swapRB, crop)`

4. SIFT 特徴検出器:

  - `cv2.SIFT_create()`
  - `detectAndCompute(image, mask)`

5. ORB 特徴検出器:

  - `cv2.ORB_create()`
  - `detectAndCompute(image, mask)`

6. セマンティックセグメンテーションのモデル:

  - `cv2.dnn.readNet(model, config)`
  - `net.forward(layerNames)`

7. 姿勢推定のモデル:

  - `cv2.dnn.readNet(model, config)`
  - `net.forward(outputLayerNames)`

注意

[編集]

これらはOpenCVモジュールの一部の機能です。詳細な情報や他の機能については、公式のOpenCVドキュメントを参照してください。