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
ObjdetectHaarカスケード検出、HOG検出などの物体検出機能。CascadeClassifier, HOGDescriptor
DNN深層学習モデルの読み込みと推論を提供し、TensorFlow、PyTorch、Caffe などのフレームワークをサポートします。readNet, blobFromImage, Net::forward
MLKNN、SVM、決定木などの機械学習アルゴリズム。KNearest, SVM, DTrees, TrainData
Flann特徴マッチングや高次元データ検索に使用される高速近似最近傍探索(FLANN)。Index, KDTreeIndexParams, SearchParams
Photo画像修復、ノイズ除去、HDRイメージングなど。inpaint, fastNlMeansDenoising, createTonemap
Stitchingパノラマ画像を作成するための画像ステッチング機能。Stitcher, Stitcher::create
Shape形状解析とマッチング。ShapeDistanceExtractor, ShapeContextDistanceExtractor
TrackingMIL、KCF、GOTURN などのオブジェクトトラッキングアルゴリズム。TrackerMIL, TrackerKCF, TrackerGOTURN
Videoio複数のビデオ形式とカメラをサポートするビデオ入出力機能。VideoCapture, VideoWriter, CAP_PROP_FRAME_WIDTH, CAP_PROP_FRAME_HEIGHT
Imgcodecs複数の画像形式をサポートする画像ファイルの読み取りと保存。imread, imwrite, imdecode, imencode
Xfeatures2dSIFT、SURF、FREAK などの追加の特徴検出・記述アルゴリズム。SIFT, SURF, FREAK, DAISY
Superres超解像画像処理。SuperResolution, DenseOpticalFlowExt
Optflowオプティカルフロー計算と動作解析。calcOpticalFlowFarneback, calcOpticalFlowPyrLK
CudaGPUを利用したコンピュータビジョンアルゴリズムの高速化。cuda::GpuMat, cuda::Stream, cuda::resize
Contrib顔認識、テキスト検出などのコミュニティ貢献による追加機能。FaceRecognizer, TextDetector

1. Core モジュール

coreこのモジュールは OpenCV のコアモジュールであり、基本的なデータ構造と関数を提供します。

主な機能

  • 基本データ構造:

    • Mat:画像データと行列データを格納するために使用されます。

    • Point、Size、Rect:点、サイズ、矩形領域を表すために使用されます。

    • Scalar:色やピクセル値を表すために使用されます。

  • 行列操作:

    • 行列の作成、コピー、変換、算術演算など。

  • ファイルI/O:

    • 画像、ビデオ、XML/YAMLファイルなどの読み取りと保存。

  • メモリ管理:

    • 参照カウントをサポートする自動メモリ管理。

例

#include <opencv2/core.hpp>
#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/imgproc.hpp>
#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このモジュールは、画像とビデオの表示、ウィンドウ管理、ユーザーインタラクション機能を提供します。

主な機能

  • 画像表示:

    • ウィンドウの作成、画像の表示、ユーザー入力の待機。

  • ビデオキャプチャ:

    • カメラまたはビデオファイルからフレームを読み取ります。

  • ユーザーインタラクション:

    • マウスイベント、スライダー、ボタンなど。

例

#include <opencv2/highgui.hpp>

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/videoio.hpp>
#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/calib3d.hpp>
#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/dnn.hpp>
#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;
}
その他の拡張