Обнаружение неполных / идеальных треугольников

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

на этом изображении, например, он не обнаруживает треугольника

введите описание изображения здесь

код, который я использую, это:

vector<Point> approx;
findContours(copia,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE);
vector<Rect_ <int> > boundRect( contours.size() );
vector<Rect_ <int> > boundRect_( contours.size() );
for(size_t i=0; i<contours.size();i++)
{

approxPolyDP(Mat(contours[i]), approx,arcLength(Mat(contours[i]), true)*0.02, true);

if (approx.size() == 3 &&fabs(contourArea(Mat(approx))) > 300 && isContourConvex(Mat(approx)))
drawContours(capture->image,contours,i,Scalar(0,255,0));

Это не проблема области, у меня нет проблем с обнаружением полных треугольников. Я не знаю, смогу ли я сделать что-нибудь, чтобы обнаружить такого рода «неполные треугольники», или мне нужно было бы что-то сделать, чтобы завершить треугольник, чтобы я мог их обнаружить. В любом случае я немного растерялся

Спасибо за помощь

РЕДАКТИРОВАТЬ: я забыл загрузить изображение

2

Решение

На самом деле, opencv сторона треугольника может быть трудной с точки зрения зрения, но я бы предложил некоторый метод, который может помочь вам достичь.

1) Используйте Угловой детектор

(OpenCV Canny) детектировать весь угол в двоичном изображении. Я бы сказал, использовать морфологические операции (Дилат и Эрроде) как средство уменьшения шума вместо размытия или не максимального подавления. Далее используйте крайние точки и соедините их, чтобы сформировать треугольники. Поскольку, возможно, будет много углов, вы можете попробовать подобрать все точки и выбрать максимальную посадку. Вы также можете использовать триангуляцию Делоне, чтобы найти треугольник с точками.

2) Использование информации о кривизне.
Поскольку один край треугольника отсутствует, вы можете использовать 2 ребра для вычисления кривизны описывающего контура. Опять здесь морфологические операции (Дилат и Эрроде) может быть полезным. Чем вы можете выбрать точки, где кривизна (Вычисление кривизны контура двоичного изображения) радикально изменить крайнюю точку, такую ​​как вершина и подгонка линий, чтобы получить приближение к краю треугольника. Если ваше изображение менее шумное, вы можете использовать Выпуклый корпус чтобы получить приближение.

3) Фитинги RANSAC
Вы также можете использовать метод Фиттинга для аппроксимации треугольника с помощью вариантов треугольников и подгонки его к 2 оценочным ребрам на двоичном изображении.

1

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

Тема старая — но может помочь другим.
У меня была та же проблема, но я справился с ней, используя функцию dlate () на входном изображении (может потребоваться 2-3 итерации, если у треугольника большой разрыв). Это не лучшее решение, но на данный момент кажется самым простым.

1