一、运行环境

环境是Visual Studio 2015和OpenCV4.0.1

一般在VS里边就可以看到函数的功能及用法描述,你也可以查看官方文档来获取帮助。https://docs.opencv.org/4.0.1/

二、示例代码

1. 显示一张图片

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
	const char* ImgPath = "AWVS1455.JPG";
	const char* WindowName = "Example";
	Mat img = imread(ImgPath);

	if (img.empty())
	{//判断是否加载成功,如果未加载图片则提示加载失败
		cerr << "Read img file error !" << endl;
		system("pause");
		return -1;
	}

	namedWindow(WindowName, WINDOW_NORMAL);//这个函数可以不加,不加的话创建的窗口就是默认属性
	imshow(WindowName, img);
	waitKey(0);

	return 0;
}
CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );

功能:加载一张指定的图片,并返回一个包含图片信息的Mat对象

参数:参数一指定需要加载的图片位置及名称,参数二指定加载方式,默认值IMREAD_COLOR是以RGB方式加载

返回值:成功时返回一个包含打开图片信息的Mat对象,可通过返回对象的成员函数empty查看是否成功加载

CV_EXPORTS_W void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);

功能:按窗口名称设置用于显示图片的窗口属性,如果使用的名称未被其他窗口占用,该函数将创建一个窗口

参数:参数一指定窗口名称,参数二指定窗口的属性,默认值WINDOW_AUTOSIZE是包含图片的窗口不能改变大小(大的图片会显示不全,本例中使用的是WINDOW_NORMAL,显示完整图片,可改变窗口大小)

CV_EXPORTS_W void imshow(const String& winname, InputArray mat);

功能:在指定的窗口中显示图片(根据窗口名称确定窗口)

参数:参数一指定用以显示图片的窗口,参数二指定需要显示的图片

CV_EXPORTS_W int waitKey(int delay = 0);

功能:是程序在调用处暂停一段时间

参数:0或者负数时,等待键盘按键按下后结束暂停;正数时,等待数值给出的毫秒数后结束暂停

返回值:参数为0或者负数时,返回键盘键入按键的ASCII值;参数为正数时,函数结束后返回 - 1

2. 播放一段视频

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

#include <iostream>
using namespace std;

int main()
{
	VideoCapture cap;    //创建存储视频文件或者设备的对象
	cap.open("D:\\StudyOpencv\\002-PlayVideo\\002-PlayVideo\\1234.MP4");    //打开视频文件或者视频设备
	if (!cap.isOpened())
	{
		cout << "could not open the VideoCapture !" << endl;
		system("pause");
		return -1;
	}

	const char* windowsName = "Example";
	int k = -1;

	while (true)
	{
		Mat frame;
		bool ok = cap.read(frame);
		if (!ok)    //判断视频文件是否读取结束
			break;
		imshow(windowsName, frame);    //从视频对象中获取图片显示到窗口
		k = waitKey(33);    //每33毫秒一张图片
		if (k == 27) break;    //按下退出键:Esc
	}

	waitKey(-1);
	return 0;
}
CV_WRAP virtual bool open(const String& filename, int apiPreference = CAP_ANY);

功能:打开一个指定的视频文件或者打开一个指定的视频设备

参数:参数一指定打开的路径及对象,参数二指定了第一个参数的类型或属性,默认参数CAP_ANY表示由系统或程序自动识别类型

返回值:当指定的文件或设备成功打开时返回true,也可以用isOpened函数去查看是否成功打开

CV_WRAP virtual bool read(OutputArray image);

功能:读取视频文件或视频设备的数据

参数:存储视频文件或视频设备的信息对象

返回值:如果没有画面可以读取时返回 false

三、自学问题记录

程序虽然简单,但第一次接触,还是遇到了问题。代码如下(老版本的播放视频方法),一开始是在OpenCV3.4版本上写的视频播放代码,语法没有报错,一旦调试就会报错。调查发现是因为高版本的OpenCV已经不建议使用下列C语言风格的代码,而是建议用上面C++面向对象风格编写代码。同样的代码放在OpenCV4.0.1上就直接会提示语法错误,相对3.4版本不做语法报错但编译不通过的情况,4.0版本应该已经做了完善,毕竟无用的代码最好还是在未编译时就告诉你,否则很容易让我们一脸懵逼(往下贴出了错误信息)。

示例:

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

using namespace cv;

int main(int argc, char *argv[])
{
	const char *videoName = "vtest.avi";
	const char *windowName = "Example";

	cvNamedWindow(windowName, CV_WINDOW_NORMAL);
	CvCapture* capture = cvCreateFileCapture(videoName);
	IplImage* frame;

	while (1)
	{
		frame = cvQueryFrame(capture);
		if(!frame)
			break;
		cvShowImage(windowName, frame);
		char c = cvWaitKey(33);
		if(c == 27)
			break;
	}

	cvReleaseCapture(&capture);
	cvDestroyWindow(windowName);

	system("pause");
	return 0;
}

OpenCV3.4版本编译后的错误信息:(这里之所以贴出来,是为了让遇到相同疑惑的兄弟更容易检索到这篇文章)

[ INFO:0] VIDEOIO: Enabled backends(6, sorted by priority): FFMPEG(1000); MSMF(990); DSHOW(980); VFW(970); CV_IMAGES(960); CV_MJPEG(950)
[ WARN:0] cvCreateFileCaptureWithPreference: backend FFMPEG doesn't support legacy API anymore.
[ WARN:0] cvCreateFileCaptureWithPreference: backend MSMF doesn't support legacy API anymore.

opencv 图表 opencv展示图片_ide