2013-11-25 16 views
0

我使用這段代碼檢測運動並將圖片名稱與系統時間一起保存,如2013-11-26_01:20,但每秒只能顯示1張圖片。我想拍多張照片的名字,如2013-11-26_01:20-1,2013-11-26_01:20-2 ... 2013-11-26_01:21-1,2013-11-26_01:22-2。每秒捕捉多張圖片,並且名稱使用時間和幀號

bool saveImg(Mat image, const string DIRECTORY, const string EXTENSION, const char * DIR_FORMAT, const char * FILE_FORMAT){ 

stringstream ss; 
time_t seconds; 
struct tm * timeinfo; 
char TIME[80]; 

time (&seconds); 
timeinfo = localtime (&seconds); 

// convert dir... 
strftime (TIME,80,DIR_FORMAT,timeinfo); 
ss.str(""); 
ss << DIRECTORY << TIME; 

if(!directoryExists(ss.str().c_str())) 
    mkdir(ss.str().c_str(), 0777); 

// convert image name 
strftime (TIME,80,FILE_FORMAT,timeinfo); 
ss.str(""); 
ss << DIRECTORY << TIME << EXTENSION; 

// save image 
return imwrite(ss.str().c_str(), image); 
} 

int main (int argc, char * const argv[]) { 

// const 
const string DIR = "/home/balice/Desktop/"; 
const string EXT = ".jpg"; 
const int DELAY = 100; // mseconds 

string DIR_FORMAT = "%d-%m-%Y"; 
string FILE_FORMAT = DIR_FORMAT + "/" + "%d-%m-%Y_%H:%M:%S"; 

// create all necessary instances 
CvCapture * camera = cvCaptureFromCAM(CV_CAP_ANY); 
Mat original = cvQueryFrame(camera); 
Mat next_frame = original; 
Mat current_frame = cvQueryFrame(camera); 
Mat prev_frame = cvQueryFrame(camera); 

cvtColor(current_frame, current_frame, CV_RGB2GRAY); 
cvtColor(prev_frame, prev_frame, CV_RGB2GRAY); 
cvtColor(next_frame, next_frame, CV_RGB2GRAY); 

Mat d1, d2, result; 
int window = 200; 
bool movement; 
while (true){  
    movement = false; 
    absdiff(next_frame, current_frame, d1); 
    absdiff(current_frame, prev_frame, d2); 
    bitwise_xor(d1, d2, result); 

    int middle_y = result.rows/2; 
    int middle_x = result.cols/2; 

    // Center window 
    threshold(result, result, 140, 255, CV_THRESH_BINARY); 
    for(int i = middle_x-window; i < middle_x+window; i++) 
     for(int j = middle_y-window; j < middle_y+window; j++) 
      if(result.at<int>(j,i)>0) 
      { 
       movement = true; 
       break; 
      } 

    if(movement==true) 
     saveImg(original,DIR,EXT,DIR_FORMAT.c_str(),FILE_FORMAT.c_str()); 

    imshow("Motion", result); 

    prev_frame = current_frame; 
    current_frame = next_frame; 

    // get image from webcam 
    next_frame = cvQueryFrame(camera); 
    cvtColor(next_frame, next_frame, CV_RGB2GRAY); 
     break; 
    }  
return 0; 
} 

回答

0

你的問題是文件名限制。在同一秒拍攝的所有圖像都具有相同的文件名。作爲解決方案,我可以建議使用毫秒,或者在映像寫入磁盤後添加一些計數器遞增,並重新設置每個新的秒。您需要將此計數器值添加到文件名。