void SearchNumber( IplImage* img, CvSeq* squares ) // CvSeq хранит данные о контуре
{
char* NameWnd2 = "Nomer";
cvNamedWindow( "Nomer", CV_WINDOW_AUTOSIZE );
CvSeqReader reader;
IplImage* cpy = cvCloneImage( img );
int i,j;
CvPoint pt1;
CvFont font;
CvSize text_size;
pt1.x = 100;
pt1.y = 100;
cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 0.5, 0.5, 0.0, 0, CV_AA );
cvGetTextSize( "1", &font, &text_size, 0 );
// initialize reader of the sequence
cvStartReadSeq( squares, &reader, 0 );
// cvSeqRemove( squares, 10);
// читать 4 последовательности элементов (все вершины)
for( i = 0; i < squares->total; i += 4 )
{
CvPoint pt[4], *rect = pt; // Массив точем массива контура
int count = 4;
// Читать 4 вершины
CV_READ_SEQ_ELEM( pt[0], reader ); //
CV_READ_SEQ_ELEM( pt[1], reader ); // Считывание точек вершин
CV_READ_SEQ_ELEM( pt[2], reader ); //
CV_READ_SEQ_ELEM( pt[3], reader ); //
//Поиск вершин по которым будут строится новый квадрат изображения
int c,gip,max,min;
max=0;
min=10000;
CvPoint MaxPoint;
CvPoint MinPoint;
MaxPoint.x=1; MaxPoint.y=1;
MinPoint.x=1; MinPoint.y=1;
////Далее собсно идет мой алгоритм поиска двух вершин по которым будет строится область ROI ....
////Алгоритм крив и косячен до ужоса >_< Может есть какая-то функция заменяющая весь этот ужс???)
for( j=0; j<4; j++ )
{
gip= (int)sqrt ((double)((pt[j].x)*(pt[j].x)+(pt[j].y)*(pt[j].y)));
if ((gip > max)&&((pt[j].y)>(MaxPoint.y)))
{
max = gip;
MaxPoint = pt[j];
}
if ((gip < min)&&((pt[j].y)<(MaxPoint.y)))
{
min = gip;
MinPoint = pt[j];
}
printf("(%d,%d)\n", pt[j].x, pt[j].y );
printf("Gipotinuza = %d,\n",gip);
}
printf("MaX = %d,%d\n",MaxPoint.x,MaxPoint.y);
printf("MiN = %d,%d\n",MinPoint.x,MinPoint.y);
cvSetImageROI(img, cvRect(MinPoint.x,MinPoint.y,MaxPoint.x,MaxPoint.y));
////Запись квадрата в память как JPG вайл
char buffer[50];
itoa(i,buffer,10);
strcat(buffer,".jpg");
printf("Imia Faila: %s\n", buffer);
if(!cvSaveImage(buffer, img))
{
printf("Невозможно записать файл изображения\n");
}
cvShowImage( NameWnd2, img );
cvResetImageROI(img);
printf("************************\n");
/////Вывод номеров вершин
for( j=0; j<4; j++ )
{
char buffer[50];
itoa(j+1,buffer,10);
cvPutText(cpy, buffer, pt[j], &font, CV_RGB(255,1,1));
}
}
// Вывод изображения
cvShowImage( wndname, cpy );
cvReleaseImage( &cpy ); //Освобождение памяти
}