【问题标题】:Using a loop to declare a Mat class使用循环声明一个 Mat 类
【发布时间】:2017-08-16 18:47:33
【问题描述】:

相机将图像存储到 FTP 服务器,文件名模式为“文件夹”+“程序名”+索引+“格式”,其中索引是从 1 到近 100 亿的数字(0000000001 到 9999999999)。显示图像需要路径和文件名。在OpenCV上需要显示10张图片,所以我尝试使用函数ShowManyImages制作以下测试代码。

int main() {
int img_ini = 1;
std::string img_path = "../data/";
std::string img_name = "img";
std::string img_format = ".bmp";
std::string var;
var = img_path + img_name + std::to_string(img_ini) + img_format;

Mat img1 = imread(var);
Mat img2 = imread("../data/img2.bmp");
Mat img3 = imread("../data/img3.bmp");
Mat img4 = imread("../data/img4.bmp");
Mat img5 = imread("../data/img5.bmp");
Mat img6 = imread("../data/img6.bmp");
Mat img7 = imread("../data/img6.bmp");
Mat img8 = imread("../data/img6.bmp");
Mat img9 = imread("../data/img6.bmp");
Mat img10 = imread("../data/img6.bmp");
ShowManyImages("Image", 10, img1, img2, img3, img4, img5, img6, img7, img8, img9, img10);

return 0;
}

至此,我可以展示创建 var 变量的图像 1。但是,这段代码很乱,我不想创建img1,img2, ..., img10

所以我尝试制作类似于 varMat img 所做的事情,创建像 For i=1 To 10 Mat img + i = imread(img_path + img_name + std::to_string(img_ini + i) + img_format;) 这样的循环。但是没办法,因为 Mat() 不如 imread()。

  • 有没有办法制作类似于上述 for 循环的东西?
  • 或者创建一个 void 函数更好:

    Mat img1 = imread(var(1));
    Mat img2 = imread(var(2));
    Mat img3 = imread(var(3));
    Mat img4 = imread(var(4));
    Mat img5 = imread(var(5));
    Mat img6 = imread(var(6));
    Mat img7 = imread(var(7));
    Mat img8 = imread(var(8));
    Mat img9 = imread(var(9));
    Mat img10 = imread(var(10));
    
  • 或者还有其他/更好的方法吗?

【问题讨论】:

标签: c++ opencv computer-vision


【解决方案1】:

尝试使用 Mats 向量。有几种方法可以加载和显示它们。

std::vector<cv::Mat> myMatArray;
for(int i = 0; i < numberOfPicturesToLoad; i++){
   std::string imgToLoad = img_path + img_name + std::to_string(i) + img_format;
   cv::Mat temp = imread(imageToLoad);
   myMatArray.push_back(temp);
}

【讨论】:

  • @tobi303 好吧,std::string::operator+ 有一个重载,它将 char 接收为 rhs(上述文档中的重载 #5)。因此,编译器可能只是调用它,同时发出有关缩小转换的警告。它并没有达到 OP 的预期(因为它很可能会导致不可打印的字符被附加到 std::string)。
  • 从 C++11 开始,可以使用 std::to_string (en.cppreference.com/w/cpp/string/basic_string/to_string) 将 int 添加到字符串中。我修复了示例代码中的遗漏。我将 std::to_string 添加到 int 作为一种可能的转换方式,并且是 OP 在尝试中使用的方法。
  • @Mepix 谢谢,它成功了!只需将函数 showManyImages 从void ShowManyImages(string title, int nArgs, ...) 更改为int showManyImages(const String winName, const std::vector&lt;cv::Mat&gt; images)
猜你喜欢
  • 2011-02-23
  • 2016-07-13
  • 2015-03-04
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
相关资源
最近更新 更多