笔者用的是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;
}
运行结果如下:
显示图片:
显示视频: