반응형


웹캠으로부터 캡처된 영상에 일련번호를 붙여서 이미지 파일로 저장하는 예제입니다.



sprintf 함수를 사용하여 img_000000.jpg ~ img_999999.jpg 까지 이미지 파일 이름을 생성하는 방법을 사용하였습니다.


더 많은 이미지 파일을 저장하려면 %6d 부분을 수정하면 됩니다.


sprintf( buf, "img_%06d.jpg", index);



img_999999.jpg까지 저장하면 다시 img_000000.jpg 파일 이름으로 저장하도록 작성되었습니다.




실행결과 저장된 이미지파일들입니다.





사용한 코드는 다음과 같습니다.


#include <opencv2/opencv.hpp>
#include <iostream>  

using namespace cv;
using namespace std;



int main(int, char**)
{
int index = 0;
char buf[256];
Mat frameMat;


VideoCapture videoCapture(0);
if (!videoCapture.isOpened())
{
printf("첫번째 카메라를 열수 없습니다. \n");
}


namedWindow("웹캠 영상", WINDOW_AUTOSIZE);


while(1)
{

//웹캡으로부터 한 프레임을 읽어옴  
videoCapture.read(frameMat);

//화면에 보여줌
imshow("웹캠 영상", frameMat);

//이미지로 저장  
sprintf(buf, "c:/temp/img_%06d.jpg", index);
cout << buf << endl;
imwrite(buf, frameMat);

index++;
if (index == 999999) index = 0;

if (waitKey(25) == 27) break; //ESC키 누르면 종료  
}


return 0;
}




일련번호를 붙여서 저장한 이미지들을 다시 동영상처럼 보이게 하고 싶으면 아래 코드를 사용하면 됩니다.


#include <opencv2/opencv.hpp>
#include <iostream>  

using namespace cv;
using namespace std;



int main(int, char**)
{
int index = 0;
char buf[256];
Mat frameMat;


namedWindow("이미지 영상", WINDOW_AUTOSIZE);

while(1)
{

//이미지로 저장  
sprintf(buf, "c:/temp/img_%06d.jpg", index);
cout << buf << endl;


frameMat = imread(buf, IMREAD_COLOR);
if (frameMat.empty()) {

index = 0;
}
else {

imshow("이미지 영상", frameMat);
index++;
}


if (waitKey(25) == 27) break; //ESC키 누르면 종료  
}


return 0;
}




앞에서 생성한 이미지파일들에서 하나라도 삭제되지 않은 상태로 실행시킨다고 가정하고 있습니다.


buf에 저장된 이미지 파일을 읽어올 수 없다면 마지막 일련번호 파일을 모두 읽은 것으로 간주하고 index를 다시 0으로 설정합니다.


결과적으로 일련번호 순서대로 이미지 파일을 읽어와서 반복적으로 화면에 보여주게 됩니다.


frameMat = imread(buf, IMREAD_COLOR);
if (frameMat.empty()) {

index = 0;
}
else {

imshow("이미지 영상", frameMat);
index++;
}



반응형

문제 발생시 지나치지 마시고 댓글 남겨주시면 가능한 빨리 답장드립니다.

도움이 되셨다면 토스아이디로 후원해주세요.
https://toss.me/momo2024


제가 쓴 책도 한번 검토해보세요 ^^

+ Recent posts