OpenCV
OpenCVは、画像処理とコンピュータービジョン向けの2,500種類以上のアルゴリズムを備えたオープンソースライブラリです。その機能、ディープラーニングとの連携方法、コードを紹介します。
OpenCV(オープンソースコンピュータービジョンライブラリ)は、画像処理とコンピュータービジョン(CV)向けの最適化アルゴリズムを2,500種類以上備えたオープンソースライブラリです。画像や動画の読み書き、カメラストリームの取り込み、ピクセルのフィルタリングや変換、特徴の検出とマッチング、カメラのキャリブレーション、学習済みニューラルネットワークの実行ができます。OpenCVは1999年にIntel Researchで始まり、C++で記述され、PythonとJavaのバインディングを備えています。バージョン4.5.0以降はApache 2.0ライセンスで配布されています。Pythonではpip install opencv-pythonでインストールし、cv2としてインポートします。また、すべての画像をNumPy配列として扱います。
OpenCVでできること#
- 画像・動画の入出力: 一般的な画像フォーマットの読み書き、動画ファイルのデコード、カメラやネットワークストリームからのフレーム取得ができます。
- 画像処理: リサイズ、色空間変換、ぼかし、シャープ化、しきい値処理、モルフォロジー演算など、画像をモデルに入力する前の標準的な前処理を行います。
- 特徴の検出とマッチング: SIFTやORBなどのコーナー・キーポイント検出器で特徴的な点を見つけます。これらの点を画像間でマッチングし、パノラマ画像の合成、物体の位置推定、ビジュアルSLAMに利用できます。SIFTは特許の有効期限が切れた後、バージョン4.4.0でメインライブラリに加わりました。
- カメラ幾何: キャリブレーションでレンズの歪みを除去し、ホモグラフィーで遠近法を補正します。また、ステレオマッチングでは2台のカメラから深度を復元し、ロボティクスや3D再構築に利用します。
- 動画解析: 背景差分で静止したシーンから動く物体を分離し、オプティカルフローでフレーム間のピクセルの動きを測定します。
- ディープニューラルネットワークの推論:
dnnモジュールは、たとえばONNX形式の学習済みモデルを読み込み、ディープラーニングフレームワークをインストールせずにCPUまたはGPUで実行します。
この従来型のパイプラインは、学習済みモデルを使わずに画像内の形状の輪郭を検出します。
import urllib.request
import cv2
import numpy as np
# Download a sample image and decode it into a BGR NumPy array
data = urllib.request.urlopen("https://ultralytics.com/images/bus.jpg").read()
image = cv2.imdecode(np.frombuffer(data, np.uint8), cv2.IMREAD_COLOR)
# Classical pipeline: grayscale, blur to suppress noise, then Canny edge detection
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
edges = cv2.Canny(blurred, 50, 150)
# Trace connected edge pixels into contours, the outlines of shapes in the scene
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(f"Image shape: {image.shape}, contours found: {len(contours)}")Image shape: (1080, 810, 3), contours found: 1449が出力されます。これは3つのカラーチャンネルを持つ1080×810の画像と、そのエッジから抽出した1,449個の個別の輪郭です。OpenCVではカラーチャンネルが青・緑・赤(BGR)の順に格納されるため、RGBを想定するライブラリに画像を渡す前にcv2.cvtColorで変換する必要があります。
OpenCVとディープラーニングフレームワーク#
OpenCVとPyTorch、TensorFlowなどのディープラーニングフレームワークは、同じパイプラインの異なる段階を担います。OpenCVはデータの前処理とネットワーク出力後の処理を担当し、フレームの取得、リサイズ、結果の描画、出力動画の書き込みを行います。その間で、フレームワークが畳み込みニューラルネットワークを学習・実行します。リアルタイム動画アプリケーションでは、各フレームについて次の処理を繰り返します。
Ultralytics YOLO26は、OpenCVのBGR形式のNumPyフレームをそのまま受け付け、results[0].plot()は同じ形式の注釈付きフレームを返すため、変換なしでOpenCVのループにモデルを組み込めます。この例では、ultralyticsパッケージに同梱されたサンプル画像を使って、ループを1回実行します。
import cv2
from ultralytics import YOLO
from ultralytics.utils import ASSETS
# OpenCVは同梱されたサンプル画像をBGR形式のNumPy配列として読み込みます
frame = cv2.imread(str(ASSETS / "bus.jpg"))
# YOLO26はOpenCVのフレームをそのまま受け取ります
model = YOLO("yolo26n.pt")
results = model(frame)
# plot()は、OpenCVで表示または保存できる注釈付きBGR配列を返します
annotated = results[0].plot()
cv2.imwrite("bus_annotated.jpg", annotated)動画ループ内では、cv2.VideoCaptureからの各フレームに対して同じ3つの呼び出しを実行し、cv2.imshowまたはcv2.VideoWriterがcv2.imwriteを置き換えます。










