ページ 11

直線検出(線分検出)を行ったいらない線を削除したいです。

Posted: 2017年1月18日(水) 14:30
by あき
現在直線検出(線分検出)をHough変換で行っています。

そこでいらない線を消さないといけないのですが、なんていう関数を使えばいいのか、
どういうプログラムを組めばいいのかわからなくて困っています。
85°~95°と10°~-10°の線を消したいです。

環境はOpenCVでHough変換で線分を検出し、Visual studio2013を使っています。

C言語、プログラム初心者なのでご教授よろしくお願いします。

Re: 直線検出(線分検出)を行ったいらない線を削除したいです。

Posted: 2017年1月18日(水) 20:24
by と成りのトトロ
自分で書いたのだから消せるでしょう..(if 分とかで書くのを止めるとか...)

コード:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int
main(int argc, char *argv[])
{
  cv::Mat src_img = cv::imread("../../image/building.png", 1);
  if(src_img.empty()) return -1;

  cv::Mat dst_img, work_img;
  dst_img = src_img.clone();
  cv::cvtColor(src_img, work_img, CV_BGR2GRAY);
  cv::Canny(work_img, work_img, 50, 200, 3);
  
  // (古典的)Hough変換
  std::vector<cv::Vec2f> lines;
  // 入力画像,出力,距離分解能,角度分解能,閾値,*,*
  cv::HoughLines(work_img, lines, 1, CV_PI/180, 200, 0, 0);

  std::vector<cv::Vec2f>::iterator it = lines.begin();
  for(; it!=lines.end(); ++it) {
    float rho = (*it)[0], theta = (*it)[1];
    cv::Point pt1, pt2;
    double a = cos(theta), b = sin(theta);
    double x0 = a*rho, y0 = b*rho;
    pt1.x = cv::saturate_cast<int>(x0 + 1000*(-b));
    pt1.y = cv::saturate_cast<int>(y0 + 1000*(a));
    pt2.x = cv::saturate_cast<int>(x0 - 1000*(-b));
    pt2.y = cv::saturate_cast<int>(y0 - 1000*(a));
    cv::line(dst_img, pt1, pt2, cv::Scalar(0,0,255), 3, CV_AA);
  }

  cv::namedWindow("HoughLines", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("HoughLines", dst_img);
  cv::waitKey(0);
}

Re: 直線検出(線分検出)を行ったいらない線を削除したいです。

Posted: 2017年1月20日(金) 11:03
by usao
質問の趣旨が不明です.

(1)cv::HoughLinesを使っているの場合:
リファレンスを見るに,直線検出結果のデータは (ρ,θ) とされていますから,
>85°~95°と10°~-10°の線を消したいです。
この条件で勝手に取捨選択すれば良いのではないでしょうか.

(2)Hough変換を他の手段で行っている場合:
"他の手段"を実装した人に質問してください.