#include "stdio.h"
#include "cv.h"
#include "highgui.h"
using namespace cv;
/*IplImage类型*/
void OpenCamera1(){
/*读取摄像头
*cvCreateCameraCapture和cvCaptureFromCAM都有初始化从摄像头中获取视频的功能
*参数设置为0,打开电脑自带的摄像头;参数设置为1,打开外置的USB摄像头
*/
CvCapture* capture = NULL;
//创建一个来自摄像头的capture
capture = cvCreateCameraCapture(0);
//capture = cvCaptureFromCAM(0);
IplImage* frame;
cvNamedWindow("Show1");
while(1){
//从capture中读取下一帧画面,在while循环中不断调用这一句,就能不断得到新画面
frame = cvQueryFrame(capture);
if(!frame) break;
cvShowImage("Show1",frame);
/*cvWaitkey(int delay)函数
*当delay小于等于0的时候,
*如果没有键盘触发,则一直等待,此时的返回值为-1,否则返回值为键盘按下的码字;
*当delay大于0时,
*如果没有键盘的的触发,则等待delay的时间,此时的返回值是-1,否则返回值为键盘按下的码字。
*/
char c = cvWaitKey(50);//等待用户按下Esc键50ms
if(c==27) break;//如果按下Esc键,退出循环
}
cvReleaseCapture(&capture);
cvDestroyWindow("Show1");
}
/*Mat类型*/
int OpenCamera2(){
//VideoCapture类的构造函数
VideoCapture capture(0);//参数为0,表示打开默认摄像头
if(!capture.isOpened())//检测摄像头是否正常打开
return -1;
namedWindow("Show2");
Mat frame;
while(1){
capture>>frame;//从摄像头获取当前一帧图像
if(frame.empty()) break;
imshow("Show2",frame);
if(waitKey(50)>=0) break;
}
//摄像头会在VideoCapture的析构函数中释放
return 0;
}
int main(){
OpenCamera1();
//OpenCamera2();
return 0;
}
由于课程设计需求,要打开电脑上的摄像头,对获取的图像进行处理。在网上找了很多打开摄像头的代码,方法很多,现总结两种方法。其实只是因为图片的格式有差别,导致方法上有些略微的差别。代码如上所示,注释比较齐全。
这里总结一些IplImage与Mat的知识。IplImage是表示一个图像的结构体,通过cvCreateImage创建内存图像数据,创建后复制像素到创建的内存,结束之后通过cvReleaseImage等函数释放掉内存。Mat类型可以通过构造函数Mat直接创建,比较方便。
参考博客:http://blog.csdn.net/chinabinlang/article/details/40982065
运行结果: