OpenCV代码提取:遍历指定目录下指定文件的实现

2023-11-08

OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便,这里将OpenCV 2.4.9中相关的函数给提取了出来,适合在Windows 64bits上使用。

directory.hpp:

#ifndef FBC_CV_DIRECTORY_HPP_
#define FBC_CV_DIRECTORY_HPP_

// reference: include/opencv2/contrib/contrib.hpp (2.4.9)

#ifndef __cplusplus
	#error directory.hpp header must be compiled as C++
#endif

#include <vector>
#include "core/fbcdef.hpp"

namespace fbc {

class FBC_EXPORTS Directory {
public:
	std::vector<std::string> GetListFiles(const std::string& path, const std::string & exten = "*", bool addPath = true);
	std::vector<std::string> GetListFilesR(const std::string& path, const std::string & exten = "*", bool addPath = true);
	std::vector<std::string> GetListFolders(const std::string& path, const std::string & exten = "*", bool addPath = true);
};

}

#endif // FBC_CV_DIRECTORY_HPP_
directory.cpp:

#include <windows.h>
#include "directory.hpp"

// reference: contrib/src/inputoutput.cpp (2.4.9)

namespace fbc{

	std::vector<std::string> Directory::GetListFiles(const std::string& path, const std::string & exten, bool addPath)
	{
		std::vector<std::string> list;
		list.clear();
		std::string path_f = path + "/" + exten;
		WIN32_FIND_DATAA FindFileData;
		HANDLE hFind;

		hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
		if (hFind == INVALID_HANDLE_VALUE) {
			return list;
		} else {
			do {
				if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_NORMAL ||
					FindFileData.dwFileAttributes == FILE_ATTRIBUTE_ARCHIVE ||
					FindFileData.dwFileAttributes == FILE_ATTRIBUTE_HIDDEN ||
					FindFileData.dwFileAttributes == FILE_ATTRIBUTE_SYSTEM ||
					FindFileData.dwFileAttributes == FILE_ATTRIBUTE_READONLY) {
					char* fname;
					fname = FindFileData.cFileName;

					if (addPath) {
						list.push_back(path + "/" + std::string(fname));
					} else {
						list.push_back(std::string(fname));
					}
				}
			} while (FindNextFileA(hFind, &FindFileData));

			FindClose(hFind);
		}

		return list;
	}

	std::vector<std::string> Directory::GetListFilesR(const std::string& path, const std::string & exten, bool addPath)
	{
		std::vector<std::string> list = Directory::GetListFiles(path, exten, addPath);
		std::vector<std::string> dirs = Directory::GetListFolders(path, exten, addPath);

		std::vector<std::string>::const_iterator it;
		for (it = dirs.begin(); it != dirs.end(); ++it) {
			std::vector<std::string> cl = Directory::GetListFiles(*it, exten, addPath);
			list.insert(list.end(), cl.begin(), cl.end());
		}

		return list;
	}

	std::vector<std::string> Directory::GetListFolders(const std::string& path, const std::string & exten, bool addPath)
	{
		std::vector<std::string> list;
		std::string path_f = path + "/" + exten;
		list.clear();

		WIN32_FIND_DATAA FindFileData;
		HANDLE hFind;

		hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
		if (hFind == INVALID_HANDLE_VALUE) {
			return list;
		} else {
			do {
				if (FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY &&
					strcmp(FindFileData.cFileName, ".") != 0 &&
					strcmp(FindFileData.cFileName, "..") != 0) {
					char* fname;
					fname = FindFileData.cFileName;

					if (addPath) {
						list.push_back(path + "/" + std::string(fname));
					} else {
						list.push_back(std::string(fname));
					}
				}
			} while (FindNextFileA(hFind, &FindFileData));

			FindClose(hFind);
		}

		return list;
	}
}
测试代码:test_directory.cpp:

#include <string>
#include <vector>
#include <iostream>
#include "directory.hpp"
#include "test_directory.hpp"

int test_directory_GetListFiles()
{
	fbc::Directory dir;

	std::string path = "E:/GitCode/OpenCV_Test/test_images";
	std::string exten = "*.jpg"; //"*";
	bool addPath = false; //true;

	// 遍历指定文件夹下的所有文件,不包括指定文件夹内的文件夹
	std::vector<std::string> filenames = dir.GetListFiles(path, exten, addPath);

	std::cout << "file names: " << std::endl;
	for (int i = 0; i < filenames.size(); i++)
		std::cout <<"    "<< filenames[i] << std::endl;

	return 0;
}

int test_directory_GetListFilesR()
{
	fbc::Directory dir;

	std::string path = "E:/GitCode/OpenCV_Test/test_images";
	std::string exten = "*";
	bool addPath = true; //false

	// 遍历指定文件夹下的所有文件,包括指定文件夹内的文件夹
	std::vector<std::string> allfilenames = dir.GetListFilesR(path, exten, addPath);

	std::cout << "all file names: " << std::endl;
	for (int i = 0; i < allfilenames.size(); i++)
		std::cout <<"    "<< allfilenames[i] << std::endl;

	return 0;
}

int test_directory_GetListFolders()
{
	fbc::Directory dir;

	std::string path = "E:/GitCode/OpenCV_Test/test_images";
	std::string exten = "*d*"; //"*"
	bool addPath = false; //true

	// 遍历指定文件夹下的所有文件夹,不包括指定文件夹下的文件
	std::vector<std::string> foldernames = dir.GetListFolders(path, exten, addPath);

	std::cout << "folder names: " << std::endl;
	for (int i = 0; i < foldernames.size(); i++)
		std::cout << "    "<< foldernames[i] << std::endl;

	return 0;
}

GitHubhttps://github.com/fengbingchun/OpenCV_Test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV代码提取:遍历指定目录下指定文件的实现 的相关文章

  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • opencv createsamples没有错误,但是没有找到样本

    我在用着this http coding robin de 2013 07 22 train your own opencv haar classifier html教程 我正在根据我的正面图像创建大量样本 我正在使用 Windows 这是
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • OpenCV:视频结束后如何重新启动?

    我正在播放视频文件 但播放完毕后如何再次播放 Javier 如果您想一遍又一遍地重新启动视频 也称为循环播放 可以通过在帧数达到时使用 if 语句来实现cap get cv2 cv CV CAP PROP FRAME COUNT 然后重置帧
  • 如何在opencv python中为图像添加边框

    如果我有如下图所示的图像 如何在图像周围添加边框 以便最终图像的整体高度和宽度增加 但原始图像的高度和宽度保持在中间 下面的代码添加了一个大小恒定的边框10像素到原始图像的所有四个边 对于颜色 我假设您想要使用背景的平均灰度值 这是我根据图
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 如何计算图像中的 RGB 或 HSV 通道组合?

    我使用 python opencv 加载形状为 30 100 3 的图像 现在想要按颜色计算所有颜色的频率 我不是指单个通道 而是指通道组合 含义 3 个频道列表 例如 255 0 0 表示红色 255 255 0 表示黄色 100 100
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • OpenCV 错误:使用 COLOR_BGR2GRAY 函数时断言失败

    我在使用 opencv 时遇到了一个奇怪的问题 我在 jupyter 笔记本中工作时没有任何问题 但在尝试运行此 Sublime 时却出现问题 错误是 OpenCV错误 cvtColor中断言失败 深度 CV 8U 深度 CV 16U 深度
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 如何将输出视频保存到 OpenCV 中的文件中

    我想将输出视频保存到文件中而不是显示它并尝试使用 cvcaptureimage 但仍然无法获得结果 include
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • OpenCV 跟踪器:模型未在函数 init 中初始化

    在视频的第一帧 我运行一个对象检测器 它返回对象的边界框 如下所示
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 在 Visual Studio 2012 中安装 OpenCV

    我正在尝试安装 OpenCV 来与 Visual Studio 一起使用 我使用的是2012Pro版本 但我认为它应该与vs10相同 我正在关注这个教程 http docs opencv org doc tutorials introduc
  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2

