2013-03-11 127 views
4

我试图在Visual Studio 2008中保存一系列图像,所有图像的前缀都是“Image”。 唯一的区别因素应该是他们的数量。 例如,如果我要节省10个图像那么情况应该是将整数连接到字符串

i=1; 
while(i<10) 
{ 
cvSaveImage("G:/OpenCV/Results/Imagei.jpg",img2); 
i++ 
//"i" is gonna be different every time 
} 

,所以我需要concatenete与串... 期待答案整数...

+2

比你的问题不是保存图像序列,而是关于字符串操作。 – StoryTeller 2013-03-11 11:57:07

+0

char name [50]; sprintf(名称,“文件名%d.jpg”,10); //还可以检查snprintf以最多50个字符进行打印。 – 2013-03-11 11:59:00

+0

@AkiSuihkonen,这不是C++的方式,但将其作为答案发布,以便可以解决问题。 – StoryTeller 2013-03-11 12:00:19

回答

5

了C++方式(预C++ 11)将是:

#include <sstream> 
... 
ostringstream convert; 
convert << "G:/OpenCV/Results/Image" << i << ".jpg"; 
cvSaveImage(convert.str().c_str(), img2); 
i++; 
0
string imgname="./Image_"; 
char cbuff[20]; 
sprintf (cbuff, "%03d", i); 
imgname.append(cbuff); 
imgname.append(".jpg"); 

输出:

./Image_001.jpg 
./Image_002.jpg 
./Image_010.jpg etc. 
1

首先,如果您从i = 10开始并执行while(i < 10),那么您的代码将只保存9个项目。现在,你的问题,

for(i = 1; i < 11; i++) 
{ 
    std::stringstream imagenum; 
    imagenum << "G:/OpenCV/Results/Image" << i << ".jpg" ; 
    cvSaveImage(imagenum.str().c_str(), img2) ; 
} 

检查example_link

3

用C++ 11:

#include <string> 

string filename = "G:/OpenCV/Results/Image" + to_string(i) + ".jpg"; 
cvSaveImage(filename.c_str(), img2); 

编辑

建筑串的通用的,可能更有效的方法是使用一个stringstream

ostringstream ss; 

ss << "G:/OpenCV/Results/Image" << i << ".jpg"; 

string filename = ss.str(); 
cvSaveImage(filename.c_str(), img2); 

这也适用于pre-C++ 11编译器。

1

的OpenCV自带简历::格式()这可能只是一个sprintf的包装,但是很方便,恕我直言]

所以,你的例子看起来是这样:

cv::imwrite(cv::format("G:/OpenCV/Results/Image%d.jpg", i), img); 

,或者,如果你坚持使用过时的1.0 API:

cvSaveImage(cv::format("G:/OpenCV/Results/Image%d.jpg", i).c_str(), img);