обнаружить неправильную форму с помощью opencv / c ++ - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу распознать форму / отметку, показанную на рисунке 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);
...