天天看點

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調取圖檔與攝像頭(灰屏問題解決)

繼續閱讀