https://subicura.com/git/guide/#git%E1%84%8B%E1%85%B4-%E1%84%90%E1%85%B3%E1%86%A8%E1%84%8C%E1%85%B5%E1%86%BC

 

시작하기

Git/GitHub 안내서를 소개합니다.

subicura.com

 

'Study' 카테고리의 다른 글

참고 사이트  (0) 2021.12.03

'땡땡 > 정보' 카테고리의 다른 글

제 59회 한국사능력검정시험  (0) 2022.04.29
2022년 제57회 한국사능력검정시험  (0) 2022.01.01
2022년 정보처리기사  (0) 2021.12.29

https://www.historyexam.go.kr/

 

한국사능력검정시험

[원서접수 불가] 5.20.(금) 09:00 ~ 10:00

www.historyexam.go.kr

[원서 접수 기간]

인천/경기 : 5월16일(월) 10:00 ~ 5월17일(화) 09:00 

 

[사진등록(변경)기간]

5월24일(화) 10:00 ~ 6월11일(토) 10:00

 

[시험장 변경 기간]

5월24일(화) 10:00 ~ 6월5일(일) 18:00

 

[시험일]

2022년 6월 11일(토) 10:00

 

'땡땡 > 정보' 카테고리의 다른 글

2022년 제 3회 정보처리 기사  (0) 2022.04.29
2022년 제57회 한국사능력검정시험  (0) 2022.01.01
2022년 정보처리기사  (0) 2021.12.29

VideoCapture 클래스

연결되어 있는 카메라 또는 동영상 파일로부터 정지 영상을 받아 올 수 있는 클래스

 

① 동영상 파일

원형 : VideoCapture::VideoCapture(const String& filename, int apiPreference = CAP_ANY);

 

filename

.avi, .mpg, .mp4등의 확장자를 갖는 동영상 파일의 경로

비디오 스트림 URL 지정가능(인터넷 동영상)

 

apiPreference 

동영상 파일을 불러오는 방법

 

< 종류 >

CAP_ANY : 자동 선택

CAP_V4L, CAP_V4L2 : V4L/V4L2(리눅스)

CAP_FIREWIRE, CAP_FIREWARE, CAP_IEEE1394 : IEEE1394 드라이버

CAP_DSHOW : 다이렉트 쇼

CAP_PVAPI : PvAPI, Prosilica GigE SDK

CAP_OPENNI : OpenNI

등등

 

② 카메라 장치

원형 : VideoCapture::VideoCapture(int index, int apiPreference = CAP_ANY);

 

index

카메라 ID

컴퓨터에 하나의 카메라만 연결되어 있다면 index = 0

컴퓨터에 두대 이상의 카메라가 연결되어 있다면 index는 0보다 같거나 큰 정수(두대 일 경우 0,1)

 

apiPreference 

동영상 파일을 불러오는 방법

 

< 종류 >

CAP_ANY : 자동 선택

CAP_V4L, CAP_V4L2 : V4L/V4L2(리눅스)

CAP_FIREWIRE, CAP_FIREWARE, CAP_IEEE1394 : IEEE1394 드라이버

CAP_DSHOW : 다이렉트 쇼

CAP_PVAPI : PvAPI, Prosilica GigE SDK

CAP_OPENNI : OpenNI

등등

③  isOpened()

원형 : virtual bool VideoCapture::isOpened() const;

연결된 카메라 or 동영상 열기 작업이 성공적으로 수행되었는지 확인

반환값 : 성공 시 true, 실패 시 false

 

release()

원형 : virtual void VideoCapture::release();

카메라 혹은 동영상 파일의 사용이 끝난 뒤 자원 해제

 

⑤ read(OutputArray image)

원형 : bool VideoCapture::read(OutputArray image);

= 원형 : VideoCapture& VideoCapture::operator >> (Mat& image);

카메라 또는 동영상 파일로부터 한 프레임의 정지 영상을 받아 옴

 

image

다음 비디오 프레임을 의미하며 프레임이 없다면 비어있는 행렬로 설정

반환값 : 프레임을 받아 올 수 없다면  false반환

 

grab() , retrieve()

원형 : VideoCapture::grab();

카메라 장치에 다음 프레임을 획득하라는 명령을 내리는 함수

 

원형 : VideoCapture::retrieve();

획득한 프레임을 실제로 받아오는 함수

 

* grab() + retrieve() = operator >>() or read()

 

get(int propId)

원형 : double VideoCapture::get(int propId) const;

열려 있는 카메라 or 동영상으로부터 정보를 받아오는 함수

 

반환 : 지정한 속성 값인 속성 값을 반환, 지정한 속성을 얻을 수 없으면 0 반환

 

