読者です 読者をやめる 読者になる 読者になる

OpenCvSharpをつかう その10 (Star Detector)

このところOpenCvSharpの使い方というよりはただのOpenCV 2.0の新機能紹介になっているこのシリーズですが、今回はStar Detector(日本語だとStar検出器?)のサンプルを作ってみたのでご紹介します。Star Detectorの関数はOpenCV 2.0で追加されました。

Star Detectorとは

単純に検索するとこんなページがヒットしたりしますが、おそらくこれではありません。

有益そうなページとしては以下のものしか見つかりませんでした。
http://pr.willowgarage.com/wiki/Star_Detector
ここの記述によると、

We are developing a new scale-invariant detector based on rotated squares, which will be fast to compute and should have good stability properties.

http://pr.willowgarage.com/wiki/Star_Detector

とあり、OpenCVにて新たに開発した手法だというように読めます。資料を見ると、円形の2段階のフィルタを用いて処理を行うようです。ただし、資料から引用した以下の図のように、実際の処理は円ではなく、正方形とそれを45度回転させた正方形で近似して行うようです(円は処理効率に響くのでしょうか)。この図形が星型に見えるということでStar Detectorと呼ぶのではないかと勝手に推測しています。


OpenCVでのStar Detector

cvGetStarKeypoints関数を使います。

CVAPI(CvSeq*) cvGetStarKeypoints( const CvArr* img, CvMemStorage* storage,
        CvStarDetectorParams params CV_DEFAULT(cvStarDetectorParams()));

出力のCvSeqの要素はCvStarKeyPoint構造体であらわされる特徴点です。

コード

幸いにもドキュメントにサンプルコードがありましたので、それを翻訳しています。

using (IplImage img = new IplImage("lenna.png", LoadMode.GrayScale))
using (IplImage cimg = new IplImage(img.Size, BitDepth.U8, 3))
using (CvMemStorage storage = new CvMemStorage(0))
{
    Cv.CvtColor(img, cimg, ColorConversion.GrayToBgr);

    CvStarDetectorParams param = new CvStarDetectorParams(45);
    CvSeq<CvStarKeypoint> keypoints = Cv.GetStarKeypoints(img, storage, param);

    if (keypoints != null)
    {
        for (int i = 0; i < keypoints.Total; i++)
        {
            CvStarKeypoint kpt = keypoints[i].Value;
            int r = kpt.Size / 2;
            Cv.Circle(cimg, kpt.Pt, r, new CvColor(0, 255, 0));
            Cv.Line(cimg, new CvPoint(kpt.Pt.X + r, kpt.Pt.Y + r), new CvPoint(kpt.Pt.X - r, kpt.Pt.Y - r), new CvColor(0, 255, 0));
            Cv.Line(cimg, new CvPoint(kpt.Pt.X - r, kpt.Pt.Y + r), new CvPoint(kpt.Pt.X + r, kpt.Pt.Y - r), new CvColor(0, 255, 0));
        }
    }

    using (new CvWindow("img", img))
    using (new CvWindow("features", cimg))
    {
        Cv.WaitKey();
    }
}

例によってレナさんに実験台になってもらった結果がこちら。


ディジタル映像分析―OpenCVによる映像内容の解析

ディジタル映像分析―OpenCVによる映像内容の解析