このところ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(); } }
例によってレナさんに実験台になってもらった結果がこちら。
- 作者: 豊沢聡,永田雅人
- 出版社/メーカー: カットシステム
- 発売日: 2012/07
- メディア: 単行本
- 購入: 1人 クリック: 6回
- この商品を含むブログ (3件) を見る