Пишу простейший детектор движения в поле зрения камеры. Использую библиотеку videoinput. Вот исходник:
// создание объекта videoInput
videoInput VI;
// получение списка доступных видеоустройств, возвращается число устройств
int numDevices = VI.listDevices();
int device1=0; // первое найденое видеоустройсво из списка
// частота кадров
VI.setIdealFramerate(device1, 15);
// указываем разрешение
VI.setupDevice(device1, 640, 480, VI_COMPOSITE);
// создаём картинку нужного размера
IplImage* image = cvCreateImage(cvSize(VI.getWidth(device1),VI.getHeight(device1)), IPL_DEPTH_8U, 3);
IplImage **buf = 0;
int last = 0;
int i, idx1 = 0;
IplImage* silh;
const int N = 4;
buf = (IplImage**)malloc(N*sizeof(buf[0]));
for( i = 0; i < N; i++ )
{
buf[i] = cvCreateImage( cvSize(640,480), IPL_DEPTH_8U, 1 );
cvZero(buf[i]);
}
cvNamedWindow( "Capture", 1 );
while(1)
{
if (VI.isFrameNew(device1))
VI.getPixels(device1, (unsigned char *)image->imageData, false, true);
}
else
{
if( cvWaitKey(10) >= 0 ) break;
continue;
}
idx1 = last;
cvCvtColor( image, buf[last], CV_BGR2GRAY ); // convert frame to grayscale
last = (last + 1) % N; // index of (last - (N-1))th frame
silh = buf[last];
cvAbsDiff( buf[idx1], buf[last], buf[last] ); // get difference between frames
cvThreshold( buf[last], buf[last], 60, 1, CV_THRESH_BINARY ); // and threshold it
CvScalar M = cvSum(buf[last]);
if (M.val[0]) printf("Motion detected");
}
cvDestroyWindow( "Capture" );
cvReleaseImage(&image);
return 0;
Работает хорошо, но когда убираю функцию открытия окна cvNamedWindow и заменяю cvWaitKey(10) на Sleep(10) увеличивается в 2-3 раза время,
затрачиваемое на выполнение определенного кол-ва циклов программы в диспетчере задач.
Пробовал вычислять время выполнения функций в цикле с помощью QueryPerformanceCounter - значения выходят примерно одинаковые. Разница только между
cvWaitKey и Sleep во время которых процессор должен простаивать. Откуда разница в диспетчере задач не пойму. Если вырезать все обработки изображения из
цикла и оставить только VI.getPixels, то время в диспетчере совпадает. Получается при открытии CV-окна запускается highgui с какой-то
дополнительной оптимизацией? И QueryPerformanceCounter почему-то ее не фиксирует.
Программу хочу запускать на старом компьютере и захватывать с нескольких камер, по этому вопрос производительности важен.
Да и лишние ненужные окна открывать не хотелось бы.