【opencv】示例-imagelist_reader.cpp 读取YAML格式文件中的图片列表,并逐个显示这些图片的灰度图...

这段代码的功能是使用OpenCV库读取一个YAML或XML格式文件中的图片列表,并且逐个地在窗口中以灰度图像的形式显示这些图片。用户可以按任意键来查看下一张图片。程序提供了帮助信息输出,指导用户如何使用该程序。此外,它使用命令行参数解析器来获取文件路径参数,并对参数进行相应的检查和处理。如果图片列表文件成功读取,程序会逐个显示图片列表中的每一张图片;否则,程序会终止并返回错误代码。

cpp 复制代码
// 包含必要的OpenCV头文件
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
#include <vector>


// 使用OpenCV和标准命名空间中的名称
using namespace cv;
using namespace std;


// 声明帮助函数,用于向用户展示如何使用该程序
static void help(char** av)
{
  // 向控制台打印使用该程序的指南
  cout << "\nThis program gets you started being able to read images from a list in a file\n"
          "Usage:\n./" << av[0] << " image_list.yaml\n"
       << "\tThis is a starter sample, to get you up and going in a copy pasta fashion.\n"
       << "\tThe program reads in an list of images from a yaml or xml file and displays\n"
       << "one at a time\n"
       << "\tTry running imagelist_creator to generate a list of images.\n"
        "Using OpenCV version %s\n" << CV_VERSION << "\n" << endl;
}


// 函数从文件中读取图片列表并存储到一个字符串向量中
static bool readStringList(const string& filename, vector<string>& l)
{
  l.resize(0); // 清空字符串向量
  FileStorage fs(filename, FileStorage::READ); // 打开文件存储器以读取数据
  if (!fs.isOpened()) // 如果失败,则返回false
    return false;
  FileNode n = fs.getFirstTopLevelNode(); // 获取文件中的第一个顶层节点
  if (n.type() != FileNode::SEQ) // 如果节点类型不是序列,则返回false
    return false;
  FileNodeIterator it = n.begin(), it_end = n.end(); // 迭代器遍历节点
  for (; it != it_end; ++it) // 遍历所有的节点
    l.push_back((string)*it); // 将节点的值作为字符串添加到向量中
  return true; // 成功读取列表后返回true
}


// 主处理函数,显示图片列表中的每一幅图片
static int process(const vector<string>& images)
{
    namedWindow("image", WINDOW_KEEPRATIO); // 创建一个窗体,窗体的大小可以调整
    for (size_t i = 0; i < images.size(); i++)
    {
        Mat image = imread(images[i], IMREAD_GRAYSCALE); // 读取图片并转换为灰度图像
        imshow("image",image); // 在窗体中显示图片
        cout << "Press a key to see the next image in the list." << endl; // 提示用户按键以查看下一张图片
        waitKey(); // 等待用户按键
    }
    return 0; // 正常结束程序返回0
}


// 程序入口点,主函数
int main(int ac, char** av)
{
  cv::CommandLineParser parser(ac, av, "{help h||}{@input||}"); // 用于解析命令行参数
  if (parser.has("help")) // 如果有"help"参数
  {
      help(av); // 显示帮助信息
      return 0; // 退出程序
  }
  std::string arg = parser.get<std::string>("@input"); // 获取输入参数,即图片列表文件的路径
  if (arg.empty()) // 如果参数为空
  {
    help(av); // 显示帮助信息
    return 1; // 退出程序,并返回错误代码1
  }
  vector<string> imagelist; // 定义字符串向量存储图片列表


  if (!readStringList(arg,imagelist)) // 读取图片列表,如果失败
  {
    cerr << "Failed to read image list\n" << endl; // 向错误输出流打印错误信息
    help(av); // 显示帮助信息
    return 1; // 退出程序,并返回错误代码1
  }


  return process(imagelist); // 调用process函数处理图片列表,然后退出程序
}
相关推荐
打羽毛球吗️4 分钟前
机器学习中的两种主要思路:数据驱动与模型驱动
人工智能·机器学习
蒙娜丽宁5 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
好喜欢吃红柚子20 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python25 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
神奇夜光杯34 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
正义的彬彬侠37 分钟前
《XGBoost算法的原理推导》12-14决策树复杂度的正则化项 公式解析
人工智能·决策树·机器学习·集成学习·boosting·xgboost
plmm烟酒僧38 分钟前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Debroon1 小时前
RuleAlign 规则对齐框架:将医生的诊断规则形式化并注入模型,无需额外人工标注的自动对齐方法
人工智能
羊小猪~~1 小时前
神经网络基础--什么是正向传播??什么是方向传播??
人工智能·pytorch·python·深度学习·神经网络·算法·机器学习
AI小杨1 小时前
【车道线检测】一、传统车道线检测:基于霍夫变换的车道线检测史诗级详细教程
人工智能·opencv·计算机视觉·霍夫变换·车道线检测