2013-03-11 83 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);