随机推荐

  • Java 线程池

    今天准备详细介绍java并发包下的Executor 以及Java提供了很多灵活的且极其方便的线程池的创建 嗯 那就慢慢说 大家肯定都学过Socket JavaSe的时候写聊天程序 游戏的服务器 以及Android程序自己需要提供服务器的 都
  • js里面输入输出题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 1 宏任务和微任务 函数引用和变量引用 作用域和作用域链 同样是作用域链 1 宏任务和微任务 console log 1 async function async1
  • 长按开关机功能实现(不需要代码的实现方式,外围芯片)

    需要外围芯片的啊 最近发现的芯片EC190708 触摸模拟按键IC 长按三秒开关机 这自己用个51写个程序也一样吧 就输出一个高电平 控制一个MOS管就可以了 STC8便宜的才几毛 不比这个划算嘛 反正只是单片机用 说实话 单买价格挺贵的
  • Asio Line-Based Operations

    许多常用的internet协议是基于行的 这意味着他们具有由字符序列 r n 分隔的协议元素 这样的协议有HTTP SMTP和FTP 为更容易实现基于行的协议以及其他使用分隔符的协议 Asio包括read until 和async read
  • Job for network.service failed because the control process exited with error code问题

    今天在centOS 7下更改完静态ip后发现network服务重启不了 翻遍了网络 尝试了各种方法 终于解决了 现把各种解决方法归纳整理 希望能让后面的同学少走点歪路 首先看问题 执行service network restart命令后出现
  • SpringBoot自定义注解@Idempotent实现API幂等性(防止接口重复请求)

    目的 一定时间内 同样的请求 业务参数相同 访问同一个接口 则只能成功一次 其余被拒绝 自定义幂等性注解 import java lang annotation 幂等注解 Target ElementType METHOD Retentio
  • 用python实现学生成绩等级分级 和 猜拳游戏程序(python基础知识讲解(第二天))

    1 强制类型转换 a int 123 print type a 运行结果如下
  • Java OCR 图像智能字符识别技术,可识别中文

    几天一直在研究OCR技术 据我了解的情况 国内最专业的OCR软件只有2家 清华TH OCR和汉王OCR 看了很多的OCR技术发现好多对英文与数字的支持都很好 可惜很多都不支持中文字符 Asprise OCR Tesseract 3 0以前的
  • 【apifox/postman】使用技巧

    文章目录 一 apifox 1 1 设置全局变量 1 1 1 token 二 postman 2 1 设置全局变量 一 apifox 1 1 设置全局变量 1 1 1 token 首先设置 login 接口后 取 token 设置到 名为
  • 零基础,零成本,部署一个属于你的大模型

    前言 看了那么多chatGPT的文章 作为一名不精通算法的开发 也对大模型心痒痒 但想要部署自己的大模型 且不说没有算法相关的经验了 光是大模型占用的算力资源 手头的个人电脑其实也很难独立部署 就算使用算法压缩后的大模型 部署在个人电脑上
  • pytorch: 给tensor删除或者添加维度为1的维度(squeeze和unsqueeze)

    删除tensor中维度为1的维度 在pytorch中 用torch squeeze 函数或者tensor的自身成员函数squeeze 去除维度为1的维度 import torch x torch randn 3 1 4 1 2 a x sq
  • Servlet学习(八):Session

    一 Session的基本使用 1 概念 Session 服务端会话跟踪技术 将数据保存到服务端 Session是存储在服务端而Cookie是存储在客户端 存储在客户端的数据容易被窃取和截获 存在很多不安全的因素 存储在服务端的数据相比于客户
  • GDB 格式化结构体输出及记录到文件

    GDB 常用命令参考手册 set print address set print address on 打开地址输出 当程序显示函数信息时 GDB会显出函数的参数地址 系统默认为打开的 show print address 查看当前地址显示
  • JDBC五种连接方式详解

    目录 前言 二 JDBC程序编写步骤 1 总流程图如下 2 五种连接方式 2 1 数据库连接方式一 2 2 数据库连接方式二 2 3 数据库连接方式三 2 4 数据库连接方式四 2 5 数据库连接方式五 总结 前言 JDBC Java Da
  • 【计算机网络】 RTT和RTO

    文章目录 RTT 往返时延 RTO Retransmission Timeout 超时重传时间 RTT 往返时延 RTT Round Trip Time 是计算机网络中的一个重要的性能指标 表示从发送端发送数据开始 到发送端接收到来自接收端
  • STM32学习笔记——EXIT(外部中断)

    目录 一 什么是中断系统 二 中断系统执行流程 三 NVIC 提供中断控制器 CPU的好助手 1 NVIC的作用 STM32 2 NVIC优先级分组 四 EXTI 外部中断 1 EXTI简介 2 EXTI基本结构 3 EXTI框图 五 AF
  • elk笔记12--常见api和设置区别

    elk笔记12 常见api和设置区别 1 freeze 和 close 区别 1 1 freeze介绍 1 2 close介绍 2 persistent 和transient区别 3 两个allocation 说明 本文主要记录 es 中常
  • 《数据结构》将一个带头结点的单链表分解成两个单链表

    将一个带头结点的单链表分解成两个单链表 题目描述 设计一个算法 将一个带头结点的单链表分解成两个具有相同结构的 链表B和C 其中B白哦的结点为A中小于0的结点 C表的结点为A中大于0 的结点 要求B和C 仍利用A表的结点 A表的元素都是非0
  • pyqt5 QLabel详细用法

    QLabel控件类的主要API如下 setAlignment 设置文本的对齐方式 setIndent 设置文本缩进 text 获取文本内容 setText 设置文本内容 selectedText 返回所选择的字符 setBuddy 设置伙伴
  • OpenCV代码提取:遍历指定目录下指定文件的实现

    OpenCV 3 1之前的版本 在contrib目录下有提供遍历文件的函数 用起来比较方便 但是在最新的OpenCV 3 1版本给去除掉了 为了以后使用方便 这里将OpenCV 2 4 9中相关的函数给提取了出来 适合在Windows 64