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

Доска почета


Popular Content

Showing most liked content on 21.04.2011 во всех областях

  1. 1 point
    Есть вот такая интересная функция, я стащил её у китайцев и адаптировал к opencv Картинка для неё: motion_fuzzy_lena.bmp Подозреваю что для других картинок надо настраивать параметры ( int A = 80;int B = 10; и Общее расстояние сдвига const int nTotLen=10; ). Но как пока не разобрался. В пояснениях было написано, что устраняет размытие от прямолинейного равномерного движения. Результат работы: bool cvMotionRestore(IplImage* Src,IplImage* Dst) { BYTE * lpSrc; //Размеры изображения LONG lWidth=Src->width; LONG lHeight=Src->height; // Изображение количество байтов в строке LONG lLineBytes=Src->widthStep; LPBYTE lpDIBBits; lpDIBBits=(LPBYTE)Src->imageData; //Переменная цикла long iColumn; long jRow; int i,n,m; //Временные переменные int temp1,temp2,totalq,q1,q2,z; double p,q; // Назначение коэффициентов int A = 80; int B = 10; //Общее расстояние сдвига const int nTotLen=10; // Ширина изображения содержит число длин сдвига ntotlen int K=((float)lLineBytes/(float)nTotLen); int error[nTotLen]; for (jRow = 0; jRow < lHeight; jRow++) { // Вычислить error[i] for(i = 0; i < nTotLen; i++) { error[i] = 0; for(n = 0; n < K; n++) for(m = 0; m <= n; m++) { // пиксель начале строки if(i == 0 && m == 0) { temp1=temp2=0; } // дифференциальный оператор else { lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i; temp1=*lpSrc; lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + m*nTotLen+i-1; temp2 = *lpSrc; } error[i] = error[i] + temp1 - temp2; } error[i] = B * error[i] / K; } for(iColumn = 0; iColumn < lLineBytes; iColumn++) { m = iColumn / nTotLen; z = iColumn - m*nTotLen; totalq = 0; q = 0; for(n = 0; n <= m; n++) { q1 = iColumn - nTotLen*n; if(q1 == 0) {q = 0;} // дифференциальный оператор else { q2 = q1 - 1; lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q1; temp1 = *lpSrc; lpSrc = (unsigned char *)lpDIBBits + lLineBytes * jRow + q2; temp2 = *lpSrc; q = (temp1 - temp2) * B; } totalq = totalq + q; } p = error[z]; // Получить значения f(x,y) temp1 = totalq + A - p; // Результат к диапазону 0-255 if(temp1 < 0) temp1 = 0; if(temp1 > 255) temp1 = 255; Dst->imageData[lLineBytes*jRow + iColumn] = temp1; } } return true; } [/code]
  2. 1 point
    вообщем мне кажется, что это не самый крутой метод, ибо видны полоски. можно поискать по тегам motion blur, motion debluring, Wiener deconvolution http://www.owlnet.rice.edu/~elec539/Projects99/BACH/proj2/blind/bd.html http://www.cse.cuhk.edu.hk/~leojia/projects/motion_deblurring/index.html http://cs.nyu.edu/~fergus/research/deblur.html
  3. -1 points
    Пишу простейший детектор движения в поле зрения камеры. Использую библиотеку 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 почему-то ее не фиксирует. Программу хочу запускать на старом компьютере и захватывать с нескольких камер, по этому вопрос производительности важен. Да и лишние ненужные окна открывать не хотелось бы.
×