Я пытаюсь обнаружить линейку на изображении, и я буду следовать следующему процессу:.OpenCV линия/обнаружение линейки
1) подготовить изображению (размытие, Осторожным, ECT)
2) обнаружение линии
3) Приготовьте набор параллельных линий
, что приложение преобразует это:
рядом я попытался HoughLinesP
метода и выгляжу я не могу применить это в моем случае, потому что я не знаю, угла линии, так что не найдена линейка вертикальных линий, но нашел в горизонтальном положении (например,) и каждая линейка линия состоит из множества тонких линий, что будет проблемой для процесса:
код:
std::vector<cv::Vec4i> lines_std;
cv::HoughLinesP(grayMat, lines_std, 1, CV_PI/90, 50, 10, 0);
// drawing lines (with random color)
for(size_t i = 0; i < lines_std.size(); i++)
{
cv::line(originalMat, cv::Point(lines_std[i][0], lines_std[i][1]),
cv::Point(lines_std[i][2], lines_std[i][3]), cv::Scalar(arc4random_uniform(155)+100,
arc4random_uniform(155)+100,
arc4random_uniform(155)+100), 1);
}
также я попытался LineSegmentDetector
, и получил более близкий результат я ожидал:
код:
vector<Vec4f> lines_std;
Ptr<LineSegmentDetector> ls = createLineSegmentDetector(LSD_REFINE_NONE);
ls->detect(grayMat, lines_std);
, но здесь я столкнулся с некоторыми проблемами (и выглядит не существует никакого способа, чтобы настроить createLineSegmentDetector
): были обнаружены не все линии, линия обнаруживает не в центре, но на сторон и несколько раз только в левой или правой части, но мне нужно получить центр полужирной линии, потому что это будет использовано в последующих вычислениях.
Итак, каков правильный способ найти все строки (и каждая строка только один раз в центре жирной линии)?
Update
пытался HoughLines
также:
векторных линий;
cv::HoughLines(grayMat, lines, 1, CV_PI/90, 100 , 100, 0);
for(size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0], theta = lines[i][1];
cv::Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
pt1.x = cvRound(x0 + 1000*(-b));
pt1.y = cvRound(y0 + 1000*(a));
pt2.x = cvRound(x0 - 1000*(-b));
pt2.y = cvRound(y0 - 1000*(a));
cv::line(originalMat, pt1, pt2, cv::Scalar(0,255,0), 3, CV_AA);
}
но результат тоже выглядит странно (и расчеты занимает много времени):