学习OpenCV的学习笔记系列(三)显示图片及视频

本文是学习OpenCV的第三部分,主要介绍如何在Visual Studio 2010环境下创建一个Win32控制台应用,用以打开和显示图片及视频。通过新建工程,编写代码来打开图片和视频文件,然后调试运行,成功实现基本的图像和视频处理功能。
摘要由CSDN通过智能技术生成

OpenCV是计算机视觉库,那么处理的对象无非两个:“图片”及“视频”(其实视频也是被解压成单帧图像来处理的,总的来说,还是处理图像)。

那么要想学习OpenCV,第一步必须知道OpenCV是怎么打开“图像”及“视频”文件然后显示的。


如果要想实现这些功能,其实很简单,步骤如下:


1. 新建工程

     


打开VS2010,新建一个项目,选择“Win32控制台应用程序”(使用控制台可以省掉很多麻烦),取名“HelloOpenCV”,点击“确定”按钮。


下一步


记得勾选“空项目”,然后点击“完成


工程新建好了,工程有四个文件夹,分别为“外部依赖项”,“头文件”,“源文件”,“资源文件”





好了,工程新建好了,源码文件也新建好了,下面开始写代码了。


2. 编写代码


在“main.cpp”文件中输入以下代码:


//Created by JimmyGong20140903
// main.cpp : 实现文件
//

/*OpenCV相关头文件包含*/
#include <stdio.h>
#include <iostream>
#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  

using namespace cv;  
using namespace std;
//载入图片并显示
void LoadImage_Display()
{
	Mat myImage = imread("airplane.jpg");//载入指定图像
	namedWindow("单幅图像显示");//创建一个名为“单幅图像显示”的窗口
	imshow("单幅图像显示",myImage);//在指定窗口显示指定图像

	waitKey(0);
}

//载入视频并显示
void LoadVideo_Display()
{
	Mat myFrame;
	CvCapture* myCap;
	namedWindow("视频播放",WINDOW_AUTOSIZE);//创建一个名为“视频播放”的窗口
	myCap = cvCreateFileCapture("Megamind.avi");
	myFrame = cvQueryFrame(myCap);

	while (1)
	{
		myFrame = cvQueryFrame(myCap);

		if ( myFrame.empty() )//判断是否帧为空
		{
			cout<<"视频文件播放完毕"<<endl;
			break;
		}


		char chKeyCode = cvWaitKey(20);

		if(chKeyCode == 27)
		{
			break;
		}

		imshow("视频播放",myFrame);
	}
	cout<<"按任意键退出!"<<endl;
	waitKey(0);
}

int main()
{
	int whichTypeFile = 0;
	char cstr;
	bool isGoodInput=false;
	cout<<"请输入需要显示的文件类型!\n输入“0”为图像文件,输入“1”为视频文件,其他无效!\n"<<endl;
	
	//cstr = cin.get();
	while(!isGoodInput)
	{
		cin >> cstr;

		if (!isdigit(cstr))
		{
			cout << "请输入“0”或“1”,谢谢!"<<endl;
		}
		else
		{
			cout << "\n输入成功!" <<endl;
			isGoodInput = true;
		}
	}

	//whichTypeFile = atoi(cstr);
	whichTypeFile = int(cstr-'0');//char-->int

	if (0 == whichTypeFile)
	{
		LoadImage_Display();
	} 
	else if (1 == whichTypeFile)
	{
		LoadVideo_Display();
	}
	else
	{
		cout << "输入无效!\n" << "请安任意键退出!" << endl;
		waitKey(0);
	}
	
	return 0;
}



3. 放入资源文件


在完成编码后,必须要在工程目录里放入所需要显示的图片及视频文件,否则程序为因为读不到指定的图片及视频文件而出错。

本例拷贝了OpenCV2.4.9源码中的"airplane.jpg"和"Megamind.avi"文件放入工程目录("H:\Practice\HelloOpenCV\HelloOpenCV")中。


4. 调试及测试

在代码及资源文件无误的情况下,开始调试程序,顺利编译通过,运行画面如下:




好了,最简单的图片显示及视频播放功能已经实现了。是不是很简单呢?


下面给出本次演示的源码工程:   

HelloOpenCV


OK,先到这里吧!下次文章再见!

一、问题的提出 做运动分析检测,需要有一定的素材视频,但是素材视频的编码OpenCV不能识别,无法对指定的视频做实验,怎么素材视频通用化使得OpenCV能正常识别? 二、解决的方法 (1)素材视频总是有配套的播放器来播放,那么使用这个播放器查看总帧数,和总播放时长,计算出帧率为25,表示一秒钟播放25帧像。 (2)用这个配套的播放器对素材视频进行逐帧步进抓,这个操作很辛苦,一秒钟25帧,那么抓25帧是一秒,素材视频30秒就要抓750帧,很辛苦。 (3)帧抓完后,发现一帧1.4M,以位格式保存,那么30秒就要达到1G的存储空间,怎么办?没办法,不知道怎么去获取解码器和安装解码器,就只能这么忍受。察看到逐帧步进抓的存储是按序列编排文件名,那么要修改好使得每个文件名都是以规则“文件名”+“帧序列”的形式存在。 (4)编写根据帧序列生成帧率25的视频的代码 、问题的解决: (1)解决一个字符串合并的问题: 由于字符串参数有个赋值格式化设置函数叫做Format,要实现多类型参数的字符串化,可以参照如下示例: float f = 0.0; char sz[128]; int n = 1; CString str; str.Format("%f%s%d",f,sz,n); (2)采用MJPG的编码格式依次将这些像序列写入到视频中保存起来,采用MJPG的编码格式是因为操作系统自带了Media player播放器,这种编码格式属于无压缩的,Media player可以识别播放。 (3)实现方式是使用MFC对话框窗体的按钮事件来进行视频的逐帧写,由于帧数多,那么在写入器循环做写这个动作的时候,整个程序是假死在那里直到写入器的写入操作终结。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值