예) 카메라의 프레임 크기를 확인하는 코드

	VideoCapture cap(0);

	// double자료형 반환 값을 cvRound()함수를 이용하여 반올림
	int w = cvRound(cap.get(CAP_PROP_FRAME_WIDTH));		
	int h = cvRound(cap.get(CAP_PROP_FRAME_HEIGHT));

propId

VideoCaptureProperties 열거형 중 하나를 지정

CAP_PROP_POS_MSEC  비디오 파일에서 현재 위치(밀리초 단위)
CAP_PROP_POS_FRAMES  현재 프레임 위치(0-기반)
CAP_PROP_POS_AVI_RATIO  [0, 1] 구간으로 표현한 동영상 프레임의 상대적 위치( 0 : 시작, 1 : 끝 )
CAP_PROP_FRAME_WIDTH  비디오 프레임의 가로 크기
CAP_PROP_FRAME_HEIGHT  비디오 프레임의 세로 크기
CAP_PROP_FPS  초당 프레임 수
CAP_PROP_FOURCC  fourcc 코드 ( 코덱을 표현하는 정수 값 )
CAP_PROP_FRAME_COUNT  비디오 파일의 전체 프레임 수
CAP_PROP_BRIGHTNESS  밝기 조절
CAP_PROP_CONTRAST  명암비 조절
CAP_PROP_SATURATION  채도 조절
CAP_PROP_HUE  색상 조절
CAP_PROP_GAIN  감도 조절
CAP_PROP_EXPOSURE  노출 조절
CAP_PROP_ZOOM  줌 조절
CAP_PROP_FOCUS  초점 조절

 

⑥ set(int propId, double value)

원형 : bool VideoCapture::set(int propId, double value);

 

propId

VideoCaptureProperties 열거형 중 하나를 지정 (*위 표 참고)

 

value

지정할 속성 값

 

반환

가능 할 경우 true, 실패 할 경우 false 반환

 


[코드]

#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>

#include <iostream>
#include <stdio.h>

using namespace cv;
using namespace std;


int main(int ac, char** av) {
	
	VideoCapture cap(0);				// index = 0

	// double자료형 반환 값을 cvRound()함수를 이용하여 반올림
	cout << "Frame width: " << cvRound(cap.get(CAP_PROP_FRAME_WIDTH)) << endl;
	cout << "Frame height: " << cvRound(cap.get(CAP_PROP_FRAME_HEIGHT)) << endl;

	// 카메라 장치가 정상적으로 열렸는지 확인
	if (!cap.isOpened())				
	{
		printf("Can't open the camera");
		return -1;
	}

	Mat frame , inversed;

	while (true)
	{
    	// frame 변수에 하나의 정지된 프레임 저장
		cap.read(frame);

		// 카메라로부터 받아온 프레임이 없을 경우 종료
		if (frame.empty())
		{
			break;
		}

		inversed = ~frame;

		// 영상 출력
		imshow("camera LIVE", frame);
		imshow("camera LIVE2", inversed);

		// 1ms기다린 뒤 다음 프레임을 받아옴, Enter키 입력 시 종료
		if (waitKey(1) == 13)
		{
			break;
		}
	}

	destroyAllWindows();

	return 0;
}

[실행화면]

'Study > OpenCV C++' 카테고리의 다른 글

[OpenCV C++] imread(), imshow()  (0) 2022.02.18
int main(int ac, char** av) {

	Mat img = imread("Lenna.png");

	imshow("img", img);
	waitKey(0);

	return 0;
}

 


1. imread()  : 이미지 불러오기

원형 : Mat cv::imread( const String& filename, int flags = IMREAD_COLOR)

 

filename 

불러오고자 하는 이미지의 경로 입력

불러오고자 하는 이미지가 프로젝트 폴더 안에 있다면 파일이름(확장자까지) 입력

 

flags

image read type 설정

< flag 종류 >

IMREAD_COLOR  : 3채널, 이미지파일을 컬러(BGR)로 로드하며 투명한 부분은 모두 무시. default값

IMREAD_GRAYSCALE  : 1채널, 이미지파일을 흑백으로 로드한다.

IMREAD_UNCHANGED  : 이미지파일을 알파채널을 포함하여 원본 그대로 로드한다. 

IMREAD_LOAD_GDAL : 이미지파일을 GDAL 드라이버를 활용하여 로드한다. (GDAL : 지도관련 이미지 처리)

IMREAD_ANYDEPTH : 정밀도를 16/32비트 또는 6비트로 로드한다.

IMREAD_ANYCOLOR : 가능한 3채널, 색상 이미지로 로드

