赞
踩
目录
- #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;
- }

● 函数原型:
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:无损的源图像
● 函数原型:
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
● 函数原型:
imshow(const string& winname, InputArray mat);
● 参数1:winname
设置需要显示的窗口名称
● 参数2:mat
需要显示的图像
● 函数原型:
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>());
● 参数1:filename
设置保存的文件名,需填写后缀,如"1. bmp"
● 参数2:img
要保存的Mat类型图像数据
● 参数3:params
表示特定格式保存的参数编码,一般采用默认值不填写
● 函数原型:
Int waitKey(int delay=0);
● 参数1:delay
如果delay>0,表示等待delay毫秒之后窗口被关闭;如果delay=0,表示无限等待,直到有案件按下结束
● 返回值:
对应按下按键的ASCII码值,如Esc的ASCII码为27
● 属性和方法:
(1) .empty() 判断文件读取是否正确
(2) .rows 获取图像行数(高度)
(3) .cols 获取图像列数(长度)
(4) .channels() 获取图像通道数
(5) .depth() 获取图像位深度
代码1
- #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
- #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;
- }

● 属性和方法:
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); 设置类信息的一个属性
1. 打开视频
打开的视频既可以是本地视频
- VideoCapture cap;
- cap.open("1.avi");
也可以是网络视频
- VideoCapture cap;
- cap.open("http://www.laganiere.com/a.avi");
2. 读取摄像头
- VideoCapture cap;
- cap.open(1);
open后面跟上索引,如果只有一个USB摄像头,索引为0;如果有2个,索引是0或1都行。摄像头的接入和断开都会改变index值
● 读取视频一定要加异常判断:
● 打开视频失败(各种原因)
- if (!cap.isOpened()) // 检查打开是否成功
- return;
● 取帧失败异常(程序结尾判断)
- cap >> frame;
- if (!frame.empty()
- {
- imshow("video", frame);
- waitKey(30);
- }
- else break;
- 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;
(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没法保存的原因可以是视频色彩不一致)
生成视频尺寸需与读取视频尺寸一致
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。