#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 точки, но и гораздо больше, поэтому ваш код меня немного удивляет. Вы уверены, что это правильно рисует прямоугольники?