Study
- Git 시작하기 2022.04.29
- [OpenCV C++] VideoCapture 2022.02.18
- [OpenCV C++] imread(), imshow() 2022.02.18
- [MFC] sleep(0)와 sleep(1)의 차이점 2022.01.13
- [C++] vector container 2022.01.06
- [MFC] MoveWindow - 컨트롤 위치 및 크기 변경 2021.12.10
- [MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 클라이언트 2021.12.08
- [MFC] Edit Control 2021.12.08
Git 시작하기
[OpenCV C++] VideoCapture
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 |
---|
[OpenCV C++] imread(), imshow()
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 |
---|
[MFC] sleep(0)와 sleep(1)의 차이점

* 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
'Study > MFC' 카테고리의 다른 글
[MFC] MoveWindow - 컨트롤 위치 및 크기 변경 (0) | 2021.12.10 |
---|---|
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 클라이언트 (0) | 2021.12.08 |
[MFC] Edit Control (0) | 2021.12.08 |
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 서버 (0) | 2021.12.08 |
[MFC] GDI+를 이용한 더블 버퍼링 (0) | 2021.12.02 |
[C++] vector container

1. vector container 란?
자동으로 메모리가 할당 되는 배열

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 |
---|
[MFC] MoveWindow - 컨트롤 위치 및 크기 변경
'Study > MFC' 카테고리의 다른 글
[MFC] sleep(0)와 sleep(1)의 차이점 (0) | 2022.01.13 |
---|---|
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 클라이언트 (0) | 2021.12.08 |
[MFC] Edit Control (0) | 2021.12.08 |
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 서버 (0) | 2021.12.08 |
[MFC] GDI+를 이용한 더블 버퍼링 (0) | 2021.12.02 |
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 클라이언트
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을 다루는 부분도 형식에 따라서 변경했다.

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);
}
'Study > MFC' 카테고리의 다른 글
[MFC] sleep(0)와 sleep(1)의 차이점 (0) | 2022.01.13 |
---|---|
[MFC] MoveWindow - 컨트롤 위치 및 크기 변경 (0) | 2021.12.10 |
[MFC] Edit Control (0) | 2021.12.08 |
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 서버 (0) | 2021.12.08 |
[MFC] GDI+를 이용한 더블 버퍼링 (0) | 2021.12.02 |
[MFC] Edit Control
https://snowbora.tistory.com/369
[C++] MFC에서 CEdit 사용하기
MS Visual Studio를 사용해서 간단한 어플리케이션 프로그래밍을 할 때, 단순히 버튼(Button)이나 텍스트 박스(TextBox) 등을 만들고 간단한 함수 등을 맵핑해서 쓰는 경우가 많습니다. 기존에 Visual C++을
snowbora.tistory.com
'Study > MFC' 카테고리의 다른 글
[MFC] MoveWindow - 컨트롤 위치 및 크기 변경 (0) | 2021.12.10 |
---|---|
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 클라이언트 (0) | 2021.12.08 |
[MFC] 소켓통신(TCP/IP) 채팅프로그램 만들기 - 서버 (0) | 2021.12.08 |
[MFC] GDI+를 이용한 더블 버퍼링 (0) | 2021.12.02 |
[MFC] x축, y축 좌표 그리기 (0) | 2021.12.01 |