IMREAD_REDUCED_GRAYSCALE_2 : 1채널, 1/2크기, 흑백 로드 

IMREAD_REDUCED_GRAYSCALE_4 : 1채널, 1/4크기, 흑백 로드

IMREAD_REDUCED_GRAYSCALE_8 : 1채널, 1/8크기, 흑백 로드

IMREAD_REDUCED_COLOR_2 : 3채널, 1/2크기, 컬러 로드 

IMREAD_REDUCED_COLOR_4 : 3채널, 1/4크기, 컬러 로드 

IMREAD_REDUCED_COLOR_8 : 3채널, 1/8크기, 컬러 로드 

 

2. imshow()  : 이미지 보여주기

원형 : void cv::imshow(const String& winname, InputArray mat);

 

winname

출력할 대상의 창 이름

 

mat

출력할 이미지 데이터(Mat 객체)

 

3. waitKey()  : 키 입력 대기

원형 : int cv::waitKey(int delay = 0);

 

delay

키 입력을 기다릴 시간(ms / ex : 3초 = 3000ms)

 

반환 값

눌려진 키 값. 지정한 시간동안 키가 눌려지지 않았을 경우 -1 return 

 

* waitKey() 사용하지 않을 경우, 윈도우 창이 유지 되지 않고 프로그램 종료됨.

 

- enter키를 누를 때만 종료하고 싶다면,  enter의 아스키코드 값인 13을 설정해주면 된다.

	while (true)
	{
		if (waitKey() == 13) break;
	}

'Study > OpenCV C++' 카테고리의 다른 글

[OpenCV C++] VideoCapture  (0) 2022.02.18


* Thread(스레드)간 Priority(우선순위)가 다른 경우 사용된다.

 

1. Sleep(0)

: 우선순위가 같은 Thread가 ready to run 상태가 되면 자신이 쥐고 있던 CPU의 선점을 풀어 Context Switching이 이루어진다. 만약 Thread간 우선 순위가 같지 않다면 자신이 쥐고 있던 CPU 선점을 풀지 않는다. 

 

2 .Sleep(1)

: 우선순위에 상관 없이 다른 Thread가 ready to run 상태가 되면 자신이 쥐고 있던 CPU의 선점을 풀어 Context Switching이 이루어진다.


[출처] https://valueelectronic.tistory.com/236

 

sleep(0)와 sleep(1)의 차이점

Sleep(0)의 경우, 다른 Thread가 ready to run 되었다고 해서 자신이 쥐고 있던 CPU의 선점을 풀지 않습니다. 선점을 풀려면 조건이 있는데 그 ready to run 인 Thread가 지금 선점한 Thread와 우선순위가 equal이..

valueelectronic.tistory.com

 

그 환자 - 재스퍼 드윗 (Jasper DeWitt)

< 지은이 >

재스퍼 드윗(Jasper Dewitt)

필명이며 본명과 신원은 알려진 바 없다.

 

내가 엄청난 비밀을 알고 있는건지
아니면 나 자신이 미쳐버린 건지
현재로서는 확신이 서지 않아 이 글을 쓴다.
이런 상태로 계속 정신과 의사로 인한다는 것은,
분명 윤리적으로나 사업적인 관점에서도
좋지 않은 일일 것이다.
하지만 맹세컨대 나는 미치지 않았다.
그러니 이런 일이 가능하다고
조금이나마 믿어줄 수 있는 여러분에게
이 이야기를 풀어보고자 한다.
내게 이 일은 인류에 대한 책임의 문제이다.


< 줄거리 >

엘리트 정신과 의사, 파커는 병원에 부임한 첫날 가장 난

해하고 심히 위험한 케이스의 환자를 알게 된다. 여섯 살

음 입원 한 후 진단 불명 상태로 30년간 수용되어 있

는 환자. 그를 치료하려 했던 모든 의료진이 미치거나자살

하면서, 모두의 안전을 위해 제한된 인원만이 그와접촉하

허용되는 상황이다.

 

'그 환자'를 둘러싼 기괴한 소문에 매료된 파커는 주변의 반

대에도 불구하고 자신이 맡아 치료하겠다고 지원한다.하지

진단을위해 환자와 처음 대면한 순간부터 모든 것이 통제

해지고, 상황은 상상 이상의 격렬한 수준으로 치닫는

다. 무진실이고 어디서부터 잘못된 건지 확신할 수 없는

상황에서, 안다고 믿었던 모든 것에 의문을 가지게 된 파커와

'그 환자'의미래는 어떻게 흘러갈까 .

 


 

< 감상평 >

*스포있음*

