2011-01-31 4 views
0

비디오 프레임에서 전경을 추출하는 데 문제가 있습니다. 일부 백그라운드 오브젝트도 추출합니다. 샘플 비디오에서 스냅 샷을 찍어 배경 이미지로 사용합니다. 수행해야 할 작업을 알려줍니다. 비디오에서 스냅 샷을 찍는 대신 백그라운드 이미지로 촬영할 별도의 이미지 스냅 샷은 추출에 사용되는 이미지보다 해상도가 낮은) 또는 다른 더 나은 code.The 코드이며, 가정은opencv C++ 및 MS VS2010을 사용하는 전경 추출의 문제점

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    IplImage *frame = NULL; 
    IplImage *img1 = NULL; 

    IplImage *grey = NULL; 
    IplImage *edges = NULL; 
     int delay = 0, key=0, i=0; 
    CvCapture *video = NULL; 
    CvCapture *video1 = NULL; 

     cvNamedWindow("window_name"); 

     video = cvCreateFileCapture("sample.avi"); 
     video1 = cvCreateFileCapture("sample.avi"); 


    frame = cvQueryFrame(video); 
    img1 = cvQueryFrame(video1); 
     grey = cvCreateImage(cvGetSize(frame), IPL_DEPTH_8U, 1); 
     edges = cvCreateImage(cvGetSize(img1), IPL_DEPTH_8U, 1); 

    cvShowImage("backgrnd", img1); 

//get height and width using OpenCV functions 
const int &rows = img1->width; 
const int &cols =frame->height; 
    BYTE *Pixel2=0; 
    cvGetRawData(img1,&Pixel2,0,0); 
     while (frame) { 


BYTE *Pixel1=0; 
//extract pixels using the OpenCV function cvGetRawData 

cvGetRawData(frame,&Pixel1,0,0); 

//register int to increase the speed 
register int r,ri,c; 

//to find diffrence of 2 images by pixel to pixel comparision 
for(r = 0, ri = 0; r < rows*3; r++, ri += cols) 
{ 
    for(c = 0; c < cols; c++) 
     { 
      //get the difference in pixels 
      Pixel1[ri + c] = Pixel1[ri + c] - Pixel2[ri + c]; 

      //set threshold value as 100 for comparision, it can be changed to values between 50 and 200, for getting binary image 
      if(Pixel1[ri + c] < 150) 
       { 
        Pixel1[ri + c]=0; 
       } 
      else 
        Pixel1[ri + c]=255; 

     }//for c 

}//for r, ri 
Return 0; 
} 
+0

코드 작성/들여 쓰기 자세한 내용 –

+0

입력 및 출력 스크린 샷을 게시 할 수 있습니까? 코드가 기대하는 바를 상상하기 란 어렵습니다. –

답변

0

전경/배경 분할이 깊고 어려운 문제입니다. 자신에게 묻는 가장 중요한 첫 번째 것은 "배경과 대비되는 전경의 정의는 무엇입니까?" 시간 경과에 따라 배경이 크게 변경되어 전경/배경 분할이 특히 어려울 수 있습니다. 당신의 대답에 따라, 꽤 잘 작동하는 다양한 방법이 있습니다. 일부는 본질적으로 통계적이며 주어진 픽셀의 색상에 대한 확률 분포를 다루거나 이미지에서 추출한 피쳐를 처리합니다. 일부는 비디오의 피쳐를 추적하고 다양한 이동 피쳐의 역학을 기반으로 이미지를 분할하려고 시도합니다. 또 다른 요소는 Principal Component Analysis의 변형을 기반으로보다 자연스럽게 대수적입니다. 거기에 좋은 알고리즘의 엄청난 숫자가 있으며, 아무도 요즘 프레임 differencing을 사용하고 있습니다.

OpenCV을 사용중인 경우 프레스를 새로 잡고 OpenCV2.2을 보유 할 것을 적극 권장합니다. video 모듈의 OpenCV2.2에는 전경/배경 세분화를위한 몇 가지 유용한 도구가 있습니다. 코드의 문서는 다양한 알고리즘의 배경 이론을 설명하는 참고 문헌 및 논문을 가리킨다.

행운을 빕니다!