2017-06-24 2 views
0

Ich versuche, opencv imshow mit waitKey(30) == 27 geschlossen, aber ich weiß nicht, warum es nicht so tun. Es sollte geschlossen werden, wenn ich auf esc Taste auf der Tastatur drücken. Verpasse ich da etwas?OpenCV scheitert, imshow zu schließen, obwohl waitKey deklariert wurde

Dies ist meine Schleife in main Funktion:

while (1) 
{ 
    frame = cam1.captureImg(); 
    number_of_changes=cam1.detectMotion(); 

    if(number_of_changes>=there_is_motion) 
    { 
     cout<<"Motion detected!!"<<endl; 
     frameSequence++; 

     if(frameSequence > lengthThreshold) 
     { 
      saveImg = 1; 
     } 
    } 
    else 
    { 
     frameSequence=0; 
    } 

    if (saveImg == 1) 
    { 
     saveImg = 0; 

     frameSequence=0; 
     cout<<"saving Img"<<endl; 
     cam1.saveImg(frame);   
    } 

    if (waitKey(30) == 27) 
    { 
     cap.release(); 
     destroyAllWindows(); 
     cout<<"turning off"<<endl; 
     break; 
    } 

} 

Dies ist die Funktion detectMotion benannt ist, die enthalten imshow:

int detectMotion (void) 
{ 
    Scalar mean, stddev; 
    meanStdDev(motion,mean,stddev); 

     if(stddev[0] < max_deviation) 
    { 
     number_of_changes = 0; 
     min_x = motion.cols, max_x=0; 
     min_y = motion.rows, max_y=0; 

     for(int j=y_start; j < y_stop; j+=2) {  
      for(int i=x_start; i < x_stop; i+=2) { 

       if(static_cast<int>(motion.at<uchar>(j,i)) == 255) 
       { 
        number_of_changes++; 
        if(min_x>i) min_x = i; 
        if(max_x<i) max_x = i; 
        if(min_y>j) min_y = j; 
        if(max_y<j) max_y = j; 
       } 
      } 
     } 
     if(number_of_changes) 
     { 

      if(min_x-10 > 0) min_x -= 10; 
      if(min_y-10 > 0) min_y -= 10; 
      if(max_x+10 < matriximage.cols-1) max_x += 10; 
      if(max_y+10 < matriximage.rows-1) max_y += 10; 

      Point x(min_x,min_y); 
      Point y(max_x,max_y); 
      Rect rect(x,y); 
      rectangle(result,rect,Scalar(0,255,255),1,4); 
      imshow("Motion Indicator", result); 
     } 
     return number_of_changes; 
    }  

    return 0; 

} 

Hier ist captureImg Funktion, die auch imshow enthalten:

Mat captureImg(void) 
{ 

     cap>>matriximage; 
     result=matriximage; 
     cvtColor(matriximage,matriximage,CV_RGB2GRAY); //grayscale 

     // Calculate differences between 3 consecutive frames... 
     diffImg(prev_mframe, current_mframe, next_mframe); 
     imshow("Motion Indicator", result);  // Display the current frame... 

     //rellocate image in right order 
     current_mframe.copyTo(prev_mframe); 
     next_mframe.copyTo(current_mframe); 
     matriximage.copyTo(next_mframe); 

     motion = diffImg(prev_mframe, current_mframe, next_mframe); 
     return result; 
} 

Antwort

0

Ändern Sie in Ihrer Hauptfunktion die Prüfung wie folgt:

int ch = waitKey(); //or waitKey(0) 
if (ch == 27) 
{ 
    cap.release(); 
    destroyAllWindows(); 
    cout<<"turning off"<<endl; 
    break; 
} 
Verwandte Themen