Особенности программирования систем распознавания образов реального времени / Прикладные вопросы распознавания образов / Recog.ru - Распознавание образов для программистов


Особенности программирования систем распознавания образов реального времени

Системы распознавания образов (СРО) на настоящий момент находят все больше применения в промышленности, торговле, бизнесе и повседневной жизни. Огромное число компаний связывают свою деятельность с разработкой СРО реального времени (РВ) для персональных компьютеров, серверов, мобильных платформ и онлайн-сервисов. Большое количество отечественных и зарубежных ученых разрабатывают новые алгоритмы распознавания РВ, применяя при этом современные языки и среды программирования, зачастую не обращая внимания на тот факт, что система РВ – это прежде всего предсказуемая система. Поэтому в данной работе предлагается подход к программированию СРО РВ на языке C/C++ на платформе Windows XP/7.
В настоящее время при разработке сложных СРО РВ часто используют программную библиотеку OpenCV (opencv.willowgarage.com), которая может функционировать на различных платформах и операционных системах. Множество задач связано с обработкой видеопотоков, например, с web-камеры. В этом случае программный код библиотеки OpenCV выглядит следующим образом:
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui_c.h"
int main(int argc, char** argv){
	CvCapture* capture = cvCaptureFromCAM(0);
	cvNamedWindow( "Camera", 1 );
	IplImage* frame=0;
	do{
		frame = cvQueryFrame(capture );
		…<Какая-либо функция распознавания>
		cvShowImage( "Camera", frame);
		if (cvWaitKey( 20 ) == 32 ) break;
	}while ( 1 );
	cvReleaseCapture(&capture);
	return 0;
}

Однако здесь возникают вопросы: Как контролировать время выполнения функции распознавания? Что делать, если модуль распознавания образов ненадежен – а это часто бывает из-за высокой сложности алгоритмов распознавания. В этом случае можно использовать подход к выбору структуры СРО РВ, описанный в работе [Кручинин, А.Ю. Особенности разработки программных систем распознавания образов реального времени / А.Ю. Кручинин // Автоматизация в промышленности. – 2011. — №7. – С. 53-56.].
Используя этот подход, в упрощенном виде была разработана программная библиотека PRSRT на языке C. На рисунке приведена схема инициализации данной библиотеки. Первоначально создаются механизмы синхронизации потоков и процессов – события. Затем создаются потоки сбора данных, перезапуска, логирования, общая память для обмена информации между процессами и процессы распознавания, которые после запуска сразу же блокируются.

На рисунке ниже приведена упрощенная схема взаимодействия процессов и потоков. Первоначально все процессы и потоки, кроме главного, блокированы. Главный поток разблокирует поток данных и засыпает на фиксированное время, ожидая результат распознавания. Поток данных копирует данные (например, в web-камеры), разблокирует активный процесс распознавания и блокируется. Процесс распознавания после разблокирования читает общую память с образом (кадром изображения), вызывает функцию распознавания, после чего копирует результат распознавания в общую память, посылает сообщение главному потоку основного процесса и блокируется. Если время не истекло, главный процесс получает результат распознавания, выдает его пользователю и снова разблокирует поток данных. Если же время ожидания истекло, а ответа от процесса распознавания не было, то активный процесс распознавания уничтожается, главный поток разблокирует второй процесс распознавания, заменяя при этом данные (с этого момента считается что процесс 2 стал процессом 1), запускается еще один процесс распознавания, который сразу же блокируется, если необходимо – делается пометка в лог файл об ошибке, выдается результат об ошибке распознавания, после чего опять разблокирует поток данных.

Однако, реализация такого сложного механизма построения СРО РВ усложняет и листинг программы:
#include "prsrt.h"
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui_c.h"

DWORD WINAPI DataFunction(LPVOID);
DWORD WINAPI LogFile(LPVOID);
PRSRT Prsrt;
CvCapture* capture;
IplImage* frame;

int main(int argc, char** argv)
{
	 if ( argc > 1 ) < Инициализация процесса распознавания>
	 else InitPRSRT( &Prsrt, "Программа.exe", "", DataFunction, 1000000, 100, 400, PRSRT_EVENT | PRSRT_REC_CONSOLE | PRSRT_NOSINCH );
	 if ( Prsrt.Type == MAIN_PROCESS )
	 {
		  // Основной поток
		  StartPRSRT( &Prsrt );		  
		  <Инициализация переменных>  
		  do{
			   if (!WaitResultPRSRT( &Prsrt, data, size )){
					<Ошибка>
					continue;
			   }
			   <Результат распознавания>
		  }while ( 1 );
	 }
	 if ( Prsrt.Type == RECOGNITION_PROCESS )
	 {		  
		  __try{
			   <Инициализация переменных>
			   do{
					ReciveDataPRSRT( &Prsrt, image->imageData, size );
					<Распознавание>
					SendResultPRSRT( &Prsrt, data, 100 );
			   }while ( 1 );
		  }
		  __except (EXCEPTION_EXECUTE_HANDLER) {}
	 }
	 return 0;
}
// Модуль работы с данными
DWORD WINAPI DataFunction(LPVOID)
{	 
	 capture = cvCaptureFromCAM(0);
	 cvNamedWindow( "Camera", 1 );
	 if (!InitDataPRSRT( &Prsrt ))
	 {
		  printf( "Error Data Thread" );
		  return 1;
	 }
	 <Инициализация переменных>
	 do{
		  frame = cvQueryFrame(capture );
		  cvShowImage( "Camera", frame);
		  cvWaitKey( 20 );
		  // Запись кадра в глобальную память
		  CopyDataPRSRT( &Prsrt, object->imageData, size_image );
	 }while ( 1 );
	 return 0;
}

Несмотря на усложнение программного обеспечения, данное решение позволяет увеличить надежность функционирования СРО РВ, увеличить предсказуемость и предоставляет большие возможности для отладки, а именно сбор образов, вызывающих некорректную работу программы.
Вы можете скачать библиотеку PRSRT здесь вместе с примером эмуляции использования. Библиотека экспериментальная, поэтому возможны ошибки. Просьба о недостатках и предложениях писать сюда.
  • 0
  • 10 ноября 2012, 15:06
  • vidikon

Комментарии (0)

RSS свернуть / развернуть

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.