c++ - 如何从OpenCV中的目录中依次读取文件并用于处理?
问题描述
当我尝试编译这段代码时,我收到了这个错误-
错误:没有匹配函数调用 'glob(std::__cxx11::string&, std::vector >&, bool)' glob (folder, filename, false); ^
这是我使用的代码:
#include <vector>
#include <glob.h>
string folder = "/home/ragesh/C++ /calibration_laptop/images/*.jpg";
vector <string> filename;
glob(folder, filename, false);
if(count < filename.size())
{
img = imread(filename[count]);
if(img.empty())
{
cout << "\nimage loading failed.....!"<<"\n";
return 0;
}
imshow("image", img);
cvtColor ( img,gray, COLOR_BGR2GRAY );// gray scale the source image
vector<Point2f> corners; //this will be filled by the detected corners
bool patternfound = findChessboardCorners(gray, boardSize, corners, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);
count ++;
}
解决方案
该函数cv::glob
具有以下签名:
void cv::glob(cv::String pattern, std::vector<cv::String>& result, bool recursive = false)
由于pattern
是按值传递,并且 acv::String
可以从 a 构造std::string
,所以第一个参数不是问题。临时cv::String
自动构建。
但是,第二个 -- result
-- 是,因为它被视为非常量引用。为了解决您的问题,您需要制作filename
一个std::vector<cv::String>
. 由于它代表文件名的集合,我还建议使用复数来命名它:filenames
.
示例代码:
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
int main()
{
std::string folder("/home/ragesh/C++ /calibration_laptop/images/*.jpg");
std::vector<cv::String> filenames;
cv::glob(folder, filenames, false);
// Do something with filenames...
return 0;
}
更新:
我从签名和您问题上的标签中得出结论,您正在使用 OpenCV glob
(不完整的代码示例使这有些困难)。但是,请注意您包含的标题是针对Posixglob
函数的。
很有可能这是问题的另一个原因。
为了完整起见,让我列出我在您的代码示例中发现的其他问题:
- 缺少包括(opencv,字符串)
- 缺少命名空间限定符(
std::
或cv::
--避免using namespace
在顶层) - 不
main()
- 函数外的代码
- 相关位之后还有一堆其他不相关的代码,我不会进一步分析(但大约 80% 的代码示例是不相关的)。
推荐阅读
- apache-spark - 没有组/聚合的 Spark SQL HAVING 子句
- java - 我不能在 Servlet url-pattern 中添加任何目录路径吗?
- amazon-web-services - AWS CDK - 部署后操作
- c# - 模拟的 UserManager 在测试中并没有真正按预期工作
- r - 在 R 中解析时间格式
- react-native - React Native:为什么文本组件下不显示长文本?
- regex - 根据 Java 中的 RFC 1035 标准检查域名
- java - 如何在 Spring 中获取 Cognito 用户组?
- javascript - 动态创建后第一次单击时不显示下拉菜单
- scala - 从 Seq[T] 中提取类型 T