2012-05-30 3 views
3

Мне нужно найти угловые точки изображения, чтобы я мог обрезать его в прямоугольной форме. Я уже нашел контур и использовал функцию approxpoly() на нем. Теперь как найти угловые координаты контура? Вот мой C код->Как найти угловые координаты контура изображения в Opencv и C

#include <cv.h> 
#include <highgui.h> 

int main(int argc, char** argv) 
{ 
IplImage *img,*gray; 

if((img = cvLoadImage("save.jpg", 1)) == NULL) 
{ 
    printf("A Img open error\n"); 
} 

gray=cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1); 
cvCvtColor(img,gray,CV_BGR2GRAY); 

IplImage* out_median = cvCreateImage(cvGetSize(gray),IPL_DEPTH_8U,1); 
cvSmooth(gray,out_median,CV_MEDIAN,3); 

IplImage* out_threshold = cvCreateImage(cvGetSize(out_median), out_median->depth, 1); 
cvThreshold(out_median,out_threshold,1,255,CV_THRESH_BINARY); 

CvMemStorage* storage = cvCreateMemStorage(); 
CvSeq* first_contour = NULL; 

cvFindContours(out_threshold,storage,&first_contour,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE); 

CvSeq* approx_polygon = NULL; 
approx_polygon=cvApproxPoly(first_contour,sizeof(CvContour),storage,CV_POLY_APPROX_DP,0.01*cvArcLength(first_contour,CV_WHOLE_SEQ, 1),0); 

    //cvDrawContours(out_threshold,approx_polygon,cvScalarAll(255),cvScalarAll(255),100); 
//cvShowImage("Contours", out_threshold); 
//cvSaveImage("save_approxpoly_contour.jpg",out_threshold); 


cvWaitKey(0); 
return 0; 

}

Это мое контурное изображение после применения Approxpoly() enter image description here

+2

Если у вас уже есть контуры, простая математика известково бы выявить точки угла. Сделайте простую итерацию по тем пунктам, которые у вас есть, ищите левые верхние, верхние правые, нижние левые и нижние правые точки. Для этого нет необходимости использовать дополнительную библиотеку. Это базовая математика, если я правильно понял вашу проблему. – karlphillip

+0

Да, я знаю, о чем вы говорите, например, для поиска нижней правой правой части контура, продукт должен быть максимальным. Можете ли вы рассказать мне, какая функция даст мне очки, чтобы они могли перебирать их. Есть ли что-то вроде контура -> x/y или что-то в этом роде, чтобы получить очки. –

+3

http://tech.dir.groups.yahoo.com/group/OpenCV/message/51631 –

ответ

0

Я рекомендую использовать cvBlob:

Получить сгустки:

cvThreshold(&src, &dst, 10, 255, CV_THRESH_BINARY); 
IplImage *labelImg = cvCreateImage(cvGetSize(&dst),IPL_DEPTH_LABEL,1); 
CvBlobs blobs; 
unsigned int result = cvLabel(&dst, labelImg, blobs); 

Если у вас есть более чем один элемент, найти пределы

int borders[4]; 
borders[0] = 99999; //left 
borders[1] = 99999; //top 
borders[2] = 0; //right 
borders[3] = 0; //bottom 

for (CvBlobs::const_iterator it=blobs.begin(); it!=blobs.end(); ++it) 
{ 
    if((*it).second->maxx) < borders[0]){ 
     borders[0] = (*it).second->maxx; 
    } 
    if(((*it).second->miny) < borders[1]){ 
     borders[1] = (*it).second->miny; 
    } 
    if((*it).second->minx) > borders[2]){ 
     borders[2] = (*it).second->minx; 
    } 
    if(((*it).second->maxy) > borders[3]){ 
     borders[3] = (*it).second->maxy; 
    } 
} 
+0

Использует только этот код, смогу ли я получить угловые точки изображения? –

+0

зависит от исходного изображения, если вы его порог справа, а угол порогового изображения - нужный угол, тогда да. Если приведенное выше изображение было пороговым изображением, вы получите угол '(x, y)', посмотрев на 'blobs [0] .second-> maxx' и' blobs [0] .second-> maxyy' – Smash

+0

Спасибо. Я попробую. –

Смежные вопросы