opencv从网络摄像头捕获图像,无需后期处理

时间:2013-08-01 12:10:17

标签: visual-c++ opencv image-comparison

我想从网络摄像头捕捉图像而不进行任何后期处理,即自动对焦,曝光校正,白平衡和其他内容。基本上我想从网络摄像头捕获连续帧,并使每个帧与前一个帧进行比较,并仅在有实际变化时将它们保存到磁盘。由于后期处理几乎每个帧都被返回为我不同。

到目前为止的

代码

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 个答案:

答案 0 :(得分:1)

我遇到了这个问题,找到和写的唯一解决方案是基于Direct-show的程序(如果你使用的是windows),所以根本没有opencv代码

答案 1 :(得分:0)

运气好的话,你可以得到相机的属性页面,然后切换到那里:

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

并请,跳过c-api,转而使用c ++。它很快就会消失。

忘了提及:你也可以从vlc更改cam-settings。

答案 2 :(得分:0)

@Prince,对不起我一直在寻找我没有找到它的Directshow代码,我认为它不会有用,因为我用它来制作DirectLink(黑魔法设计)卡,因为我从来没有这样做是非常困难的,我的建议是尝试使用GraphEditPlus: http://www.infognition.com/GraphEditPlus/

它有很多帮助,并且易于使用! 祝你好运!

答案 3 :(得分:0)

如果您只是希望在实际更改时捕获帧,请尝试使用背景减法算法。此外,不是仅仅减去后续帧,而是使用OpenCV中已经为您实现的众多算法中的一种 - 它们比闪电背景减法更能够应对闪电条件等变化。

在Python中:

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

Frame是从网络摄像头读取的图片流。 Google为Cpp中的相应功能。