2022년 1월 2일(일) ~ 2022년 1월 5일(수)

 

2020년 10월 12일 구입 했다. 페이스북을 보다가 책 소개 페이지에 소개되었던 책이었는데, 소개 내용이 참신했고, 줄거리도 재미있어 보여서 구입하게 되었다. 막상 책을 구입하고 책장에 쳐박아뒀었지만 베스트셀러 차트를 오랫동안 유지해왔던 책이라서 큰 기대를 안고 책을 읽게 됐다.

첫 도입부부터 중간까지는 흡입력이 굉장하고 문체도 간결해서 시간가는줄 모르고 읽었던 것 같다. 계속해서 작가(=파커)가 '그 환자'(=조)에 대해 뭔가 엄청난 비밀을 가진 것처럼 써놔서  " 조에 대한 비밀이 도대체 뭐지? " 라는 계속 생각하면서 책을 읽게 된다. 하지만 후반부로 흘러 갈수록 굉장한 흡입력은 사라지고 굉장히 허무했다. 조에 대한 비밀이 밝혀지면서 "그만읽을까" 란 고민을 정말 많이 했었다. 꾸역꾸역 끝까지 다 읽고 나서는 정말 많이 실망했다. 

파커가 말하는 조의 엄청난 비밀은 조는 의학적으로 설명할 수 없는 존재, 즉 악령이었고, 그 악령이 원래의 조를 죽여 자신이 조인척을 하는 것이고, 악령이기 때문에 상대방의 가장 약한 부분을 파고들어 큰 상처를 줘서 자살하게 만드는 거였다. 비밀을 밝히는 부분부터 몰입은 커녕 파커의 행동이 전혀 1도 이해가 가지 않는다. 파커는 조의 본집, 조의 방에서 어린아이의 유개골을 발견하는데 이 유개골이 진짜 조의 것이라고 확신한다. 확신은 해놓고 아무런 조치도 하지 않고 병원에 있는 악령 조를 찾아간다. 대체 왜? 악령 조가 도망가는 것도 아니고, 30년동안 얌전히 병원에 쳐박혀 있었는데? (이게 뭐람?) 결국 그렇게 단신으로 악령 조를 찾아가서 한바탕 하고 난 후, 악령 조는 감쪽같이 사라진다.(이게뭐람??????)

다 읽고 나서 책에 대해 찾아보니 결말이 2가지로 나뉜다고 했다. 1. 조=악령 2. 파커가 미친 것. 단편적으로 조=악령 이라는 부분만으로 해석하고 허무하다고 비난하는 독자들이 많다고 한다. 작가가 단편적으로 이야기를 풀었으니 그렇게 이해하는 사람이 더 많지 않을까 싶다. 나도 그렇고. 이 책에 대해서 2번의 시점으로 설명하는 동영상이 있다는데 한번 찾아봐야겠다. 

처음의 그 몰입감과 작가의 문체는 정말 최고였지만 그냥 그저그런, 작가가 독자에게 전하는 말이 있는것도 아니었고, 스토리가 탄탄한 것도 아니었고, 너무 큰 기대로 봐서 그런지 많이 실망한 책이었다. 

 

 


문제 설명

문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.

제한 조건
  • s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.

입출력 예

s return
"1 2 3 4" "1 4"
"-1 -2 -3 -4" "-4 -1"
"-1 -1" "-1 -1"

코드

#include <string>
#include <sstream>
#include <vector>

using namespace std;

string solution(string s) 
{
    string answer = "";
    int min,max,num;
    string word;
    istringstream input(s);
    
    getline(input, word, ' ');
    min = stoi(word);
    max = min;
    num = 0;
    
    while(getline(input, word, ' '))
    {
        num = stoi(word);  
        if(min > num) min = num;
        if(max < num) max = num;
    }
    
    answer+=(to_string(min))+ " " + (to_string(max));
        
    return answer;
}

참고자료

https://blockdmask.tistory.com/334

 

[C++] to_string 함수에 대해서 (int to string)

안녕하세요. BlockDMask 입니다. 지난번에는 string을 int로 변경하는 stoi 함수에 대해서 알아보았습니다. 오늘은 int를 string으로 변경하는 to_string 함수에 대해서 알아보겠습니다. (string -> int 로 변..

blockdmask.tistory.com

https://greenapple16.tistory.com/219

 

[C++] 문자열(string)을 특정 문자로 자르기

문자열을 sstream을 사용하여 특정 문자열로 구분하여 자르기 아래 코드는 공백 문자를 기준으로 자르는 방법 #include #include #include using namespace std; int main() { string fruit = "apple lemon grape..

greenapple16.tistory.com

 

+ Recent posts