【问题标题】:opencv capture image from webcam without post processingopencv从网络摄像头捕获图像而无需后处理
【发布时间】:2013-08-01 12:10:16
【问题描述】:

我想从网络摄像头捕捉图像而不进行任何后期处理,即NO自动对焦、曝光校正、白平衡等。好吧,基本上我想从网络摄像头捕获连续的帧,并让每一帧与前一帧进行比较,只有在发生实际变化时才将它们保存到磁盘。由于后期处理,几乎每一帧都以不同的方式返回给我。

到目前为止的代码

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;
}

虽然你在这样做,但如果你能建议使用另一个帧比较解决方案来解决这个问题,我会很高兴:)

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 你下面的人回答了这个特殊的问题。 .但我也对你的解决方案感兴趣。 . .我对此有点陌生,因此您拥有的任何代码 sn-p 或示例将不胜感激:)
    • 最后我最终使用了 aforge 的直接显示。 .所以我猜是迟到了:)
    【解决方案2】:

    如果运气好的话,您可以获得相机的属性页面,然后在此处关闭:

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

    请跳过 c-api 以支持 c++。它很快就会消失。

    忘了提一下:您也可以从 vlc 更改凸轮设置。

    【讨论】:

    • 但比较仍然一团糟。 .我想逐个像素的比较是行不通的:P。 . .有什么建议吗?
    【解决方案3】:

    @Prince,抱歉,我一直在寻找我的 Directshow 代码,但没有找到,我认为它不会有帮助,因为我将它用于 DirectLink(黑魔法设计)卡,因为我从来没有这样做之前很难,我的建议是尝试使用 GraphEditPlus : http://www.infognition.com/GraphEditPlus/

    它很有帮助,而且很容易使用! 祝你好运!

    【讨论】:

      【解决方案4】:

      如果您只想在实际发生变化时捕获帧,请尝试使用背景减法算法。此外,不仅仅是减去后续帧,还可以使用 OpenCV 中已经为您实现的众多算法之一——它们比普通背景减法更能适应闪电条件等的变化。

      在 Python 中:

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

      Frame 是从您的网络摄像头读取的图片流。 谷歌搜索Cpp中的对应函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-08-18
        • 1970-01-01
        • 2013-06-03
        • 2013-02-09
        • 2013-01-18
        • 1970-01-01
        相关资源
        最近更新 更多