opencv c++ 学习1

目录

一、图像读取、显示、保存

[1.1 示例代码](#1.1 示例代码)

[1.2 imread函数](#1.2 imread函数)

[1.3 namedWindow函数](#1.3 namedWindow函数)

[1.4 imshow函数](#1.4 imshow函数)

[1.5 imwrite函数](#1.5 imwrite函数)

[1.6 waitKey函数](#1.6 waitKey函数)

[1.7 Mat类](#1.7 Mat类)

二、摄像头/视频读取_写入

[2.1 示例代码](#2.1 示例代码)

[2.2 VideoCapture类](#2.2 VideoCapture类)

[2.3 VideoCapture.open()](#2.3 VideoCapture.open())

[2.4 VideoCapture.isOpened()](#2.4 VideoCapture.isOpened())

[2.5 VideoCapture.get()](#2.5 VideoCapture.get())

[2.6 VideoWriter类](#2.6 VideoWriter类)


一、图像读取、显示、保存

1.1 示例代码

cpp 复制代码
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main()
{
	Mat srcImg = imread("D:\\Project\\vs\\ConsoleApplication1\\x64\\Release\\1.png");
	cvtColor(srcImg, srcImg, CV_BGR2GRAY);	// 转为灰度图
	namedWindow("img", WINDOW_AUTOSIZE);	// 创建窗口
	imshow("img", srcImg);					// 显示图片
	imwrite("1.bmp", srcImg);				// 保存结果图片
	waitKey(0);								// 暂停按钮等待

	return 0;
}

1.2 imread函数

● 函数原型:

Mat imread(const string & filename, int flags=1);

● 参数1: filename

传入图片路径,支持如下格式

windows位图:bmp、dib

JPEG文件:jpeg、jpg、jpe

JPEG2000文件:jp2

PNG图片:png

编写文件格式:pbm、pgm、ppm

Sun rasters光栅文件:sr、ras

TIFF文件:tiff、tif

● 参数2:flags

默认是1,可以传入如下值

CV_LOAD_IMAGE_UNCHANGED = -1:在新版本中译本废置;

CV_LOAD_IMAGE_GRAYSCALE = 0:始终将图像转换成灰度,在返回;

CV_LOAD_IMAGE_COLOR = 1:始终转换到彩色,再返回;

CV_LOAD_IMAGE_ANYDEPTH = 2:如果载入图像的深度为16位或者32位,就返回对应深度图,否则就转换为8位图像在返回;

CV_LOAD_IMAGE_ANYCOLOR = 4:无损的源图像

1.3 namedWindow函数

● 函数原型:

namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE);

● 参数1:winname

设置作为标识的窗口名称

● 参数2:flags

窗口显示方式,取值如下:

WINDOW_NORMAL = CV_WINDOW_NORMAL 正常大小显示,用户可以改变窗口大小

WINDOW_AUTOSIZE = CV_WINDOW_AUTOSIZE 根据图像大小自动调整,用户不能手动改变窗口大小

WINDOW_OPENGL = CV_WINDOW_OPENGL 支持OpenGL

1.4 imshow函数

● 函数原型:

imshow(const string& winname, InputArray mat);

● 参数1:winname

设置需要显示的窗口名称

● 参数2:mat

需要显示的图像

1.5 imwrite函数

● 函数原型:

bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>());

● 参数1:filename

设置保存的文件名,需填写后缀,如"1. bmp"

● 参数2:img

要保存的Mat类型图像数据

● 参数3:params

表示特定格式保存的参数编码,一般采用默认值不填写

1.6 waitKey函数

● 函数原型:

Int waitKey(int delay=0);

● 参数1:delay

如果delay>0,表示等待delay毫秒之后窗口被关闭;如果delay=0,表示无限等待,直到有案件按下结束

● 返回值:

对应按下按键的ASCII码值,如Esc的ASCII码为27

1.7 Mat类

● 属性和方法:

(1) .empty() 判断文件读取是否正确

(2) .rows 获取图像行数(高度)

(3) .cols 获取图像列数(长度)

(4) .channels() 获取图像通道数

(5) .depth() 获取图像位深度

二、摄像头/视频读取_写入

2.1 示例代码

代码1

cpp 复制代码
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
	VideoCapture cap;
	cap.open("D:\\2.mp4");		// 打开视频

	if (!cap.isOpened())
		return 1;

	Mat frame;
	while (1)
	{
		cap >> frame;
		if (frame.empty()) break;
		imshow("video", frame);
		waitKey(20);
	}
	cap.release();

	return 0;
}

代码2

cpp 复制代码
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
	VideoCapture cap;
	Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	VideoWriter writer("D:\\out.avi", -1, cap.get(CV_CAP_PROP_FPS), size0, true);

	cap.open(0);

	if (!cap.isOpened())
		return 1;

	Mat frame;
	while (1)
	{
		cap >> frame;
		cvtColor(frame, frame, CV_BGR2HSV);		// 色彩空间转到到HSV
		if (frame.empty()) break;
		writer.write(frame);
		imshow("video", frame);
		if (waitKey(20) > 0)
			break;
	}
	cap.release();
	destroyAllWindows();

	return 0;
}

2.2 VideoCapture类

● 属性和方法:

CV_WRAP virtual bool open(const string& filename); 打开视频文件

CV_WRAP virtual bool open(int device); 打开摄像头

CV_WRAP virtual bool isOpened() const; 判断读取视频文件是否正确

CV_WRAP virtual void release(); 关闭视频流文件

CV_WRAP virtual bool grab(); 抓取下一帧的视频文件或设备

CV_WRAP virtual bool rerieve(CV_OUT Mat& image, int channel=0); 解码并返回视频帧

CV_WRAP virtual bool set(int propId, double value); 返回指定视频类的相关参数信息

CV_WRAP virtual double get(int propId); 设置类信息的一个属性

2.3 VideoCapture.open()

1. 打开视频

打开的视频既可以是本地视频

cpp 复制代码
VideoCapture cap;
cap.open("1.avi");

也可以是网络视频

cpp 复制代码
VideoCapture cap;
cap.open("http://www.laganiere.com/a.avi");

2. 读取摄像头

cpp 复制代码
VideoCapture cap;
cap.open(1);

open后面跟上索引,如果只有一个USB摄像头,索引为0;如果有2个,索引是0或1都行。摄像头的接入和断开都会改变index值

2.4 VideoCapture.isOpened()

● 读取视频一定要加异常判断:

● 打开视频失败(各种原因)

cpp 复制代码
if (!cap.isOpened())        // 检查打开是否成功
        return;

● 取帧失败异常(程序结尾判断)

cpp 复制代码
cap >> frame;
if (!frame.empty()
{
        imshow("video", frame);
        waitKey(30);
}
else break;

2.5 VideoCapture.get()

cpp 复制代码
int width = cap.get(CV_CAP_PROP_FRAME_WIDTH);        //帧宽度
int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT);      //帧高度
int frameRate = cap.get(CV_CAP_PROP_FPS);            //帧率
int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT);  //总帧数

cout << "视频宽度 = " << width << endl;
cout << "视频高度 = " << height << endl;
cout << "视频总帧数 = " << totalFrames << endl;
cout << "帧率 = " << frameRate << endl;

2.6 VideoWriter类

(1) 简介

Opency提供VideoWriter类写视频文件,类的构造函数可以指定文件名、播放帧率、帧尺寸、是否创建彩色视频。

CV_WRAP VideoWriter();

CV_WRAP VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true);

(2) 两种写入帧方法

writer. write(frame);

writer << frame;

(3) 注意事项

写入视频前需安装对应的编解码器

生成视频是否支持彩色应与构造函数设置一致(前面代码2没法保存的原因可以是视频色彩不一致)

生成视频尺寸需与读取视频尺寸一致

相关推荐
hong1616886 分钟前
VSCode中配置C/C++环境
c语言·c++·vscode
小羊在奋斗21 分钟前
【C++】探秘二叉搜索树
c++·人工智能·神经网络·机器学习
白葵新40 分钟前
PCL addLine可视化K近邻
c++·人工智能·算法·计算机视觉·3d
simple_whu43 分钟前
相机畸变系数$b_1,b_2$与畸变系数aspect ratio和skew的互转
数码相机·计算机视觉·摄影测量
MustardJim1 小时前
Visual Studio 引入外部静态库与动态库
c++·visual studio
挽月0011 小时前
C++单例模式
开发语言·c++·单例模式
机器视觉知识推荐、就业指导1 小时前
Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)
c++·qt·tcp/ip
wx200411022 小时前
Codeforces Round 973 (Div. 2) - D题
数据结构·c++·算法
DieSnowK2 小时前
[项目][WebServer][CGI机制 && 设计]详细讲解
linux·开发语言·c++·http·项目·webserver·cgi机制
虚假程序设计3 小时前
pythonnet python图像 C# .NET图像 互转
开发语言·人工智能·python·opencv·c#·.net