Я пытаюсь обработать следующие изображения из лабиринта. Мой вопрос о том, как обрабатывать края. Я использую OpenCV 2.4 с C ++.
Я хотел бы знать, есть ли способ отличить края между полом и стеной от линий, нарисованных на полу?
Пол черный, стены белые, а линии, нарисованные на полу, тоже белые.
То, что я пытаюсь сделать, это провести различие между стеной и отметками на полу. Линии на полу дадут мне указатель расстояния и, если я смогу свернуть в лабиринте. Пока стены просто говорят о границах залов лабиринта.
здесь вы найдете изображения процесса, которые я сделал.
Я использую функции 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;
}
Очевидная вещь, которую стоит попробовать — сравнить яркость пикселей по обе стороны от линии.
создайте три области: пиксели на небольшом расстоянии от одной стороны линии, пиксели на небольшом расстоянии от другой стороны линии и пиксели вблизи линии. Рассчитайте среднюю яркость в любом регионе.
Стены светло-серые, пол черный, а линии белые, поэтому