kookmin-sw / 2019-cap1-2019_4

Flex Ads to implement advertising system in offline market
MIT License
10 stars 7 forks source link

C++ 코드에서 Time series 에 따른 Filename 의 지정 #25

Closed james-sungjae-lee closed 5 years ago

james-sungjae-lee commented 5 years ago

시간에 따라 이미지를 저장하기 위해서는

단일 Filename 이 아닌 실시간으로 변화하는 filename 이 필요하다

이를 해결하기 위해 현재 시간을 확인하고, 이를 char[] 형태로 변환하는 과정이 필요하다

관련 자료는 strftime 을 이용한다는 것 까지 조사하였다.

james-sungjae-lee commented 5 years ago

https://stackoverflow.com/questions/22318389/pass-system-date-and-time-as-a-filename-in-c

해당 자료를 참고 및 활용하여 저장이 가능할 것으로 보인다.

하지만 해당 데이터는 년, 월, 일에 대해서만 나타나 있기 때문에

시간, 분, 초, 밀리초 까지 인식하는 과정이 필요하다.

james-sungjae-lee commented 5 years ago

해당 코드를 참고하여 filename 이름의 char 배열을 생성하였다.

time_t t = time(0); struct tm* now = localtime(&t) char filename[80]; strftime (filename, 80, "%Y%m%d-%H%M%S.PNG", now);

해당 코드를 filename 이 사용되기 이전의 for loop 밖에 작성하고, filename 변수를 사용하면 된다. 이 때, PNG 와 같은 이미지 확장자를 명시하지 않으면 저장되지 않는다는 점을 확인할 수 있었다.

추가적으로 %L 을 이용하면 밀리초의 작성이 가능하다고 확인하였으나, 정확하지 않은 정보였다.

Screenshot from 2019-03-29 05-39-32

이미지 cropping 하기 이전 단계에서 filename 을 확인하기 위한 테스트 진행 상황이다.

밀리초의 작성과 관련하여서는 다음의 링크를 참고할 수 있을 것으로 보인다.

https://codereview.stackexchange.com/questions/11921/getting-current-time-with-milliseconds

james-sungjae-lee commented 5 years ago

해당 사항에 대한 구현은 다음과 같이 이루어졌다.

이미지 데이터를 저장하기 위해 저장될 이미지 파일명을 detect 된 시간으로 지정하기 위해 먼저 curTime 을 이용하여 milli 초를 계산하여 milli 변수에 저장한다.

timeval curTime; gettimeofday(&curTime, NULL); int milli = curTime.tv_usec / 1000;

그 다음, 현재 시간을 local time 에 맞추어 now 변수에 저장한다.

time_t t = time(0); struct tm* now = localtime(&t);

그리고 밀리초를 제외한 파일명(년, 월, 일, 시, 분, 초)를 buffer 배열에 저장한다.

char buffer[80];

밀리초를 제외한 시간을 strftime 을 이용하여 now 로부터 시간을 가져와 buffer 에 저장한다.

strftime(buffer, 80, "%Y%m%d-%H%M%S", now);

밀리초와 이미지 확장자를 추가하여 filename 배열에 저장한다.

char filename[100]; sprintf(filename, "%s%d.PNG", buffer, milli);

그 결과, filename 에는 적절한 밀리초가 합쳐진 데이터가 char 배열 형태로 입력되게 된다.

실험 결과는 다음과 같다.

Screenshot from 2019-04-02 09-11-26