显示一张图片,对于我们来说是很容易理解的事情。但播放一个视频,感觉就很神秘很有技术含量了。

然而今天看了《学习OpenCV中文版》中的两个小例子后,惊呼,原来如此,居然这么简单!就是我们经常所说的电影动画原理:视觉残留。先从视频文件中取出一帧(即一张图片),显示出来,暂停若干毫秒后,取下一张,再显示出来,视频就播放起来了。

显示一张图片

使用OpenCV读取并显示一张图片。

核心代码

核心代码就这几行:

#include "highgui.h"

char* imgPath = "logo.png";
IplImage* img = cvLoadImage(imgPath);
cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);
cvShowImage("Example1", img);

首先通过cvLoadImage函数读取一张图片,然后创建一个窗口,再把img指针传过去,就显示出来了。

见效果:

android opencv显示图片 opencv显示一张图片_android opencv显示图片

完整代码

下面是一个完整的示例,增加销毁图片、窗口等擦PP的操作:

#include "highgui.h"

int main(int argc, char** argv) {
    char* imgPath = "logo.png";
    IplImage* img = cvLoadImage(imgPath);
    cvNamedWindow( "Example1", CV_WINDOW_AUTOSIZE);
    cvShowImage("Example1", img);
    cvWaitKey(0);
    cvReleaseImage(&img);
    cvDestroyWindow("Example1");
    return 0;
}

值得一提的是,cvLoadImage函数可识别多数常用的图片格式,像png/bmp/jpg等,遗憾的是不识别gif(可能因为gif是多帧图片)。

播放一个AVI视频

OpenCV可以播放AVI格式的视频,不过在我的电脑上只能播放一些特别简单的,大一点的就会出错,可能是缺少相应的解码器。所以在测试下面的例子时,尽量找一些简单的AVI视频来试。

播放原理

如本文开头所说,就是通过函数从视频文件中取一帧帧的图片,隔一小段时间显示一张。当速度达到每秒24张左右时,就能形成流畅的动态效果。

通过OpenCV提供的函数从视频文件中取帧图片,再结合上例中显示图片的代码,就可轻松搞定。

核心代码

char* avi = "d:\\demo.avi";
CvCapture* capture = cvCreateFileCapture(avi);
IplImage* frame = cvQueryFrame(capture);

通过cvCreteFileCapture处理avi文件,得到一个capture指针,再通过cvQueryFrame就得到了它下一张图片。反复去取,反复播放即可。

效果如下:

android opencv显示图片 opencv显示一张图片_android opencv显示图片_02

完整代码

完整的代码如下:

#include "highgui.h"

int main22(int argc, char** argv) {
    char* avi = "d:\\demo.avi";
    cvNamedWindow ("Example2", CV_WINDOW_AUTOSIZE);
    CvCapture* capture = cvCreateFileCapture(avi);
    IplImage* frame ;
    while(1) {
        frame = cvQueryFrame(capture);
        if(!frame) break;
        cvShowImage("Example2", frame);
        char c = cvWaitKey(33);
        if(c==27) break;

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

可以看出还是非常简单的。

关于对视频的进一步控制,如获取文件实际帧率,跳到某一帧,前进后退等,等以后再写。