Я хочу распознать форму / знак, показанный на рисунке 1 выделенная форма (зеленая граница)
Отсканированный объект напоминает мост.
К сожалению, я не знаю, как определить конкретную форму.
На рисунке 2 показана исходная картинка RGB. 2. Оригинальное изображение
Я редактирую это с обнаружением края «cv :: Canny» и контурной «cv :: findContours» (3. Результаты обнаружения краев).
С этого момента я не знаю, что делать.
Я использую opencv 3.4.2 и libfreenect2 в c ++.
Я использую Kinect v2 для записи.
Секция кода вызывает изображение (3.) и редактирует его, используя findContours. Однако отображается только внешний прямоугольник. Но я хотел бы отобразить всю форму, как на рисунке (1). К сожалению, у меня нет идей, как это сделать.
Я был бы очень рад помочь. Не стесняйтесь присылать несколько примеров кода.
Спасибо
vector< vector<Point> > contours;
vector<Vec4i> hierarchy;src.copyTo( dst, detected_edges);
imshow( window_name, dst );
imwrite ("Canny.png", dst);
image=imread ("Canny.png");
Mat converted (image.rows, image.cols, CV_8UC1);
Mat dat (image.rows, image.cols, CV_8UC1, Scalar ::all(0));
cvtColor(image, converted, COLOR_BGR2GRAY,1);
dilate(converted, converted, Mat(), Point(-1.5,-1.5));
threshold (converted, converted,25, 255, THRESH_BINARY);
//findContours (converted, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE );
findContours (converted, contours,hierarchy, RETR_CCOMP, CHAIN_APPROX_SIMPLE);
// Mat drawing =Mat::zeros (converted.size(), CV_8UC3);
for (int i=0; i<contours.size(); i++)
{
double a= contourArea (contours[i], false);
if(a>largest_area)
{
largest_area=a;
largest_contour_index=i;
bounding_rect=boundingRect (contours[i]);
}
}
Scalar color (255,255,255);
drawContours (dat, contours, largest_contour_index, color, CV_FILLED,8,hierarchy);
rectangle (image, bounding_rect , Scalar (0,255,0),1,8,0);
imshow("dat", image);
imshow ("largestContour", dat);
imwrite("largestContour.png", image);
imwrite("dat.png", dat);
Задача ещё не решена.
Других решений пока нет …