Hu モーメントを求めるサンプルプログラム
【概要】
Huモーメントは、画像の形状特徴を表す7つの不変量である。回転・スケール・平行移動に対して不変であるため、物体認識やパターンマッチングに広く利用される。OpenCV 5 を前提とする。
【目次】
【関連する外部ページ】
- OpenCV の公式ページ: https://opencv.org
- GitHub の OpenCV のページ: https://github.com/opencv/opencv/releases
【サイト内の関連情報】
- OpenCV について [PDF] , [パワーポイント]
- OpenCV のインストール,画像表示を行う C++ プログラムの実行手順: 別ページ »で説明
- OpenCVとPythonを活用した画像・ビデオ処理プログラム: 別ページ »にまとめ
- OpenCV 4 の C/C++ プログラム: 別ページ »にまとめている.
ソースコード
二値画像から輪郭を求め、その輪郭のモーメント(cv::moments)を計算した上で、Huモーメント(cv::HuMoments)を求める。以下の内容で humoment.cpp という名前のファイルを作成する。findContours と moments は 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)