Детектор линий и краев, opencv

Я пытаюсь обработать следующие изображения из лабиринта. Мой вопрос о том, как обрабатывать края. Я использую OpenCV 2.4 с C ++.
Я хотел бы знать, есть ли способ отличить края между полом и стеной от линий, нарисованных на полу?

Пол черный, стены белые, а линии, нарисованные на полу, тоже белые.

То, что я пытаюсь сделать, это провести различие между стеной и отметками на полу. Линии на полу дадут мне указатель расстояния и, если я смогу свернуть в лабиринте. Пока стены просто говорят о границах залов лабиринта.

здесь вы найдете изображения процесса, которые я сделал.

http://oi61.tinypic.com/34hx7a0.jpg

http://oi60.tinypic.com/2zpqfq0.jpg

Я использую функции Canny и HoughLinesP для обнаружения и сохранения строк. Но, как вы можете видеть на изображениях, программа не отделяет линии от краев.

Код:

vector<Vec4i> get_lines(Mat dst, Mat cdst)
{
vector<Vec4i> lines;
HoughLinesP(dst, lines, 1, CV_PI/180, 100, 50, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
double size = norm(Mat(Point(l[0], l[1])), Mat(Point(l[2], l[3])) );
if(size > 100)
line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
}

return lines;
}

И основная функция это:

int main(int argc, char** argv)
{
const char* filename = argc >= 2 ? argv[1] : "pic1.jpg";

Mat src = imread(filename, 0);

if(src.empty())
{
help();
cout << "can not open " << filename << endl;
return -1;
}

Mat dst, cdst;

Canny(src, dst, 50, 200, 3);

cvtColor(dst, cdst, CV_GRAY2BGR);
vector<Vec4i> lines = get_lines(dst, cdst);

imshow("source W&B", src);
imshow("edges", dst);
imshow("detected lines", cdst);

imwrite("lines.jpg",cdst);
imwrite("src.jpg",src);
imwrite("canny.jpg",dst);

waitKey();

return 0;
}

1

Решение

Очевидная вещь, которую стоит попробовать — сравнить яркость пикселей по обе стороны от линии.

создайте три области: пиксели на небольшом расстоянии от одной стороны линии, пиксели на небольшом расстоянии от другой стороны линии и пиксели вблизи линии. Рассчитайте среднюю яркость в любом регионе.

Стены светло-серые, пол черный, а линии белые, поэтому

  • если одна сторона значительно ярче другой, это, вероятно, кромка (и вы даже можете сказать, какая сторона является полом),
  • если обе стороны значительно темнее, чем середина, вероятно, это отметина на полу.
  • (а если линия вертикальная, это край стены)
1

Другие решения


По вопросам рекламы [email protected]