C++ OpenCV 基本モジュールの紹介
OpenCV は強力なコンピュータビジョンライブラリであり、複数のモジュールを含み、各モジュールは異なるタスクに特化しています。
以下は OpenCV の主要なモジュールです:
| モジュール名 | 主な機能 | よく使われるクラス/関数 |
|---|---|---|
| Core | 画像保存、行列操作、ファイルI/Oなどの基本的なデータ構造と関数を提供します。 | Mat, Point, Size, Rect, Scalar, FileStorage, cv::format |
| Imgproc | フィルタリング、幾何変換、色空間変換、エッジ検出、モルフォロジー演算、閾値処理などの画像処理機能。 | cvtColor, GaussianBlur, Canny, threshold, resize, warpAffine |
| Highgui | 画像と動画の表示、ウィンドウ管理、ユーザーインタラクション(マウスイベント、スライダーなど)。 | imshow, namedWindow, waitKey, createTrackbar, setMouseCallback |
| Video | ビデオキャプチャ、背景差分、オプティカルフロー計算などの動画処理機能。 | VideoCapture, VideoWriter, BackgroundSubtractor, calcOpticalFlowPyrLK |
| Calib3d | カメラキャリブレーション、3D再構築、姿勢推定など。 | findChessboardCorners, calibrateCamera, solvePnP, recoverPose |
| Features2d | キーポイント検出、特徴マッチングなどの特徴検出と記述。 | ORB, SIFT, SURF, BFMatcher, FlannBasedMatcher |
| Objdetect | Haarカスケード検出、HOG検出などの物体検出機能。 | CascadeClassifier, HOGDescriptor |
| DNN | 深層学習モデルの読み込みと推論を提供し、TensorFlow、PyTorch、Caffe などのフレームワークをサポートします。 | readNet, blobFromImage, Net::forward |
| ML | KNN、SVM、決定木などの機械学習アルゴリズム。 | KNearest, SVM, DTrees, TrainData |
| Flann | 特徴マッチングや高次元データ検索に使用される高速近似最近傍探索(FLANN)。 | Index, KDTreeIndexParams, SearchParams |
| Photo | 画像修復、ノイズ除去、HDRイメージングなど。 | inpaint, fastNlMeansDenoising, createTonemap |
| Stitching | パノラマ画像を作成するための画像ステッチング機能。 | Stitcher, Stitcher::create |
| Shape | 形状解析とマッチング。 | ShapeDistanceExtractor, ShapeContextDistanceExtractor |
| Tracking | MIL、KCF、GOTURN などのオブジェクトトラッキングアルゴリズム。 | TrackerMIL, TrackerKCF, TrackerGOTURN |
| Videoio | 複数のビデオ形式とカメラをサポートするビデオ入出力機能。 | VideoCapture, VideoWriter, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT |
| Imgcodecs | 複数の画像形式をサポートする画像ファイルの読み取りと保存。 | imread, imwrite, imdecode, imencode |
| Xfeatures2d | SIFT、SURF、FREAK などの追加の特徴検出・記述アルゴリズム。 | SIFT, SURF, FREAK, DAISY |
| Superres | 超解像画像処理。 | SuperResolution, DenseOpticalFlowExt |
| Optflow | オプティカルフロー計算と動作解析。 | calcOpticalFlowFarneback, calcOpticalFlowPyrLK |
| Cuda | GPUを利用したコンピュータビジョンアルゴリズムの高速化。 | cuda::GpuMat, cuda::Stream, cuda::resize |
| Contrib | 顔認識、テキスト検出などのコミュニティ貢献による追加機能。 | FaceRecognizer, TextDetector |
1. Core モジュール
coreこのモジュールは OpenCV のコアモジュールであり、基本的なデータ構造と関数を提供します。
主な機能
-
基本データ構造:
-
Mat:画像データと行列データを格納するために使用されます。 -
Point、Size、Rect:点、サイズ、矩形領域を表すために使用されます。 -
Scalar:色やピクセル値を表すために使用されます。
-
-
行列操作:
-
行列の作成、コピー、変換、算術演算など。
-
-
ファイルI/O:
-
画像、ビデオ、XML/YAMLファイルなどの読み取りと保存。
-
-
メモリ管理:
-
参照カウントをサポートする自動メモリ管理。
-
例
#include <iostream>
using namespace cv;
using namespace std;
int main() {
// 3x3 の行列を作成
Mat mat = (Mat_<int>(3, 3) << 1, 2, 3, 4, 5, 6, 7, 8, 9);
// 行列を出力
cout << "Matrix:\n" << mat << endl;
// 行列の要素にアクセス
int value = mat.at<int>(1, 1);
cout << "Value at (1, 1): " << value << endl;
return 0;
}
2. Imgproc モジュール
imgprocこのモジュールは、フィルタリング、幾何変換、色空間変換などの画像処理機能を提供します。
主な機能
-
画像フィルタリング:
-
平均フィルタ、ガウシアンフィルタ、メディアンフィルタなど。
-
-
幾何変換:
-
スケーリング、回転、アフィン変換、透視変換など。
-
-
色空間変換:
-
RGBからグレースケール、HSV、Labなどの色空間への変換。
-
-
エッジ検出:
-
Canny、Sobel、Laplacian などのエッジ検出アルゴリズム。
-
-
モルフォロジー演算:
-
収縮、膨張、オープニング演算、クロージング演算など。
-
-
閾値処理:
-
単純閾値処理、適応的閾値処理など。
-
例
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {
// 画像を読み込む
Mat image = imread("test.jpg");
if (image.empty()) return -1;
// グレースケール画像に変換
Mat grayImage;
cvtColor(image, grayImage, COLOR_BGR2GRAY);
// ガウシアンフィルタ
Mat blurredImage;
GaussianBlur(grayImage, blurredImage, Size(5, 5), 0);
// 結果を表示
imshow("Original Image", image);
imshow("Blurred Image", blurredImage);
waitKey(0);
return 0;
}
3. Highgui モジュール
highguiこのモジュールは、画像とビデオの表示、ウィンドウ管理、ユーザーインタラクション機能を提供します。
主な機能
-
画像表示:
-
ウィンドウの作成、画像の表示、ユーザー入力の待機。
-
-
ビデオキャプチャ:
-
カメラまたはビデオファイルからフレームを読み取ります。
-
-
ユーザーインタラクション:
-
マウスイベント、スライダー、ボタンなど。
-
例
using namespace cv;
int main() {
// 画像を読み込む
Mat image = imread("test.jpg");
if (image.empty()) return -1;
// ウィンドウを作成して画像を表示
namedWindow("Display Window", WINDOW_AUTOSIZE);
imshow("Display Window", image);
// ユーザーのキー入力を待つ
waitKey(0);
// ウィンドウを閉じる
destroyAllWindows();
return 0;
}
4. Video モジュール
videoこのモジュールは、ビデオキャプチャ、背景差分、オプティカルフロー計算などの動画処理機能を提供します。
主な機能
-
ビデオキャプチャ:
-
カメラまたはビデオファイルからフレームを読み取ります。
-
-
背景差分:
-
ビデオ内の前景オブジェクトを抽出します。
-
-
オプティカルフロー計算:
-
画像内の物体の動きを計算します。
-
例
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {
// カメラを開く
VideoCapture cap(0);
if (!cap.isOpened()) return -1;
Mat frame;
while (true) {
// フレームを1枚読み取る
cap >> frame;
if (frame.empty()) break;
// フレームを表示
imshow("Camera Feed", frame);
// ESCキーで終了
if (waitKey(30) == 27) break;
}
// カメラを解放してウィンドウを閉じる
cap.release();
destroyAllWindows();
return 0;
}
5. Calib3d モジュール
calib3dこのモジュールは、カメラキャリブレーション、3D再構築、姿勢推定などの機能を提供します。
主な機能
-
カメラキャリブレーション:
-
カメラの内部パラメータと歪み係数を計算します。
-
-
3D再構築:
-
複数視点の画像から3Dシーンを再構築します。
-
-
姿勢推定:
-
物体の3D姿勢を推定します。
-
例
#include <opencv2/highgui.hpp>
using namespace cv;
int main() {
// 画像を読み込む
Mat image1 = imread("left.jpg");
Mat image2 = imread("right.jpg");
if (image1.empty() || image2.empty()) return -1;
// 特徴点の検出とマッチング
Ptr<Feature2D> detector = ORB::create();
vector<KeyPoint> keypoints1, keypoints2;
Mat descriptors1, descriptors2;
detector->detectAndCompute(image1, noArray(), keypoints1, descriptors1);
detector->detectAndCompute(image2, noArray(), keypoints2, descriptors2);
BFMatcher matcher(NORM_HAMMING);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
// 基礎行列を計算
vector<Point2f> points1, points2;
for (const auto& match : matches) {
points1.push_back(keypoints1[match.queryIdx].pt);
points2.push_back(keypoints2[match.trainIdx].pt);
}
Mat fundamentalMatrix = findFundamentalMat(points1, points2, FM_RANSAC);
// 基礎行列を出力
cout << "Fundamental Matrix:\n" << fundamentalMatrix << endl;
return 0;
}
6. DNN モジュール
dnnこのモジュールは、深層学習モデルの読み込みと推論機能を提供します。
主な機能
-
モデルの読み込み:
-
TensorFlow、PyTorch、Caffe などのフレームワークのモデルをサポートします。
-
-
推論:
-
画像の分類、物体検出、セマンティックセグメンテーションなどを行います。
-
例
#include <opencv2/highgui.hpp>
using namespace cv;
using namespace dnn;
int main() {
// モデルを読み込む
Net net = readNetFromTensorflow("model.pb", "config.pbtxt");
// 画像を読み込む
Mat image = imread("test.jpg");
if (image.empty()) return -1;
// 前処理
Mat blob = blobFromImage(image, 1.0, Size(300, 300), Scalar(127.5, 127.5, 127.5), true, false);
net.setInput(blob);
// 推論
Mat output = net.forward();
// 出力を処理
// ...
return 0;
}