2012-02-21 4 views
4

Я делаю распознавание движения при ходьбе с использованием openCV и C++, и я хотел бы создать маску или скопированное изображение, чтобы добиться эффекта, наблюдаемого на изображении. extracted human. Ниже приведено объяснение изображений. Отображается полученная капля человеческой ходьбы. Затем создается изображение маски или скопированное изображение исходного кадра, теперь бинарная человеческая блоба замаскирована, а немаскированные пиксели теперь устанавливаются на ноль. Результатом является извлеченный человеческий организм с черным фоном. На приведенной ниже диаграмме показано, как человеческая капля извлекается, а затем замаскирована. Это должно быть сделано для каждого пятого кадра видеопоследовательности. Мой код до сих пор состоит в том, чтобы получить каждый пятый кадр, сделать его серой шкалой, найти области всех блоков, и применить пороговое значение для получения бинарного изображения, где более или менее, только человеческий капли белого цвета, а остальная часть изображения черный. Теперь я пытаюсь извлечь человеческое тело, но я не знаю, как действовать дальше. Пожалуйста, помогите мне.Маскировка блоба из двоичного изображения

#include "cv.h" 
#include "highgui.h" 
#include "iostream" 

using namespace std; 
int main(int argc, char* argv) { 

CvCapture *capture = NULL; 
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi"); 
if(!capture){ 
    return -1; 
} 

IplImage* color_frame = NULL; 
IplImage* gray_frame = NULL ; 

int thresh_frame = 28; 
CvMoments moments; 

int frameCount=0;//Counts every 5 frames 
cvNamedWindow("walking", CV_WINDOW_AUTOSIZE); 

while(1) { 
    color_frame = cvQueryFrame(capture);//Grabs the frame from a file 
    if(!color_frame) break; 
    gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1); 
    if(!color_frame) break;// If the frame does not exist, quit the loop 


    frameCount++; 
    if(frameCount==5) 
    { 
     cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY); 
     cvThreshold(gray_frame, gray_frame, thresh_frame, 255, CV_THRESH_BINARY); 
     cvErode(gray_frame, gray_frame, NULL, 1); 
     cvDilate(gray_frame, gray_frame, NULL, 1); 

     cvMoments(gray_frame, &moments, 1); 
     double m00; 
     m00 = cvGetCentralMoment(&moments, 0,0); 

     cvShowImage("walking", gray_frame); 
     frameCount=0; 
    } 
    char c = cvWaitKey(33); 
    if(c == 27) break; 
} 

double m00 = (double)cvGetCentralMoment(&moments, 0,0); 
cout << "Area - : " << m00 << endl; 
//area of lady walking = 39696. Therefore, using new threshold area as 30 for this video 
//area of walking man = 67929 

cvReleaseImage(&color_frame); 
cvReleaseImage(&gray_frame); 
cvReleaseCapture(&capture); 
cvDestroyWindow("walking"); 

return 0; 
} 

Я хотел бы, чтобы загрузить видео, которое я использую в коде, но я не знаю, как загрузить его здесь, так что если кто-нибудь может помочь мне с этим тоже. Я хочу предоставить как можно больше информации w.r.t. мой вопрос.

+2

На боковой ноте перерыв никогда не должен использоваться таким образом! используйте do {} во время и сделайте свои чеки там. –

+0

@MartinKristiansen Я новичок в openCV и C++, поэтому, как только код работал, я был доволен этим. что этот разрыв не приемлем для использования там? –

+0

делает блок управления менее прозрачным, выясняя, когда выйдет цикл while, на самом деле непонятно и будет намного понятнее, если код будет расти. –

ответ

1

Самый простой способ - найти самый большой кадр на изображении (контуры cvfind могут быть необходимой функцией), тогда вы установите blac все остальные капли (сканируйте все контуры и используя cvfloadfill). , наконец, вы сканируете весь бинарный образ, если рассматриваемый пиксель белый, вы ничего не делаете, если пиксель черный, вы установите на черный соответствующий пиксель 5-го кадра

+0

, поэтому мне не нужно было устанавливать библиотеку cvBlobLib? Изучая, как извлечь blob, я натолкнулся на упоминание об этом несколько раз, но ни руководство O'Reilly, ни справочное руководство openCV не имели ничего об этом, поэтому я немного сомневался в его использовании. Я бы предпочел ваш метод контуров вместо того, чтобы прибегать к этому cvBlobLib. Я действительно надеюсь, что это работает –

+1

Я не уверен в этом, но я думаю, что CvBlob был включен в Opencv в последних версиях. (все еще проверяйте) – andrea

Смежные вопросы