destrannik 0 Жалоба Опубликовано November 5, 2015 здравствуйте!я устал шарить по интернету, посмотрел, тут вроде всем помогают очень хорошо! вообщем есть код! запускаем, жмём на энтер для того чтобы запомнился фон! потом инородные объекты программа выделяет синим цветом! вообщем любые изменения по сравнению с фоном программа показывает синим цветом!и вот мне нужно чтобы предмет который задержался в кадре на 10 секунд к примеру выделять контуром(прямоугольником). ну и дальше думаю сделать чтобы сохранялся кадр в папку с подписью.#include <iostream> #include <opencv\cv.h> #include <opencv\highgui.h> #include <stdlib.h> #include <stdio.h> int main(int argc, char** argv) { //Необходимо подключить камеру CvCapture* capture = 0; capture = cvCaptureFromCAM(0); if (!capture) return 1; cvNamedWindow( "Motion", 1 ); IplImage* image; CvScalar color; CvPoint cv1; CvFont font; cvInitFont( &font, CV_FONT_HERSHEY_SIMPLEX, 1.3f,1.3f,0,1, 8 ); cv1.x=70; cv1.y=120; color = CV_RGB(24,0,24); int i,j; for(;;) { IplImage* image1; if( !cvGrabFrame( capture )) break; image1 = cvRetrieveFrame( capture ); cvPutText( image1, "Press, when you ready", cv1, &font, color ); cvShowImage( "Motion", image1); if( cvWaitKey(10) >= 0 ) break; } //обучаем фон image = cvRetrieveFrame( capture ); cvShowImage( "Motion", image); //Теперь надо посчитать m для каждых float *m=new float[image->height*image->width*3]; int j1; uchar* ptr; for(i=0;i<image->height;i++) { for(j=0;j<image->width;j++) { for(j1=0;j1<3;j1++) { m[(i*image->width+j)*3+j1]=0; ptr = (uchar*) (image->imageData); m[(i*image->width+j)*3+j1]+=ptr[j*3+i*image->widthStep+j1]; m[(i*image->width+j)*3+j1]=m[(i*image->width+j)*3+j1]/1; } } } //Раз запомнили - можно входить в цикл обработки изображений float porog=60.0; float k=0; for(;;) { IplImage* image1; if( !cvGrabFrame( capture )) break; image1 = cvRetrieveFrame( capture ); ptr = (uchar*) (image1->imageData); for(i=0;i<image->height;i++) { for(j=0;j<image->width;j++) { k=0; for(j1=0;j1<3;j1++) k+=abs(m[(i*image1->width+j)*3+j1]-ptr[j*3+i*image1->widthStep+j1]); if (k>=porog) { for(j1=0;j1<3;j1++) { if (j1==0) ptr[j*3+i*image1->widthStep+j1]=255; else ptr[j*3+i*image1->widthStep+j1]=100; } } } } cvShowImage( "Motion", image1); if( cvWaitKey(10) >= 0 ) break; } //Удаляем все cvReleaseCapture( &capture ); cvDestroyWindow( "Motion" ); delete m; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано November 5, 2015 Так вопрос то в чем? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
destrannik 0 Жалоба Опубликовано November 5, 2015 и вот мне нужно чтобы предмет который задержался в кадре на 10 секунд к примеру выделять контуром(прямоугольником). любая инфа будет полезной! Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 5, 2015 Посмотрите библиотеку BGSlibrary : https://www.behance.net/gallery/3943089/BGS-Library-A-Background-Subtraction-Library Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
BeS 53 Жалоба Опубликовано November 5, 2015 Посмотрите библиотеку BGSlibrary : https://www.behance.net/gallery/3943089/BGS-Library-A-Background-Subtraction-LibraryКак вариант чего-нибудь менее увесистого, моя имплементация вайба: https://github.com/BelBES/VIBE Работает шустро (правда без каких либо софтварных оптимизаций) и на сценах с искуственным освещением, скорей всего, качества будет достаточно. и вот мне нужно чтобы предмет который задержался в кадре на 10 секунд к примеру выделять контуром(прямоугольником). любая инфа будет полезной!Ну так в чем конкретно у вас трудности при обобщении имеющегося кода на озвученный в ТЗ случай? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах