当前位置:   article > 正文

opencv c++ 学习1

opencv c++ 学习1

目录

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

1.1 示例代码

1.2 imread函数

1.3 namedWindow函数

1.4 imshow函数

1.5 imwrite函数

1.6 waitKey函数

1.7 Mat类

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

2.1 示例代码

2.2 VideoCapture类

2.3 VideoCapture.open()

2.4 VideoCapture.isOpened()

2.5 VideoCapture.get()

2.6 VideoWriter类


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

1.1 示例代码

  1. #include <opencv2/imgproc/imgproc.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. using namespace cv;
  4. int main()
  5. {
  6. Mat srcImg = imread("D:\\Project\\vs\\ConsoleApplication1\\x64\\Release\\1.png");
  7. cvtColor(srcImg, srcImg, CV_BGR2GRAY); // 转为灰度图
  8. namedWindow("img", WINDOW_AUTOSIZE); // 创建窗口
  9. imshow("img", srcImg); // 显示图片
  10. imwrite("1.bmp", srcImg); // 保存结果图片
  11. waitKey(0); // 暂停按钮等待
  12. return 0;
  13. }

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

  1. #include <opencv2/opencv.hpp>
  2. using namespace cv;
  3. int main()
  4. {
  5. VideoCapture cap;
  6. cap.open("D:\\2.mp4"); // 打开视频
  7. if (!cap.isOpened())
  8. return 1;
  9. Mat frame;
  10. while (1)
  11. {
  12. cap >> frame;
  13. if (frame.empty()) break;
  14. imshow("video", frame);
  15. waitKey(20);
  16. }
  17. cap.release();
  18. return 0;
  19. }

代码2 

  1. #include <opencv2/opencv.hpp>
  2. using namespace cv;
  3. int main()
  4. {
  5. VideoCapture cap;
  6. Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
  7. VideoWriter writer("D:\\out.avi", -1, cap.get(CV_CAP_PROP_FPS), size0, true);
  8. cap.open(0);
  9. if (!cap.isOpened())
  10. return 1;
  11. Mat frame;
  12. while (1)
  13. {
  14. cap >> frame;
  15. cvtColor(frame, frame, CV_BGR2HSV); // 色彩空间转到到HSV
  16. if (frame.empty()) break;
  17. writer.write(frame);
  18. imshow("video", frame);
  19. if (waitKey(20) > 0)
  20. break;
  21. }
  22. cap.release();
  23. destroyAllWindows();
  24. return 0;
  25. }

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. 打开视频

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

  1. VideoCapture cap;
  2. cap.open("1.avi");

也可以是网络视频

  1. VideoCapture cap;
  2. cap.open("http://www.laganiere.com/a.avi");

2. 读取摄像头

  1. VideoCapture cap;
  2. cap.open(1);

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

2.4 VideoCapture.isOpened()

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

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

  1. if (!cap.isOpened())        // 检查打开是否成功
  2.         return;

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

  1. cap >> frame;
  2. if (!frame.empty()
  3. {
  4.         imshow("video", frame);
  5.         waitKey(30);
  6. }
  7. else break;

2.5 VideoCapture.get()

  1. int width = cap.get(CV_CAP_PROP_FRAME_WIDTH); //帧宽度
  2. int height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
  3. int frameRate = cap.get(CV_CAP_PROP_FPS); //帧率
  4. int totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
  5. cout << "视频宽度 = " << width << endl;
  6. cout << "视频高度 = " << height << endl;
  7. cout << "视频总帧数 = " << totalFrames << endl;
  8. 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没法保存的原因可以是视频色彩不一致)

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/743153
推荐阅读
相关标签
  

闽ICP备14008679号