Реализация функций распознавания и идентификации

Результатом выполнения функции Кенни является изображение, содержащее края объектов в исходном кадре, и являющиеся основой для последующих преобразований, в частности для выделения контуров.

Рассмотрим функцию cvFindContours, которая находит контура объектов, находящихся в поле зрения камеры:

cvFindContours(gray, storage, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ).

Здесь gray является исходным изображением в 8-битном формате, в области памяти storage хранятся полученные контура; в массиве contours содержится информация о первом найденном контуре; CvContour показывает размер структуры данных контура; параметр CV_RETR_LIST означает, что все выделенные контура помещаются в список; параметр CV_CHAIN_APPROX_SIMPLE означает, что функция выделяет центры контуров; cvPoint(0,0) показывает, что контуры извлекаются из изображений и затем должны быть проанализированы в контексте целого изображения.

Для нахождения нескольких контуров используется цикл, представленный ниже:

while(contours)

{ result = cvApproxPoly( contours, sizeof( CvContour), storage, CV_POLY_APPROX_DP, cvContourPerimeter( contours)*0.02, 0 );( result->total == 4 && fabs( cvContourArea( result, CV_WHOLE_SEQ)) > 1000 && fabs( cvContourArea( result, CV_WHOLE_SEQ)) <( img->height * img->width/2 ) && cvCheckContourConvexity( result) )

{ s = 0; for( int i = 0; i < 5; i++ )

{if( i >= 2) { t = fabs( angle( ( CvPoint*)cvGetSeqElem( result, i ), ( CvPoint*)cvGetSeqElem( result, i-2 ),

( CvPoint*)cvGetSeqElem( result, i-1 ))); s = s > t ? s : t; } } if( s < 0.5 )for( int i = 0; i < 4; i++ )cvSeqPush( squares, ( CvPoint*)cvGetSeqElem( result, i )); }

contours = contours->h_next; }.

На рис. 4.8 представлен результат применения функции выделения контуров.

Рисунок 4.8 - Пример выделения контуров изображений

Функция cvHoughCircles находит окружности на сером изображении, используя преобразование Хью:

cvHoughCircles( gray, cstorage, CV_HOUGH_GRADIENT, 1, gray->height/16, 8, 10, 4, 50 ).

В данной функции, использованной в программном обеспечении параметр gray является 8-битым изображением; cstorage - область памяти, в которой хранятся окружности, обнаруженные функцией; CV_HOUGH_GRADIENT - метод реализации функции; 1 - стек, который используется для обнаружения центров окружностей с тем же разрешением, что и исходное изображение; gray->height/16 - вычисляется минимальное расстояние между центрами обнаруженных окружностей; следующие 2 параметра отвечают за накопление порогов в обнаруженных окружностях; последние 2 параметра отвечают за минимальный и максимальный радиус находимых окружностей.

Для отображения окружностей используется цикл, который выглядит так:

for( int i = 0; i < circles-> total; i++ )

{ float* p = ( float*)cvGetSeqElem( circles, i );( out, cvPoint( cvRound( p[0]), cvRound( p[1])),

, CV_RGB( 200, 0, 0), -1, 8, 0 );( out, cvPoint( cvRound( p[0]), cvRound( p[1])), cvRound( p[2]), CV_RGB( 200, 0, 0), 1, 8, 0 ); }

Пример выполнения функции представлен на рис. 4.9.

Рисунок 4.9 - Применение функции выделения кругов

Отображение прямоугольных изображений осуществляется командой

void drawSquares(IplImage *img, CvSeq* squares);

Прямоугольные объекты определяются при помощи функции полилиний

cvPolyLine( img, &rect, &count, 1, 1, CV_RGB(200,0,0), 1, CV_AA, 0 );

Далее читается последовательность 4 линий

CV_READ_SEQ_ELEM( pt[0], reader );_READ_SEQ_ELEM( pt[1], reader );_READ_SEQ_ELEM( pt[2], reader );_READ_SEQ_ELEM( pt[3], reader ).

Угол поворота линий полилинии задан при помощи функции :

double angle = abs(pt[1].y-pt[2].y)/sqrt((pt[1].x-pt[2].x)*

(pt[1].x-pt[2].x)+(pt[1].y-pt[2].y)*(pt[1].y-pt[2].y)+0.00001);

Сами линии полилинии прорисовываются с помощью функций:

cvLine( img, cvPoint(0,img->height/2), cvPoint(img->width,img->height/2), CV_RGB(200,200,200),1, 8, 0 );( img, cvPoint(img->width/3,0), cvPoint(img->width/3,img->height), CV_RGB(200,200,200),1, 8, 0 );( img, cvPoint(img->width/3*2,0), cvPoint(img->width/3*2,img->height), CV_RGB(200,200,200),1, 8, 0 );cvPutText( img, st, pt[1], &font, CV_RGB(200,0,0).

Перейти на страницу: 1 2

Другое по теме:

Моделирование электронного расширителя стереобазы с помощью программного пакета OrCAD 9.2
Возможность компьютерного моделирования электронных устройств открывает перед нами широкие возможности в изучении их характеристик, не прибегая к дорогостоящим и достаточно трудоемким затратам на реальные физические экспе ...

Современное состояние и перспективы развития связи в России
Анализ мирового опыта, а также результаты исследований, выполненных ITU-T и рядом компаний, позволяют выделить следующие основные технические и технологические тенденции развития электросвязи. • развитие ...

©  www.techvarious.ru - 2019