OpenCV中读取摄像头

    人脸识别首先要做的就是摄像头数据的读取,这里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;
}


 

你可能感兴趣的:(OpenCV中读取摄像头)