学习OpenCV(1) 最初级的图片读取和视频读取例程

接着撸干的, 先简要介绍一下OpenCV各个模块的头文件(这是从Learning OpenCV第三版上抄下来的):

#include <opencv2/core/core.hpp>    //新式C++风格的结构以及数学运算
#include <opencv2/flann/miniflann.hpp>    //最邻近搜索匹配函数
#include <opencv2/imgproc/imgproc.hpp>    //新式C++风格图像处理函数
#include <opencv2/video/photo.hpp>    //操作和恢复照片相关算法
#include <opencv2/video/video.hpp>    //视觉追踪以及背景分割
#include <opencv2/features2d/features2d.hpp>    //用于追踪的二维特征
#include <opencv2/ml/ml.hpp>    //机器学习、聚类以及模式识别相关
#include <opencv2/highgui/highgui.hpp>    //新式C++风格的显示、滚动条、鼠标操作以及输入输出相关
......

【注意:所有代码都来源于Learning OpenCV3,旧的代码这里不会涉及】

第一个程序,显示图片

#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main(int argc, char** argv)
{
	Mat imgTest = imread("002.jpg");
	if (imgTest.empty())
	{
		return -1;
	}

	namedWindow("imgTestDemo", CV_WINDOW_AUTOSIZE);
	imshow("imgTestDemo", imgTest);

	waitKey(0);
	destroyWindow("imgTestDemo");
}

简单解释一下上面的代码,注意一下图片路径,这里只说一下关于参数imgTestDemo,可以将这个参数理解成窗口句柄,注意,不是真的句柄,但是看成句柄比较好理解,那么关于图片显示的顺序就可以理解成,读取图片-创建窗口-在创建的窗口上显示图片-将窗口销毁。在早期版本里,读取图片通常要搞一个IplImage*的指针,调用cvLoadImage,方法可用,不推荐。

第二个程序,读取视频

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main(int argc, char** argv)
{
	namedWindow("videoTestDemo", CV_WINDOW_AUTOSIZE);
	VideoCapture videoCap;
	videoCap.open("Go.avi");
	Mat frameCap;
	while(1)
	{
		videoCap >> frameCap;
		if (frameCap.empty())
		{
			break;
		}
		imshow("videoTestDemo", frameCap);
		if (waitKey(33) >= 0)
		{
			break;
		}
	}

	return 0;
}

为什么提倡用新版本的库呢,就是入门的这个例程让楼主有深刻体会。有些事情就是这样,犯过点错误,就会多点领悟。在使用早期的库版本中,你要调用cvCreateFileCapture("TempVideo.avi"),这个函数它会一直返回一个NULL给你,你就各种查资料吧,总结起来大致是这样,这个视频的编码格式不能被你当前所用的库进行解码。你要是想成功读取,怎么办呢?下载一个视频转换器,这个视频转换器(我尝试过的MJpeg这种转码格式是可以的,XviD和DivX不行)转换出来的avi视频能够被VitualDub这个软件进行再度转码,可以参考这篇文章https://www.cnblogs.com/Akagi201/archive/2012/04/03/2430772.html

我也是个小白,参考的便是上面的文章,讲的比较详细。我这里主要是从书上摘录一些讲解这段代码的内容。

首先看语句VideoCapture videoCap;这个VideoCapture在书上解释为视频读取结构,可以从字面意思理解一下,Capture的意思是捕捉,也就是说,这里声明的videoCap对象,可以捕捉视频,官方的话就是说这个结构可以打开和关闭很多类型的ffmpeg支持的视频文件。那么videoCap.open("Go.avi")就没什么可解释的了。

其次是Mat frameCap,又是一个Mat的对象,这块留着这个坑,以后慢慢填,这frameCap是一个可以保存视频帧的结构。

接下来是videoCap >> frameCap;这句话,这个标红的是输入运算符,应该不会陌生,它接受一个输入流作为其左侧运算对象,接受一个对象作为其右侧运算对象。剩下的废话就不墨迹了。

在函数return之前,其实还应该像图片操作那样,将创建的window销毁。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值