ページ 1 / 1
直線検出(線分検出)を行ったいらない線を削除したいです。
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変換を他の手段で行っている場合:
"他の手段"を実装した人に質問してください.