opencv自学之旅 视频读取,摄像头读取

来源:互联网 发布:省市区县json 编辑:程序博客网 时间:2024/06/10 01:40

opencv 可以很方便的读取摄像头,他有一个CvCapture结构体,可以用来操作摄像头。
首先我们先了解下这个结构体。
1.读取视频文件
cvCreateFileCapture(“文件路径”); 返回指针 CvCapture类型。
这个函数是读取一个视频文件,他的返回类似是 CvCapture 类型。读取的时候是一帧一帧的读取,如果返回值类型 空,那么安装解码器(解码器就是看你电脑能不能正确的把各种文件格式的视频解析, 不然 avi格式,mp4格式等等), 或者 看路径对不对。

1.1获取一帧数据
cvQueryFrame(capture);
输入一个CVCapture 类型的指针,该函数主要功能是将视频下一个帧加载到内存,与cvLoadImage 不同,该函数不重新分配内存。

1.2
cvReleaseCapture()
释放视频空间镇。

那么来看看一个都去视频的源码

int main(){       CvCapture *capture = cvCreateFileCapture("1.mp4");       IplImage *frame = nullptr;       cvNamedWindow("mp4", 1);       while (1)       {             frame = cvQueryFrame(capture);             if (!frame)             {                    break;             }             cvShowImage("mp4", frame);             char c = cvWaitKey(1);             if (c == 27)             {                    break;             }       }       cvReleaseCapture(&capture);       cvDestroyWindow("mp4");       return 0;}

这个就是读取一个mp4格式的视频,然后显示出来。 这个 cvWaitKey() 可以控制播放的速度。

2读取视像头操作

读摄像头

cvCreateCameraCapture(int id)
这个函数是读取摄像头操作, 里面的id 代表你电脑连接的外设摄像头id。

#include <opencv2\opencv.hpp>using namespace cv;using namespace std;int main(){    VideoCapture cap(0);    cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920); //设置分辨率    cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);    CvVideoWriter* video = NULL;    IplImage* frame = NULL;     if (!cap.isOpened()) //如果不能打开摄像头给出警告    {        cout << "Can not open the camera." << endl;        return -1;    }    else    {        cap.read(imgOriginal); //首先取得摄像头中的一帧        if (video) //如果能创建CvVideoWriter对象则表明成功        {            cout << "VideoWriter has created." << endl;        }        cvNamedWindow("Camera Video", 1); //新建一个窗口        while (1)        {            bool bSuccess = cap.read(imgOriginal);            if (!bSuccess) //if not success, break loop             {                cout << "Cannot read a frame from video stream" << endl;                break;            }            frame = &IplImage(imgOriginal);            if (!frame)            {                cout << "Can not get frame from the capture." << endl;                break;            }            cvShowImage("Camera Video", frame); //显示视频内容的图片            if (cvWaitKey(1) > 0) break; //有其他键盘响应,则退出        }        cvReleaseVideoWriter(&video);               cvDestroyWindow("Camera Video");    }    return 0;}

其实原理和读取视频一样, 都是一帧帧的获取,然后显示。

0 0
原创粉丝点击