2013-03-10 113 views
0

我正在做一個關於使用哈爾訓練的OpenCV中的對象檢測項目。我必須在圖像中標出物體存在的所有地方。所以,我需要一個打開每個圖像的代碼,以便我可以標記這些區域。 到一個和這裏差不多:哈爾訓練中的對象標記

#include <opencv/cv.h> 
#include <opencv/cvaux.h> 
#include <opencv/highgui.h> 

// for filelisting 
#include <stdio.h> 
#include <sys/io.h> 
// for fileoutput 
#include <string> 
#include <fstream> 
#include <sstream> 
#include <dirent.h> 
#include <sys/types.h> 

using namespace std; 

IplImage* image=0; 
IplImage* image2=0; 
//int start_roi=0; 
int roi_x0=0; 
int roi_y0=0; 
int roi_x1=0; 
int roi_y1=0; 
int numOfRec=0; 
int startDraw = 0; 
char* window_name="<SPACE>add <B>save and load next <ESC>exit"; 

string IntToString(int num) 
{ 
    ostringstream myStream; //creates an ostringstream object 
    myStream << num << flush; 
    /* 
    * outputs the number into the string stream and then flushes 
    * the buffer (makes sure the output is put into the stream) 
    */ 
    return(myStream.str()); //returns the string form of the stringstream object 
}; 

void on_mouse(int event,int x,int y,int flag, void *param) 
{ 
    if(event==CV_EVENT_LBUTTONDOWN) 
    { 
     if(!startDraw) 
     { 
      roi_x0=x; 
      roi_y0=y; 
      startDraw = 1; 
     } else { 
      roi_x1=x; 
      roi_y1=y; 
      startDraw = 0; 
     } 
    } 
    if(event==CV_EVENT_MOUSEMOVE && startDraw) 
    { 

     //redraw ROI selection 
     image2=cvCloneImage(image); 
     cvRectangle(image2,cvPoint(roi_x0,roi_y0),cvPoint(x,y),CV_RGB(255,0,255),1); 
     cvShowImage(window_name,image2); 
     cvReleaseImage(&image2); 
    } 

} 

