2013-03-24 98 views
1

我是圖像處理的初學者,剛剛開始擺弄OpenCV的項目。我有行人walking.I的視頻信號正在運行的程序pedestrain.cpp確實whic第bckgound subtrction uing HOG和想要做的事,如圖像連接enter image description here。我已經做了以下檢測Opencv和圖像處理:提取身體框架的輪廓

int main (int argc, const char * argv[]) 
{ 
    VideoCapture cap(0); 
    cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); 
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240);  
    if (!cap.isOpened()) 
     return -1; 

    Mat img; 
    HOGDescriptor hog; 
    hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); 
    if((WriteFP=fopen("output.txt", "w")) == NULL) ErrorExit(ER_WRITE_OPEN); 


    namedWindow("video capture", CV_WINDOW_AUTOSIZE); 
    namedWindow("Motion", CV_WINDOW_AUTOSIZE); 


    while (true) 
    { 
     cap >> img; 
     if (!img.data) 
      continue; 

     vector<Rect> found, found_filtered; 
     hog.detectMultiScale(img, found, 0, Size(8,8), Size(32,32), 1.05, 2); 

     size_t i, j; 
     for (i=0; i<found.size(); i++) 
     { 
      Rect r = found[i]; 
      for (j=0; j<found.size(); j++) 
       if (j!=i && (r & found[j])==r) 
        break; 
      if (j==found.size()) 
       found_filtered.push_back(r); 
     } 
     for (i=0; i<found_filtered.size(); i++) 
     { 
     Rect r = found_filtered[i]; 
      r.x += cvRound(r.width*0.1); 
     r.width = cvRound(r.width*0.8); 
     r.y += cvRound(r.height*0.06); 
     r.height = cvRound(r.height*0.9); 
     rectangle(img, r.tl(), r.br(), cv::Scalar(0,255,0), 2); 
     } 
     imshow("video capture", img); 
     IplImage *mat_img; 

     mat_img=cvCloneImage(&(IplImage)img); 
     cvThreshold(img,img, 0, 255, CV_THRESH_BINARY_INV); 
    cvDilate(img, img, 0,1); 
    cvErode(img, img, 0, 0); 
    cvFindContours(img, storage_contours, &contours, sizeof(CvContour), 
    CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0)); 
} 
的peson後

但是,我無法得到像圖片中的輸出幀。可以有人告訴我需要做什麼。謝謝

+0

請勿將HoG(梯度直方圖)人物檢測器與背景建模/背景消除技術混合使用。從人物檢測器中獲得一個邊界框,從背景建模方法中,您可以獲得前景物體的陰影。 – 2013-03-29 00:10:40

+0

謝謝。我嘗試過背景減法,但無法得到像圖片中那樣的輪廓。您可以發佈代碼或者可以鏈接到我可以獲得輪廓的鏈接。 – user1142671 2013-03-30 04:51:05

+0

你能解釋一下,你的輸入數據是什麼或者你確切的問題是什麼?您是否擁有行人的RGB視頻,並且需要前景/ Shilouhette面具?或者您是否搜索了一種提取shilouhette的方法,並且您輸入的視頻是前景掩碼,如您所示。 – 2013-03-30 13:17:48

回答

0

Change Detection Benchmark你會發現最先進的背景建模方法和實現的概述。

OpenCV提供BackgroundSubtractorMOG類用於背景建模和前景減法。

大多數方法訓練背景顏色的像素統計量,如果像素顏色不屬於背景統計量,則決定像素是前景還是背景。因此這些方法需要一組訓練樣本(圖像)來學習背景。您還應該提到,背景和前景物體的相似顏色可能會引入前景蒙版中的孔,因爲算法只能通過顏色區分這兩個類。

+0

謝謝您的回覆。我還是不明白如何提及閾值。我剛剛實現了OpenCV資源中的peopledetect.cpp程序。程序在檢測到的人體周圍繪製邊界框。我相信對於邊界框的大小有一組固定的參數。所以,我想知道你提到的背景減法技術以及如何去做。實際上,我幾乎沒有任何有關圖像處理的知識,我只是爲了一個小的項目需求而深入研究它。 – user1142671 2013-04-16 16:43:31