Python/OpenCV
表示
< Python
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ドキュメントを参照してください。