Loading...
墨滴

徐洲更

2021/05/27  阅读:46  主题:全栈蓝

「OpenCV学习笔记」读取和显示图片和视频

读取和显示图片

示例代码:

int show_image(char* file) {
  cv::Mat img = cv::imread(file, -1);
  if (img.empty()) return -1;
  cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE);
  cv::imshow("Example1", img);
  cv::waitKey(0);
  cv::destroyWindow("Example1");
  return 0;

}

代码说明:

cv2::imread能够读取多种格式图片,BMP, DIB, JPEG, PNG, PBM, PGM, PPM, SR, SAR, TIFF。读取后保存为 cv::Mat格式

在python中,读取的图片以numpy的ndarray类保存,而在C++中,读取的图片保存是OpenCV定义的Mat类,详见 cv::Mat Class Reference

cv::namedWindow用于创建展示窗口,大小通过 cv::WINDOW_AUTOSIZE确定

cv::imshow该函数允许我们在一个已有的窗口中展示 Mat 数据结构

cv::waitKey 用于在给定时间内接受输入按键,单位是milliseconds(毫秒), 如果设置为0,那么就是无限期等待。

waitKey返回的是int,对应的是keyboard字母的ASCII吗

cv::desctoryWindow: 关闭窗口,并释放与之关联的内存。该函数对于复杂的项目而言非常关键,如果在 go out of scope时没有清理窗口,会引起内存泄露

cv::Mat格式记录的图片会跟STL(Standard Template Library)的风格的容器类一样,通过内部的引用计数器(internal reference counter)实现图片内存的分配和释放(allocation and deallocation)

读取和显示视频

示例代码:

int show_video(char* file) {
  cv::namedWindow("Example2", cv::WINDOW_AUTOSIZE);
  cv::VideoCapture cap;
  cap.open(string(file));

  cv::Mat frame;
  for (; ; ) {
    cap >> frame;
    if (frame.empty()) break;
    cv::imshow("Example2", frame);
    if (cv::waitKey(33) >= 0break;
  }
  return 0;
}

视频本质上是由多个帧(frame)构成图片序列,因此只要能够逐个加载视频的图片,然后依次展示即可实现。具体实现如下

  1. 使用 cv::VideoCapture实例化一个视频加载类 cap

  2. 使用 cap.open打开文件

  3. 定义一个 cv::Mat 类,用于存放视频中的图片

  4. OpenCV 重载了 >>操作符,作用是读取视频的下一帧,赋值给frame

  5. cv::waitKey(33)表示等待33毫秒,1秒等于1000毫秒,相当于一秒出现30张图片,即30帧。

徐洲更

2021/05/27  阅读:46  主题:全栈蓝

作者介绍

徐洲更