天天看点

Opencv调取图片与摄像头(灰屏问题解决)

笔者用的是VS2010 + OpenCV3.0beta

一开始我参考的是Augusdi的博文:http://blog.csdn.net/augusdi/article/details/8762961

他的代码如下:

#include "stdafx.h"

#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
 
int main( int argc, char** argv )
{
  //声明IplImage指针
  IplImage* pFrame = NULL;

 //获取摄像头
  CvCapture* pCapture = cvCreateCameraCapture(-1);
 
  //创建窗口
  cvNamedWindow("video", 1);
 
  //显示视屏
  while(1)
  {
      pFrame=cvQueryFrame( pCapture );
      if(!pFrame)break;
      cvShowImage("video",pFrame);
      char c=cvWaitKey(33);
      if(c==27)break;
  }
  cvReleaseCapture(&pCapture);
  cvDestroyWindow("video");
} 
           

在VS2010中,stdafx.h这个头文件在预编译头文件中,因此可以注释掉第一行。之后代码不会报错,运行程序时内置摄像头的绿灯也会亮,但是却捕捉不到内置摄像头的图像。如下图所示:

Opencv调取图片与摄像头(灰屏问题解决)
Opencv调取图片与摄像头(灰屏问题解决)

如果尝试调用USB摄像头,会直接在if(!pFrame)break;处跳出,也就是捕获不到USB摄像头的图像。

出现这种问题,很可能是版本更新导致的。但是为什么没有报错呢?笔者也不清楚。

因此我尝试换一种方法来获取图像。参考IDMer的博文http://blog.csdn.net/idmer/article/details/47251531,编写代码如下。先显示名为1.jpg的图片,按esc退出后,捕获usb摄像头进行实时显示,按ESC退出。

#include "opencv2/opencv.hpp"
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char** argv) 
{

显示图像
Mat image;
    image = imread("1.jpg");
       imshow("image", image);
	  while(1)
  {
      char c=cvWaitKey(33);
      if(c==27)break;		//等待按键ESC
  }
捕获摄像头
 //获取摄像头
VideoCapture capture(1);//0或-1表示笔记本内置摄像头

Mat frame;
  while(1)
  {
		capture  >> frame;
		imshow("读取视频", frame);
      char c=cvWaitKey(33);
      if(c==27)break;		//等待按键ESC
  }

return 0;
}
           

运行结果如下:

显示图片:

Opencv调取图片与摄像头(灰屏问题解决)
Opencv调取图片与摄像头(灰屏问题解决)

显示视频:

Opencv调取图片与摄像头(灰屏问题解决)
Opencv调取图片与摄像头(灰屏问题解决)

继续阅读