2017-08-16 97 views
0

相机将图像以文件名模式作为“文件夹”+“程序名”+索引+“格式”存储到FTP服务器,其中索引是从一个到几乎一百亿的数字0000000001至9999999999)。路径和文件名是显示图像所必需的。需要在OpenCV上显示10个图像,所以我尝试使用函数ShowManyImages进行以下测试代码。使用循环声明Mat类

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; 
} 

到此为止,我可以显示图像1创建var变量。但是,这段代码很混乱,我不想创建img1,img2, ..., img10

因此,我试图做一些类似于varMat img,创建一个循环像For i = 1到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)); 
    
  • 还是有另一种/更好的办法?

+6

数组和/或向量与循环播放非常好。 – dasblinkenlight

+0

请参阅:[如何避免滥用标签?](https://meta.stackoverflow.com/questions/354427/how-do-i-avoid-misusing-tags) – EJoshuaS

回答

4

尝试使用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); 
} 
+0

@ tobi303那么,有一个过载,对于['std :: string :: operator +'](http://en.cppreference.com/w/cpp/string/basic_string/operator%2B),它将'char'作为'rhs'(过载# 5在上述文件中)。因此,编译器可能会调用它,同时发出关于缩小转换的警告。它不会做OP所期望的,因为它会导致最可能的不可打印字符被附加到'std :: string'。 –

+0

由于C++ 11,可以使用std :: to_string(http://en.cppreference.com/w/cpp/string/basic_string/to_string)将int添加到字符串中。我在示例代码中修正了这个遗漏。我将std :: to_string添加到int中作为执行转换的一种可能方式,并且是OP在尝试中使用的方法。 – Mepix

+0

@Mepix谢谢,它工作!只需要从'void ShowManyImages(string title,int nArgs,...)'将函数showManyImages添加到'int showManyImages(const String winName,const std :: vector images)'中。 – danieltakeshi