안녕하세요 오늘은 제가 동영상 캡쳐 프로그램을 보여드리도록 하겠습니다.
0.간단한 설명
프로그램은 C++와 Opencv를 이용해서 제작하였습니다.
프로그램은 지정된 동영상 파일들을 재생시키고 사용자가 동영상을 확인하면서 이미지 형태로 영상을 캡쳐할 수 있도록 해줍니다. 소스코드 또한 글 맨뒤에 포함하겠습니다.
Opencv 설치법은 아래 링크에서 보실 수 있습니다.
OpenCV 설치하기(C++) (tistory.com)
1. 시작
https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing
우선 해당 링크에서 파일을 다운받으실 수 있습니다.
다운 받으시 파일을 푸시면 위와 같이 Video_capture로 불리는 실행시킬 수 있는 응용 프로그램과 캡쳐 이미지가 저장되는 save 풀더 그리고 캡쳐를 원하는 영상을 담는 target_vid로 이뤄져있습니다.
2. 작업 영상 배치
앞선 설명과 같이 실행 전 작업을 원하는 영상들을 target_vid 풀더에 넣어줍니다. 영상의 수는 관계없습니다. 예를 들어 5개의 영상을 넣어주게 되면 프로그램 실행 시 모두 작업에 들어가게 됩니다.
3.프로그램 실행
프로그램의 실행 법은 Video_capture.exe를 실행 시켜 주면 됩니다.
보시면 간단한 동작 방법과 함께 Enter를 누르면 시작한다고 안내해주는 메세지들을 볼 수 있습니다.
s 키를 누르면 파일이 저장되고
스페이스바를 누르면 현재 보고 있는 영상의 일시정지와 다시 재생을 할 수 있습니다.
Enter를 눌러 시작하게되면 위의 그림과 같이 작업 영상을 보여줍니다. 여기서 앞서 설명한 키를 조작해 가며 작업을 해나갈 수 있습니다.
네 오늘은 제가 예전에 개인적으로 영상 캡쳐들에 이용하기 위해서 만든 프로그램이었습니다.
감사합니다.
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <Windows.h>
#include <conio.h> //_getch가 포함되어있는 헤더
using namespace cv;
using namespace std;
struct _finddata_t fd;
int vid_num = 0;
vector<string> split(string input, char delimiter) {
vector<string> answer;
stringstream ss(input);
string temp;
while (getline(ss, temp, delimiter)) {
answer.push_back(temp);
}
return answer;
}
int isFileOrDir()
{
if (fd.attrib & _A_SUBDIR)
return 0; // 디렉토리면 0 반환
else
return 1; // 그밖의 경우는 "존재하는 파일"이기에 1 반환
}
string * FileSearch(char file_path[])
{
string* vid_arr;
vid_arr = new string[300];
intptr_t handle;
int check = 0;
char file_path2[_MAX_PATH];
strcat(file_path, "\\");
strcpy(file_path2, file_path);
strcat(file_path, "*");
if ((handle = _findfirst(file_path, &fd)) == -1)
{
printf("No such file or directory\n");
}
while (_findnext(handle, &fd) == 0)
{
char file_pt[_MAX_PATH];
strcpy(file_pt, file_path2);
strcat(file_pt, fd.name);
check = isFileOrDir(); //파일인지 디렉토리 인지 식별
if (check == 0 && fd.name[0] != '.')
{
FileSearch(file_pt); //하위 디렉토리 검색 재귀함수
}
else if (check == 1 && fd.size != 0 && fd.name[0] != '.')
{
cout << "check" << endl;
for (int tmp = 0; tmp < 120; tmp++) {
if (file_pt[tmp] == 92) {
file_pt[tmp] = 47;
}
}
vid_arr[vid_num] = file_pt;
vid_num++;
printf("파일명 : %s, 크기:%d\n", file_pt, fd.size);
}
}
return vid_arr;
_findclose(handle);
}
int main() {
char file_path[_MAX_PATH] = "./target_vid"; //C:\ 경로 탐색
string* vid_arr;
vid_arr = FileSearch(file_path);
cout << vid_num << endl;
cout << "======================================================" << endl;
cout << " Video Capture S/W 20210801 CHJ Version = 1.0.0 " << endl;
cout << "======================================================" << endl;
cout << " ↓↓↓Basic Control Key↓↓↓ " << endl;
cout << " s = save current file " << endl;
cout << " space bar = pause video / restart video" << endl;
cout << "======================================================" << endl;
cout << "**hello if you want to start program press [enter]**" << endl;
getchar();
for (int i = 0; i < vid_num; i++) {
int save_cnt = 0;
vector<string> result = split(vid_arr[i], '/');
vector<string> vid_name_arr = split(result[2],'.');
string pure_video_name = vid_name_arr[0];
cout << "now reading : " << pure_video_name << endl;
VideoCapture cap(vid_arr[i]);
//cap.set(CV_CAP_PROP_FRAME_WIDTH, 1920);
//cap.set(CV_CAP_PROP_FRAME_HEIGHT, 1080);
if (!cap.isOpened())
{
printf("Can't open the camera");
return -1;
}
Mat img;
while (1)
{
if (_kbhit()) {
char c;
cout << "Key hit!!" << endl;
c = _getch();
if (c == 120) {
cout << "stop input" << endl;
exit(0);
}
else if (c == 32) {
cout << "waiting for input..." << endl;
while (true) {
if (_kbhit()) {
c = _getch();
if (c == 115) {
cout << "Save" << endl;
imwrite("./save/" + pure_video_name + to_string(save_cnt) + ".jpg", img);
save_cnt++;
}
else if (c == 32) {
cout << "Restart" << endl;
break;
}
}
}
}
else if (c == 115) {
cout << "Save" << endl;
imwrite("./save/" + pure_video_name + to_string(save_cnt) + ".jpg", img);
save_cnt++;
}
else {
cout << "wrong input" << endl;
}
}
cap >> img;
if (img.empty())
{
printf("empty image");
cap.release();
cout << "num : " << vid_num << endl;
break;
}
Mat img_for_display;
int xsize = img.cols;
int ysize = img.rows;
if (xsize > 1200) {
xsize /= 2;
ysize /= 2;
}
else if (ysize > 1200) {
xsize /= 2;
ysize /= 2;
}
resize(img, img_for_display, Size(xsize, ysize));
imshow("camera img", img_for_display);
if (waitKey(25) == 27) {
break;
}
}
}
return 0;
}
'C && C++' 카테고리의 다른 글
[C/C++] main 함수 (0) | 2022.01.25 |
---|---|
[C] 입력 버퍼 비우기 (0) | 2022.01.18 |
[C++] 이진트리(binary tree) 전위 순회, 중위 순회, 후위 순회, 레벨 순서 순회 (0) | 2021.11.12 |
[C++] Adaptive Huffman Coding(적응형 허프만 코딩) (0) | 2021.11.10 |
[C++] DCT / IDCT / Quantization / De-Quantization 코드 (0) | 2021.11.10 |