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

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

 


1. vector container 란?

자동으로 메모리가 할당 되는 배열

vector 구조

 

2. vector의 사용

<vector> 헤더파일을 추가해야 한다.

using namespace std; 를 사용하면 편리하다. 

 

3. vector의 생성자

① vector<int> v;

 - 비어 있는 vector v를 생성

 

② vector<int> v(10);

 - 기본 값(0)으로 초기화 된 10개의 원소를 가지는 vector v를 생성

 

③ vector<int> v(10,5)

 - 2로 초기화 된 10개의 원소를 가지는 vector v를 생성

 

vecotr<int> v1(10,5);

     vector<int> v2(v1);

 - v1 vector를 복사해서 v2 생성

 

 * 연산자 "==", "!=", "<", ">", "<=", ">="로 대소 비교 가능

 

4. vector의 멤버 함수

* vector<int> v; 라고 가정

① v.assign(5,2); 

 - 2의 값으로 5개의 원소 할당

 

② v.at(index)

 - index번째 원소 return

 - v[index] 보다 속도는 느리지만, 범위를 점검하므로 안전

    v[index]

 - index번째 원소 return

- 범위를 점검하지 않으므로 속도가 v.at(index)보다 빠름

 

 v.front();

 - v의 첫번째 원소를 return

   v.back();

 - v의 마지막 원소를 return

 

 v.clear();

 - v의 모든 원소 제거

 - 원소만 제거하고 메모리는 남아있음 (size만 줄어들고, capacity는 그대로 남아있음)

 

v.push_back(7)

 - v의 마지막 원소 뒤에 7을 삽입

     v.pop_back()

 - v의 마지막 원소를 삭제

 

⑥ v.clear()

 - v의 모든 원소 제거

 - 원소만 제거하고 메모리는 남아있음 (size만 줄어들고, capacity는 그대로 남아있음)

 

v.begin()

 - v의 시작점의 주소 값 return

    v.end()

 - v의 마지막부분의 다음 주소 값 return

 

v.rbegin()

 - v의 끝 지점을 시작점으로 return

     v.rend()

 - v의 시작점 다음지점을 끝 부분으로 return

 

v.reserve(n)

 - n만큼의 capacity를 설정

 - n이 현재 capacity보다 클 때만 동작, 작으면 아무 일도 일어나지 않는다.

   v.resize(n)

 - size를 n으로 변경, 현재 size보다 n이 클 경우 인자의 값을 default값인 0으로 초기화

     v.resize(n,3)

 - size를 n으로 변경, 현재 size보다 n이 클 경우 인자의 값을 3으로 초기화

 

 

⑩ v.size()

 - v의 원소 갯수를 return

     v.capacity()

 - v의 할당된 공간의 크기를 return 

 

⑪ v2.swap(v1)

 - v1과 v2의 원소과 capacity를 바꿈(모든 걸 swap)

 

⑫ v.insert(2,3)

 - 2번째 위치에 3의 값을 삽입

 - 삽입한 곳의 iterator를 return

     v.insert(2,3,4)

 - 2번째 위치에 3의 값을 4개 삽입

 

 v.erase(index)

 - index가 가리키는 원소를 제거

      v.erase(start,end)

 - start이상, end 미만이 가르키는 원소를 제거

 

⑭ v.empty()

 - v가 비어있으면 return true

 


https://blockdmask.tistory.com/70

 

[C++] vector container 정리 및 사용법

안녕하세요.  BlockDMask 입니다. 오늘은 C++ STL의 sequence container 중에 정말 자주 쓰는 vector에 대해서 알아보겠습니다. <목차> 1) vector container 란? 2) vector의 사용 3) vector의 생성자와 연산..

blockdmask.tistory.com

 

*[개발자 지망생]님 블로그를 보고 공부하며 제가 보기 편하게 정리 한 글 입니다.*

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

[C++] string 클래스 정리  (0) 2021.10.29

https://jeak.tistory.com/233

 

MFC MoveWindow - 컨트롤 위치 및 크기 변경

MFC MoveWindow MFC에서 사용하는 control들의 위치와 크기를 변경하는 movewindow함수에 대해 알아보겠습니다. 1 2 3     void MoveWindow(int x, int y, int nWidth, int nHeight,         ..

jeak.tistory.com

 

https://balabala.tistory.com/45?category=947457 

 

[MFC] 채팅 프로그램 - 클라이언트 (2/3)

- 설명 - 프로젝트 명 : ChatClient(대화 상자) ① CSocket 클래스 이용 : 동기식(블로킹)으로 동작 ② 서버 클라이언트 1:1 통신 ③ 해당 글은 클라이언트 채팅 프로그램 만드는 법 설명 1. MFC 애플리케이

balabala.tistory.com


[따라하다가 안되던 부분들]

2. 다이얼로그 디자인 및 ID

형식을 CString 으로 하니 에러가 나서 CEdit, CStatic으로 변경했다. 

Control을 다루는 부분도 형식에 따라서 변경했다.

그림3. 멤버변수 설정

 

7. [접속] 및 [전송] 버튼 클릭 메시지 함수 작업

위 작업대로 형식에 맞게 메세지 함수 소스 코드 수정

void CChatClientDlg::OnBnClickedButtonConnect()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	CString strIP;

	UpdateData(TRUE);
	m_socCom.Create();

	m_strIP.GetWindowText(strIP);

	// IP 주소와 포트 번호를 지정
	m_socCom.Connect(strIP, 5000);
	m_socCom.Init(this->m_hWnd);

}

void CChatClientDlg::OnBnClickedButtonSend()
{
	// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
	UpdateData(TRUE);
	char pTmp[256];
	CString strTmp, strText;
	CStringA strTextA;

	m_strSend.GetWindowText(strText);

	strTextA = CStringA(strText);

	// pTmp에 전송할 데이터 입력
	memset(pTmp, '\0', 256);
	memcpy(pTmp, strTextA.GetBuffer(), strTextA.GetLength());
	m_strSend.Clear();

	// 전송
	m_socCom.Send(pTmp, 256);

	// 전송한 데이터도 리스트박스에 보여준다.
	strTmp = pTmp;
	int i = m_list.GetCount();
	m_list.InsertString(i, strTmp);

	UpdateData(FALSE);
}

https://snowbora.tistory.com/369

 

[C++] MFC에서 CEdit 사용하기

MS Visual Studio를 사용해서 간단한 어플리케이션 프로그래밍을 할 때, 단순히 버튼(Button)이나 텍스트 박스(TextBox) 등을 만들고 간단한 함수 등을 맵핑해서 쓰는 경우가 많습니다. 기존에 Visual C++을

snowbora.tistory.com

 

+ Recent posts