opencv学习笔记(三)-读取视频与摄像头

下面是一个播放AVI视频的一个程序
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include "highgui.h"

int main()
{
    cvNamedWindow("Example2", 0);
    /*读视频文件*/
    CvCapture* capture = cvCreateFileCapture("F:\\Work\\opencv\\2-Playmove\\Debug\\1.avi");

    IplImage * frame;
    while (1)
    {
        frame = cvQueryFrame(capture);

        if (!frame) break;
        //如果frame加载为空则退出播放
        cvShowImage("Example2", frame);

        char c = cvWaitKey(33);
        if (c == 27) break;     //27对应的是esc的ASCLL码的值

    }

    cvReleaseCapture(&capture);
    cvDestroyWindow("Example2");
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

下面解释一下重点语句:

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

CvCapture* cvcapture = cvCreateFileCapture("F:\\Work\\opencv\\2-Playmove\\Debug\\1.avi");

这句的意思是与之前显示图像的语句:

IplImage* img = cvLoadImage("C:\\Users\\SARS\\Pictures\\社会实践\\7dc9a993gx6BCgOUQC96d&690.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);

意思相近,都是将文件加载进一个结构体指针中。
在这里值得注意的是:如果cvCreateFileCapture返回为空的原因可能是:在写读视频的程序的时候没装解码器
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

frame = cvQueryFrame(capture);

这句话的意思是将下一帧视频文件载入内存(实际是填充或者更新CvCapture结构中),返回一个对应当前帧的指针,这个函数与cvLoadImage()函数不同的是 cvQueryFrame不分配,使用的是已经在CvCapture结构体中分配好的内存

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

char c = cvWaitKey(33);
if (c == 27) break;

这两句话的意思是:如果用户没有触发按键,程序等待33ms;
如果按下esc键后退出播放(esc键的ASCLL码就是27);

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

接下来是读取摄像头的程序:
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#include "highgui.h"

int main()
{
    cvNamedWindow("Example2", 0);

    /*与播放视频程序唯一的区别就在这里*/
    CvCapture* capture = cvCreateCameraCapture(0);

    IplImage * frame;
    while (1)
    {
        frame = cvQueryFrame(capture);

        if (!frame) break;
        //如果frame加载为空则退出播放
        cvShowImage("Example2", frame);

        char c = cvWaitKey(33);
        if (c == 27) break;     //27对应的是esc的ASCLL码的值

    }

    cvReleaseCapture(&capture);
    cvDestroyWindow("Example2");
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

这个程序与播放视频文件的程序是一样的,将cvCreateFileCapture函数改成了cvCreateCameraCapture();

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

值得注意的是:cvCreateCameraCapture()这个函数的参数设置;

CvCapture* cvCreateCameraCapture( int index );

index的参数设置比较重要,如果只有一个摄像机时,参数值取0。当参数被设置为-1时,OpenCV会打开一个窗口让用户选择需要使用的摄像机。

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

看了几个程序总结的规律:
opencv的结构体一般Cv中的C是大写,而函数名的cv是小写

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值