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没法保存的原因可以是视频色彩不一致)

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

相关推荐
一勺汤35 分钟前
YOLO11改进-注意力-引入多尺度卷积注意力模块MSCAM
yolo·目标检测·计算机视觉·改进·魔改·yolov11·yolov11改进
沐泽Mu1 小时前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习
szuzhan.gy2 小时前
DS查找—二叉树平衡因子
数据结构·c++·算法
西西弗Sisyphus2 小时前
开放世界目标检测 Grounding DINO
人工智能·目标检测·计算机视觉·大模型
火云洞红孩儿2 小时前
基于AI IDE 打造快速化的游戏LUA脚本的生成系统
c++·人工智能·inscode·游戏引擎·lua·游戏开发·脚本系统
风清扬雨3 小时前
【计算机视觉】超简单!傅里叶变换的经典案例
人工智能·计算机视觉
FeboReigns4 小时前
C++简明教程(4)(Hello World)
c语言·c++
FeboReigns4 小时前
C++简明教程(10)(初识类)
c语言·开发语言·c++
zh路西法4 小时前
【C++决策和状态管理】从状态模式,有限状态机,行为树到决策树(二):从FSM开始的2D游戏角色操控底层源码编写
c++·游戏·unity·设计模式·状态模式
.Vcoistnt4 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划