-->

2019年8月31日土曜日

OpenCVのLineIteratorの使い方

今まで知らなかったのですがOpenCVのクラスにLineIteratorというものがあります。これを使用すると、2点の座標を結ぶ線分の座標を順に辿ることができます。

汎用的な機能ではありませんが、使用目的にハマるとかなり便利な機能です。

例えば、画像上のある線分上に特定の画素値が存在するかどうかを判定することを考えたとき、その線分が水平or垂直であれば容易に線分上の座標を辿れますが、それ以外の角度の線分を辿ろうとするとチト骨が折れます。具体的には、その線分がどの程度傾いているかを調べて、三角関数を使って線分上の座標を逐一計算する必要があります。しかし、このクラスを使用するとそんな面倒な計算をすることなく線分上の座標を得ることができ、簡単に画素値を参照できます。

具体的には、以下のように使用します。

cv::Mat image = cv::imread("test.png");
cv::Point start(10,10);
cv::Point end(50,50);

// pixel check
cv::LineIterator it(image, start, end, 8);  // startからendを結ぶ線分を辿るイテレーターの作成
for(int i = 0; i < it.count; i++, ++it) {
  cv::Point p = it.pos();  // it.pos()で座標取得
  if(IsBlack(p.x, p.y, image) {  // IsBlackは座標位置の色を判定する自作関数
    // 適当な処理
    bresk;
  }
}

線分上の座標をC++のイテレータで取得できます。レーザーなどの直線運動しているものの軌道上に障害物があるか判定するときなどに使用できます。ニッチですなぁ…。