目录
[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没法保存的原因可以是视频色彩不一致)
生成视频尺寸需与读取视频尺寸一致