Перейти к содержимому
Compvision.ru

schtir

Пользователи
  • Количество публикаций

    2
  • Зарегистрирован

  • Посещение

Репутация

-2 Вредитель

О schtir

  • Звание
    Новичок
  1. Производительность OpenCV

    cvWaitKey вызвает в цикле Sleep(1) и ловит события от CV-окон, что в принципе немого замедляет эту функцию по сравнению sleep. А программа с cvNamedWindow и cvWaitKey работает наоборот быстрее в 2-3 раза (судя по дисп задач). Еще раз повторю если вырезать все функции обработки изображения из цикла моей программы (останется захват видео-кадра и задержка), то оба варианта работают почти одинаково. Если брать QueryPerformanceCounter между выполнениями функций обработки изображений, то в обоих вариантах эти функции отнимают почти одинаковое время. Тесты провожу на двухядерном компе. Тут похоже какая-то тривиальная ошибка, но я ее никак не вижу, поэтому обращаюсь за помощью к общественности. Попробую порыться в исходниках cvNamedWindow
  2. Производительность OpenCV

    Пишу простейший детектор движения в поле зрения камеры. Использую библиотеку 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 почему-то ее не фиксирует. Программу хочу запускать на старом компьютере и захватывать с нескольких камер, по этому вопрос производительности важен. Да и лишние ненужные окна открывать не хотелось бы.
×