人脸识别首先要做的就是摄像头数据的读取,这里OpenCV很好的实现了摄像头数据的读取。
在OpenCV1.x中用到的函数是:
1、打开摄像头或视频文件
CvCapture* cvCreateCameraCapture(int index); //index 摄像头的设备号, 只有一个摄像头时,用0就好了
CvCapture* cvCreateFileCapture(const char* filename); //读取视频文件
而在后面的版本变成了:
CvCapture* cvCaptureFromCam(int index); // 从摄像头的视频流分配和初始化CvCapture结构。
CvCapture* cvCaptureFromFile(const char* filename);
对应的释放函数是:
void cvReleaseCapture(CvCapture** capture);
2、读视频
int cvGrabFrame(CvCapture* capture);
该函数从摄像头或视频文件抓取帧,但是存放在内存里,可能是压缩的格式。
IplImage* cvRetrieveFrame(CvCapture* capture);
该函数返回由函数cvGrabFrame抓取的图像的指针。
IplImage* cvQueryFrame( CvCapture* capture ); //从摄像头或者文件中抓取并返回一帧
该函数从摄像头或者文件中抓取并返回一帧,然后解压并返回这一帧,它是cvGrabFrame和cvRetrieveFrame函数在一起的组合。返回的图像不可被用户释放或者修改。
c++中用的是videocapture这个类实现的这些函数
class CV_EXPORTS_W VideoCapture { public: CV_WRAP VideoCapture(); CV_WRAP VideoCapture(const string& filename); CV_WRAP VideoCapture(int device); virtual ~VideoCapture(); CV_WRAP virtual bool open(const string& filename); CV_WRAP virtual bool open(int device); CV_WRAP virtual bool isOpened() const; CV_WRAP virtual void release(); CV_WRAP virtual bool grab(); CV_WRAP virtual bool retrieve(CV_OUT Mat& image, int channel=0); virtual VideoCapture& operator >> (CV_OUT Mat& image); CV_WRAP virtual bool read(CV_OUT Mat& image); CV_WRAP virtual bool set(int propId, double value); CV_WRAP virtual double get(int propId); protected: Ptr<CvCapture> cap; };
这些函数很好的实现了视频的读取。这是实现的一个简单的例子。
int main(int, char**) { VideoCapture cap(0); // open the default camera if(!cap.isOpened()) // check if we succeeded return -1; Mat edges; namedWindow("edges",1); for(;;) { Mat frame; cap >> frame; // get a new frame from camera cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waitKey(30) >= 0)
break; } // the camera will be deinitialized automatically in VideoCapture destructor return 0; }