OpenCV笔记(1)载入图像 视频播放 读取摄像头

来源:互联网 发布:淘宝卖家怎么开直通车 编辑:程序博客网 时间:2024/05/18 00:08

    opencv开发包提供了读取各种类型的图像文件,视频内容以及摄像头输入的功能,这些功能是highgui工具集的一部分。接下来我们分别介绍:


1.显示图像

    程序运行后的结果,图片1被正确显示:

   

    IplImage* img = cvLoadImage("1.jpg")

    这一行程序的功能是将图像文件加载进内存。 cvLoadImage()是一个高层调用函数接口,通过文件名确定加载文件的格式。它可以读取绝大多数格式的图像文件,BMP,JPG,PNG,PGM等等。执行完后将会返回一个指针,指向一块为描述该图像文件的数据结构(IplImage)而分配的内存块。

    cvNamedWindow("eg1", CV_WINDOW_AUTOSIZE)

    cvNamedWindow()函数也是一个高层调用接口,由highgui库提供。用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。第一个参数指定窗口标题,第二个参数定义了窗口的属性,该参数可以设置为0(默认值)或者CV_WINDOW_AUTOSIZE。设置为0时,窗口大小不会因为图像的大小而改变,图像只能根据窗口的大小进行放大或缩小;设置为CV_WINDOW_AUTOSIZE时,窗口会根据图像的大小而自动改变。

    cvShowImage("eg1", img)

    只要有一个与图像文件相对应的IplImage*类型的指针,我们就可以在一个创建好的窗口中使用cvShowImage()函数显示该图像。通过设置第一个参数确定在哪一个窗口中显示。并且函数被调用时,窗口被重新绘制,图像显示在其中。第二个参数也可以设置为CV_WINDOW_AUTOSIZE,此时窗口的大小根据图像的大小自动调整。

    cvWaitKey(0)

    cvWaitKey()函数的功能是使程序暂停,等待用户触发按键操作。参数为0或者负数时,一直等待用户触发按键操作;参数为正数时,程序暂停一段时间,然后继续执行,即使用户没有按下任何按键。

    cvReleaseImage(&img)

    一旦加载完内存的图像文件,我们就可以释放为该图像分配的内存。

    cvDestroyWindow("eg1")

    最后,销毁显示图像文件的窗口。


2.播放视频

    使用opencv播放视频,几乎与用来显示图像一样容易。需要解决的问题就是如何循环顺序读取视频的每一帧。

    完整代码:

//eg2:播放avi视频#include "highgui.h"int main(int argc, char** argv){cvNamedWindow("eg2", CV_WINDOW_AUTOSIZE);CvCapture* capture = cvCreateFileCapture("1.avi");IplImage* frame;while (1){frame = cvQueryFrame(capture);if (!frame)break;cvShowImage("eg2", frame);char c = cvWaitKey(33);if (c == 27)break;}cvReleaseCapture(&capture);cvDestroyWindow("eg2");return 0;}
    运行结果,视频正确播放:

    

    CvCapture* capture = cvCreateFileCapture("1.avi")

    cvCreateFileCapture()函数通过参数设置要读入的AVI文件,返回一个指向CvCapture结构的指针。这个结构包括所有关于要读入AVI文件的信息。

    frame = cvQueryFrame(capture) 

    一旦进入while(1)循环,我们便开始读入AVI文件,cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存。

    char c = cvWaitKey(33);

    if (c == 27)   break;

    当前帧被显示,等待33ms。如果触发ESC键(ASCII27),循环被退出,读入视频停止,否则33ms以后继续执行循环。

    cvReleaseCapture(&capture)

    退出循环体,释放内存空间,关闭所有打开的AVI文件相关的文件句柄。


3.读取摄像头

    读取摄像头类似于读取AVI文件,不同的是,我们调用的是cvCreateCameraCapture()函数,而不是cvCreateFileCapture()。

    完整代码:

//eg3:读取摄像头#include "highgui.h"int main(int argc, char** argv){cvNamedWindow("eg3", CV_WINDOW_AUTOSIZE);CvCapture* capture = cvCreateCameraCapture(-1);IplImage* frame;while (1){frame = cvQueryFrame(capture);if (!frame)break;cvShowImage("eg2", frame);char c = cvWaitKey(33);if (c == 27)break;}cvReleaseCapture(&capture);cvDestroyWindow("eg2");return 0;}

    代码运行结果:

   

    CvCapture* capture = cvCreateCameraCapture(0)    

    cvCreateCameraCapture()函数后面的参数是摄像设备的ID,而不是文件名,只有存在多个摄像设备时才会起到作用。默认值是-1,代表随机选择一个。有多个摄像头设备时,需要指定设备名称。

    cvCreateCameraCapture()函数同样返回相同的CvCapture指针,这使得我们可以完全使用类似于从视频流中获取帧的方法。当我们需要处理摄像机图像序列时我们只需要简单的从摄像机获得图像,像视频文件一样处理。




阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 澳洲语言班没过怎么办2018 杨浦区对口公立小学太差怎么办 公立小学太差了怎么办 澳大利亚出国留学怎么办-语言课程 学校不给释放信怎么办 重修费交不起钱怎么办 不想用家里的钱怎么办 三本学费太贵怎么办 从日本往中国汇款怎么办 学费钱大一没交怎么办 初中孩子和同学相处不好怎么办 使用假护照出国被发现怎么办 酒店忘记退房了怎么办 语言课申请不上怎么办 学会计的应届生想转行怎么办 上班熬不下去了怎么办 墨大选修挂科怎么办 日本签证年收入没有10w怎么办 做生意的办房贷没有薪资流水怎么办 澳洲医保卡丢了怎么办 澳洲爱他美上火怎么办 学信网学籍在籍没交学费怎么办 宝宝从床上摔下来怎么办 狗没打针被咬了怎么办 狗咬了没破皮没出血怎么办 被宠物狗咬了出血了怎么办 让狗咬了下红了怎么办 狗牙齿碰到红了怎么办 加拿大学生签背景调查了怎么办 gpa不到3该怎么办英国 内地学生赴港签证怎么办 学生去日本旅游签证怎么办 澳洲未婚妻签需要单身证明怎么办 高院收到申诉材料怎么办? 辞职出国留学后社保怎么办 高三数学40来分怎么办 论文查重表格内容重复怎么办 榕树叶子掉光了怎么办 2017江苏高考2c怎么办 高考刚过三本线怎么办 江苏高考选修有d怎么办