Hu モーメントを求めるサンプルプログラム

概要

Huモーメントは、画像の形状特徴を表す7つの不変量である。回転・スケール・平行移動に対して不変であるため、物体認識やパターンマッチングに広く利用される。OpenCV 5 を前提とする。

目次

関連する外部ページ

サイト内の関連情報

ソースコード

二値画像から輪郭を求め、その輪郭のモーメント(cv::moments)を計算した上で、Huモーメント(cv::HuMoments)を求める。以下の内容で humoment.cpp という名前のファイルを作成する。findContoursmoments は OpenCV 5 でも imgproc モジュールに含まれており、インクルードや呼び出し方法に変更はない。

#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    if (argc != 2)
        return -1;

    Mat src = imread(argv[1], IMREAD_GRAYSCALE);
    if (src.empty())
        return -1;

    Mat bin;
    threshold(src, bin, 128, 255, THRESH_BINARY);

    vector > contours;
    findContours(bin, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);

    for (size_t i = 0; i < contours.size(); i++)
    {
        Moments m = moments(contours[i]);
        double hu[7];
        HuMoments(m, hu);

        cout << "輪郭 " << i << " の Hu モーメント: ";
        for (int j = 0; j < 7; j++)
            cout << hu[j] << " ";
        cout << endl;
    }

    return 0;
}

コンパイル方法

以下のコマンドでコンパイルする。ソースファイル名は humoment.cpp とする。pkg-config でOpenCVのインクルードパスとライブラリを解決する。OpenCV 5 は C++17 を要求するため、-std=c++17 を指定する。

g++ -std=c++17 -o a.out humoment.cpp $(pkg-config --cflags --libs opencv4)