int main(int argc, char** argv) 
{ 
    char iKey=0; 
    string strPrefix; 
    string strPostfix; 
    string input_directory; 
    string output_file; 

    if(argc != 3) { 
     fprintf(stderr, "%s output_info.txt raw/data/directory/\n", argv[0]); 
     return -1; 
    } 

    input_directory = argv[2]; 
    output_file = argv[1]; 

    /* Get a file listing of all files with in the input directory */ 
    DIR *dir_p = opendir (input_directory.c_str()); 
    struct dirent *dir_entry_p; 

    if(dir_p == NULL) { 
     fprintf(stderr, "Failed to open directory %s\n", input_directory.c_str()); 
     return -1; 
    } 

    fprintf(stderr, "Object Marker: Input Directory: %s Output File: %s\n", input_directory.c_str(), output_file.c_str()); 

    // init highgui 
    cvAddSearchPath(input_directory); 
    cvNamedWindow(window_name,1); 
    cvSetMouseCallback(window_name,on_mouse, NULL); 

    fprintf(stderr, "Opening directory..."); 
    // init output of rectangles to the info file 
    ofstream output(output_file.c_str()); 
    fprintf(stderr, "done.\n"); 

    while((dir_entry_p = readdir(dir_p)) != NULL) 
    { 
     numOfRec=0; 

     if(strcmp(dir_entry_p->d_name, "")) 
     fprintf(stderr, "Examining file %s\n", dir_entry_p->d_name); 

     /* TODO: Assign postfix/prefix info */ 
     strPostfix=""; 
     //strPrefix=input_directory; 
     strPrefix=dir_entry_p->d_name; 
     //strPrefix+=bmp_file.name; 
     fprintf(stderr, "Loading image %s\n", strPrefix.c_str()); 

     if((image=cvLoadImage(strPrefix.c_str(),1)) != 0) 
     { 

      // work on current image 
      do 

    { 
       cvShowImage(window_name,image); 

       // used cvWaitKey returns: 
       // <B>=66  save added rectangles and show next image 
       // <ESC>=27  exit program 
       // <Space>=32  add rectangle to current image 
       // any other key clears rectangle drawing only 
       iKey=cvWaitKey(0); 
       switch(iKey) 
       { 

       case 27: 

         cvReleaseImage(&image); 
         cvDestroyWindow(window_name); 
         return 0; 
       case 32: 

         numOfRec++; 
       printf(" %d. rect x=%d\ty=%d\tx2h=%d\ty2=%d\n",numOfRec,roi_x0,roi_y0,roi_x1,roi_y1); 
       //printf(" %d. rect x=%d\ty=%d\twidth=%d\theight=%d\n",numOfRec,roi_x1,roi_y1,roi_x0-roi_x1,roi_y0-roi_y1); 
         // currently two draw directions possible: 
         //  from top left to bottom right or vice versa 
         if(roi_x0<roi_x1 && roi_y0<roi_y1) 
         { 

          printf(" %d. rect x=%d\ty=%d\twidth=%d\theight=%d\n",numOfRec,roi_x0,roi_y0,roi_x1-roi_x0,roi_y1-roi_y0); 
          // append rectangle coord to previous line content 
          strPostfix+=" "+IntToString(roi_x0)+" "+IntToString(roi_y0)+" "+IntToString(roi_x1-roi_x0)+" "+IntToString(roi_y1-roi_y0); 

         } 
         else 
                //(roi_x0>roi_x1 && roi_y0>roi_y1) 
         { 
          printf(" hello line no 154\n"); 
          printf(" %d. rect x=%d\ty=%d\twidth=%d\theight=%d\n",numOfRec,roi_x1,roi_y1,roi_x0-roi_x1,roi_y0-roi_y1); 
          // append rectangle coord to previous line content 
          strPostfix+=" "+IntToString(roi_x1)+" "+IntToString(roi_y1)+" "+IntToString(roi_x0-roi_x1)+" "+IntToString  (roi_y0-roi_y1); 
     } 

         break; 
       } 
      } 
      while(iKey!=66); 

      { 
      // save to info file as later used for HaarTraining: 
      // <rel_path>\bmp_file.name numOfRec x0 y0 width0 height0 x1 y1 width1 height1... 
      if(numOfRec>0 && iKey==66) 
      { 
       //append line 
       /* TODO: Store output information. */ 
       output << strPrefix << " "<< numOfRec << strPostfix <<"\n"; 

      cvReleaseImage(&image); 
      } 

     else 
     { 
      fprintf(stderr, "Failed to load image, %s\n", strPrefix.c_str()); 
     } 
    } 

    }} 

    output.close(); 
    cvDestroyWindow(window_name); 
    closedir(dir_p); 

    return 0; 
} 

我使用Visual Studio 10 當我運行上面的代碼是打開命令窗口加載所有圖片跑到上面的代碼(新命名的窗口也越來越打開但得到,但它不留我選擇區域),然後關閉。

當我運行它使用開始沒有VS10調試選項它是我能看到這一點:

Examining file img (6).jpeg 
Loading image img (6).jpeg 
Examining file img (6).JPG 
Loading image img (6).JPG 
Examining file img (7).jpeg 
Loading image img (7).jpeg 
Examining file img (7).jpg 
Loading image img (7).jpg 
Examining file img (8).jpeg 
Loading image img (8).jpeg 
Examining file img (8).jpg 
Loading image img (8).jpg 
Examining file img (9).jpeg 
Loading image img (9).jpeg 
Examining file img (9).jpg 
Loading image img (9).jpg 
Examining file img 1.jpeg 
Loading image img 1.jpeg 

對象標記器失敗,無法加載圖像

我認爲這是跳繩的:代碼

if((image=cvLoadImage(strPrefix.c_str(),1)) != 0){.....} 

部分

+0

什麼是錯誤?嘗試更具體,併發布你已經嘗試過。 – sfotiadis 2013-03-10 21:26:43

+0

@kabamaru我更新了它。請看看它 – 2013-03-11 06:26:50

回答

0

Haar training目前很少有可用的物體標記工具。我使用link中的工具。它完美地爲我工作。如果你想建立你自己的工具,請按照this教程。我認爲在Haar training的任何方式,開發工具捕獲座標是浪費時間,因爲目前有這些工具可用,它不是Haar training的主要目標。由於Haar training需要更多時間來訓練和創建級聯XML文件。所以最好把重點放在培訓上。