2013-03-11 2 views
4

Я пытаюсь сохранить последовательность изображений в visual studio 2008, все с префиксом «Изображение». Единственным дифференцирующим фактором должно быть их число. , например, если я собираюсь сохранить 10 изображений, то ситуация должна бытьОбъединение целого числа в строку

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

поэтому мне нужна concatenete целого числа со строкой ... с нетерпением ждет ответа ...

+2

Чем ваш вопрос не о сохранении последовательности изображений, а о строковых манипуляциях. – StoryTeller

+0

имя персонажа [50]; sprintf (имя, "filename% d.jpg", 10); // проверяем также snprintf на печать не более 50 символов. –

+0

@AkiSuihkonen, это не способ C++, но опубликуйте его как ответ, чтобы проблема была разрешена. – StoryTeller

ответ

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

редактировать

Родовой и, возможно, более эффективный способ построения строк является использовать a 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); 
Смежные вопросы