OpenCV захват изображения с веб-камеры без пост-обработки

Я хочу снимать изображения с веб-камеры без какой-либо последующей обработки, то есть НЕТ автофокуса, коррекции экспозиции, баланса белого и прочего. В принципе, я хочу захватывать непрерывные кадры с веб-камеры, сравнивать каждый кадр с предыдущим и сохранять их на диск только при наличии реальных изменений. Из-за пост-обработки для меня возвращается почти каждый кадр как отдельный.

код до сих пор

using namespace cv;



bool identical(cv::Mat m1, cv::Mat m2)
{


if ( m1.cols != m2.cols || m1.rows != m2.rows || m1.channels() != m2.channels() || m1.type() != m2.type() )
{
  return false;
}

for ( int i = 0; i < m1.rows; i++ )
{
  for ( int j = 0; j < m1.cols; j++ )
    {
      if (  m1.at<Vec3b>(i, j) != m2.at<Vec3b>(i, j) )
        {
          return false;
        }
    }
}
return true;
}


 int main() {
 CvCapture* capture = cvCaptureFromCAM( 1);
 int i=0,firsttime=0;
 char filename[40];
 Mat img1,img2;
 if ( !capture ) {
 fprintf( stderr, "ERROR: capture is NULL \n" );
 getchar();
 return -1;
 }

 cvNamedWindow( "img1", CV_WINDOW_AUTOSIZE );
  cvNamedWindow( "img2", CV_WINDOW_AUTOSIZE );

  while ( 1 ) {

 IplImage* frame = cvQueryFrame( capture );
 img1=frame;
 if ( !frame ) {

   fprintf( stderr, "ERROR: frame is null...\n" );
   getchar();
   break;
 }
 if(firsttime==0){
 img2=frame;
 fprintf( stderr, "firtstime\n" );
 } 

 if ( (cvWaitKey(10) & 255) == 27 ) break;

 i++;

 sprintf(filename, "D:\\testimg\\img%d.jpg", i);


 cv::cvtColor(img1, img1, CV_BGR2GRAY);
 imshow( "img1", img1);
 imshow( "img2", img2);
 imwrite(filename,img1);

 if(identical(img1,img2))
 {
    //write to diff path
 }


 img2=imread(filename,1);
 firsttime=1;
}
 // Release the capture device housekeeping
 cvReleaseCapture( &capture );
 return 0;
}

Пока я делаю это, я буду очень рад, если вы можете предложить обходной путь для этого, используя другое решение сравнения кадров, а также:)

4 ответа

Решение

Если повезет, вы можете получить страницу свойств вашей камеры и отключить ее:

VideoCapture cap(0);
cap.set(CV_CAP_PROP_SETTINGS,1);

и, пожалуйста, пропустите c-api в пользу C++. это скоро уйдет.

забыл упомянуть: вы также изменили настройки камеры с vlc.

У меня была эта проблема, и единственным решением, которое было найдено и написано, была программа, основанная на Direct-show (в случае, если вы используете windows), поэтому вообще не было кода opencv

Если вы просто хотите захватывать кадры, когда есть реальное изменение, попробуйте алгоритмы вычитания фона. Кроме того, вместо того, чтобы просто вычитать последующие кадры, используйте один из многих алгоритмов, уже реализованных для вас в OpenCV, - они гораздо более устойчивы к изменениям условий молнии и т. Д., Чем ванильное вычитание фона.

В Python:

backsub = cv2.BackgroundSubtractorMOG2(history=10000,varThreshold=100)
fgmask = backsub.apply(frame, None, 0.01)

Frame поток фотографий, прочитанных с вашей веб-камеры Google для соответствующей функции в Cpp.

@Prince, извините, я искал свой код Directshow, я его не нашел, и я не думаю, что он поможет, потому что я использовал его для карты DirectLink (Black magic Design), так как я никогда не делал этого раньше это было довольно сложно, мое предложение будет попытаться использовать GraphEditPlus: http://www.infognition.com/GraphEditPlus/

это очень помогает, и это легко в использовании! удачи!

Другие вопросы по тегам