筆者用的是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這個頭檔案在預編譯頭檔案中,是以可以注釋掉第一行。之後代碼不會報錯,運作程式時内置攝像頭的綠燈也會亮,但是卻捕捉不到内置攝像頭的圖像。如下圖所示:
如果嘗試調用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;
}
運作結果如下:
顯示圖檔:
顯示視訊: