Как получить вершины обнаруженного прямоугольника в изображении

#opencv #rectangles #vertices

#opencv #прямоугольники #вершины

Вопрос:

Я новичок в opencv, и мне нужно обнаружить прямоугольник на изображении, получить его вершины и, используя эти точки, я должен обрезать это изображение. Прямоугольник обнаруживается путем нахождения контуров. Теперь я хочу получить вершины (значения углов). Может кто-нибудь, пожалуйста, указать или поделиться кодом?

Мой код:

  CvSeq* contours;  //hold the pointer to a contour in the memory block
 CvSeq* resu<   //hold sequence of points of a contour
 CvMemStorage *storage = cvCreateMemStorage(0); //storage area for all contours

 //finding all contours in the image
 cvFindContours(imgGrayScale, storage, amp;contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));

 //iterating through each contour
 while(contours)
 {
     //obtain a sequence of points of contour, pointed by the variable 'contour'
     result = cvApproxPoly(contours, sizeof(CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter(contours)*0.02, 0);

      //if there are 4 vertices in the contour(It should be a rectangle)
     if(result->total==4 )
     {
         //iterating through each point
         CvPoint *pt[4];
         for(int i=0;i<4;i  )
            {
                pt[i] = (CvPoint*)cvGetSeqElem(result, i);
         }

         //drawing lines around the rectangle
         cvLine(img, *pt[0], *pt[1], cvScalar(0,255,0),4);
         cvLine(img, *pt[1], *pt[2], cvScalar(0,255,0),4);
         cvLine(img, *pt[2], *pt[3], cvScalar(0,255,0),4);
         cvLine(img, *pt[3], *pt[0], cvScalar(0,255,0),4);
     }
      //obtain the next contour
     contours = contours->h_next;
}
  

Комментарии:

1. Пожалуйста, объясните конкретную проблему, с которой вы столкнулись с опубликованным вами кодом.

2. поскольку вы новичок в opencv, они перешли на c api уже в 2010 году. пожалуйста, попробуйте использовать это, а не старый c-api! избегайте IplImages, функций cv *, используйте cv::Mat и объекты из cv::namespace.

3. Я использую версию 2.4.2 Opencv. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу определить вершины прямоугольника, чтобы обрезать изображение, используя эти точки вершин. Верхние левые и нижние правые точки.

4. @savanna — У меня нет проблем с этим кодом. Только что опубликовал его для ссылки и хочу знать, как я могу получить вершины, поскольку я обнаружил прямоугольник, используя функцию контуров.

5. AFAIK, обнаруженные контуры (по крайней мере, с помощью C API) содержат смежные точки, поэтому прямоугольник будет содержать не только 4 точки, но и гораздо больше, поэтому ваш код меня немного удивляет. Вы уверены, что это правильно рисует прямоугольники?