情報系院生のノート

情報技術系全般,自分用メモを公開してます。

OpenCVで点線を描画する

はじめに

OpenCVには点線を描画する関数がありません。 すごしググると以下のようにcv::LineIteratorを使う方法がヒットしますが、これでは太さの指定ができません。

https://answers.opencv.org/question/180090/how-to-draw-a-dotted-line-c/

そこで、単純に点線を引く自作関数を作りました。 また、cv::lineと引数を統一したので、関数名を変更するだけで使用できます。

点線を描画する関数

  • dot_span_pxはドット幅をピクセル値で指定します。好きな値を指定して下さい。
void dottedLine(cv::Mat& origin, const cv::Point p1, const cv::Point p2,
                 const cv::Scalar line_color, const int thickness,
                 const int lineType) {
  // 点線の幅
  const double dot_span_px = 20;

  const double theta = std::atan2((p2 - p1).y, (p2 - p1).x);
  const int iter_x = std::abs((p2 - p1).x) / dot_span_px;
  const int iter_y = std::abs((p2 - p1).y) / dot_span_px;
  const cv::Point span(dot_span_px * std::cos(theta),
                       dot_span_px * std::sin(theta));

  for (int i = 0; i < std::max(iter_x, iter_y); i += 2) {
    cv::line(origin, p1 + span * i, p1 + span * (i + 1), line_color, thickness,
             lineType);
  }