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指针,这使得我们可以完全使用类似于从视频流中获取帧的方法。当我们需要处理摄像机图像序列时我们只需要简单的从摄像机获得图像,像视频文件一样处理。