C && C++

동영상 캡쳐 프로그램 (C++/Opencv)

힘법사 2022. 1. 6. 16:56
728x90

안녕하세요 오늘은 제가 동영상 캡쳐 프로그램을 보여드리도록 하겠습니다.

 

0.간단한 설명

프로그램은 C++Opencv를 이용해서 제작하였습니다.

프로그램은 지정된 동영상 파일들을 재생시키고 사용자가 동영상을 확인하면서 이미지 형태로 영상을 캡쳐할 수 있도록 해줍니다. 소스코드 또한 글 맨뒤에 포함하겠습니다.

 

Opencv 설치법은 아래 링크에서 보실 수 있습니다.

OpenCV 설치하기(C++) (tistory.com)

 

OpenCV 설치하기(C++)

 안녕하십니까, 힘법사입니다. 오늘은 OpenCV 설치법에 대해서 알아보도록 하겠습니다! 1. 설치 파일 다운로드 Releases - OpenCV Releases - OpenCV Become a Member Stay up to date on OpenCV and Computer Vi..

himbopsa.tistory.com

 

1. 시작

https://drive.google.com/file/d/1Pym_k0LYyrHHImvM2ZluCg7F_eD-uPfe/view?usp=sharing 

 

Google Drive - 모든 파일을 한 곳에서

하나의 계정으로 모든 Google 서비스를 Google Drive로 이동하려면 로그인하세요.

accounts.google.com

728x90

우선 해당 링크에서 파일을 다운받으실 수 있습니다.

 

그림. 프로그램 풀더와 파일들

다운 받으시 파일을 푸시면 위와 같이 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;
}

 

 

728x90