Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/laphayen/opencv-basic
https://github.com/laphayen/opencv-basic
computer-vision opencv
Last synced: about 1 month ago
JSON representation
- Host: GitHub
- URL: https://github.com/laphayen/opencv-basic
- Owner: laphayen
- Created: 2022-06-28T13:31:27.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2022-09-03T07:29:07.000Z (over 2 years ago)
- Last Synced: 2023-06-29T14:40:07.214Z (over 1 year ago)
- Topics: computer-vision, opencv
- Language: C++
- Homepage:
- Size: 11.1 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# OpenCV-Basic
OpenCV(Open Source Computer Vision Library)는 컴퓨터 비전 라이브러리로 오픈소스이다.
C/C++기반으로 현재 여러 운영체제에서 다양한 플랫폼을 제공하고 있다.
라이브러리는 각각의 모듈로 구성되어 있으며 확장자는 \*.lib, \*.dll 등 을 가진다.
[공식 문서 사이트](https://docs.opencv.org/)를 참고하면 다양한 정보를 얻을 수 있다.(단, 해당 버전을 참고해야 한다)## 1. [OpenCV 설치 방법 및 프로젝트 생성](https://codeomni.tistory.com/764)
### OpenCV 설치
* [다운로드](https://opencv.org/releases/) 에서 제공하는 OpenCV를 다운받아서 Visual Studio로 프로젝트를 생성한다.
* 먼저, 버전에 맞는 곳에서 사용하고 있는 운영체제를 선택한다.
* 파일을 다운받은 뒤에 라이브러리를 설치할 폴더를 지정한다.
* 필자는 편한 관리를 위해 C:\ 에 설치를 하였다.
* 다운 받은 OpenCV를 사용하기 위해 헤더 파일의 위치를 시스템 환경 변수에 넣는다.
### OpenCV 프로젝트 만들기
* 비주얼 스튜디오에서 새 프로젝트 만들기를 클릭한다.
* 언어 설정을 C++로 설정한 후 Window 데스크톱 마법사를 클릭한다.
* 프로젝트 이름을 지정한 후 솔루션용 디렉터리 만들기(D)를 클릭하여 생성한다.
* 추가 옵션에서 빈 프로젝트(E)와 SDL(Security Development Lifecycle) 검사(C)를 클릭하여 확인을 누른다.
* 코드를 작성한 후에 활성 솔루션 플랫폼을 x64로 설정하여 실행한다.(Debug와 Release 동일)## 2. [openCV 영상을 화면에 출력하기](https://codeomni.tistory.com/798)
### 화면 출력하기
* #include로 프로그램 실행에 필요한 OpenCV와 입출력을 담당하는 iostrream 헤더 파일을 불러온다.#include "iostream"
* using namespace로 코드 전체에서 cv::와 std::을 생략할 수 있다.(간결함)using namespace cv;
using namespace std;
* Mat 클래스로 영상을 담을 변수를 선언한다.Mat img;
* imread() 함수로 lenna.png 파일을 불러온다.img = imread("lenna.png");
* empty() 함수로 예외처리.if (img.empty()) { }
* namedWindow() 함수로 영상을 표시할 창을 생성한 후 이름을 붙인다.namedWindow("image");
* imshow() 함수로 생성한 창에 불러온 파일을 출력하고, " " 안에 파일의 이름을 지정한다.imshow("image", img);
* waitkey() 키보드의 키를 입력 시 영상 종료한다.waitKey();
## 3. [기본 클래스]()
### 3-1. Point_ 클래스
* 2차원 x, y 축의 좌표 개념이다.
* 멤버 변수로 (x, y)를 사용한다.
* x와 y를 나눠서 지정 가능하다.pt1.x = 8; pt1.y = 8;
* (x, y)로 지정pt2(6, 17);
### 3-2. Size_ 클래스
* 영상에서 크기를 지정하는 클래스이다.
* 멤버 변수로 width와 height를 사용한다.sz1.width()
sz1.height()
* area() - 영상의 면적int area1 = sz1.area();
### 3-3. Rect_ 클래스
* 영상의 2차원 정보를 표시### 3-4. RotatedRect 클래스
* 영상을 회전하는 클래스이다.
* size, center, angle을 멤버 변수로 사용한다.### 3-5. Vec_ 클래스
* 벡터 클래스로 기본 연산 및 형변환한다.
* Matx 클래스를 상속 받는다.
* < >를 사용해 자료형을 표시한다.Vec{b | s | w | i | f | d}
### 3-6. Scalar_ 클래스
* Vec_ 클래스를 상속 받는다.
* 영상의 픽셀 값 표현 값 사용한다.(4채널 이하)
* Scalar(밝기)
* Scalar(청색, 녹색, 적색)
* Scalar(청색, 녹색, 적색, 투명도)### 3-7. Mat 클래스
* 이미지와 영상을 행령의 형태로 사용한다.
* 2차원부터 고차원의 행렬을 표현한다.
* 1개 이사으이 채널을 가질 수 있다.
* 행렬의 생성과 초기화 - 행과 열, 타입을 지정한다.Mat::Mat(int rows, int cols, int type);
* 행렬의 크기 지정 - OpenCV의 Size와 타입을 지정한다.Mat::Mat(Size size, int type);
### 3-8. Range 클래스
* 범위와 구간 클래스이다.
* 시작은 start 변수와 끝은 end 멤버변수를 사용한다.int_start, int _end
### 3-9. String 클래스
* 영상 출력에서 문자열 저장하고 출력이 가능합니다.String format(const char* fmt, ... );
## 4. 카메라 처리하기
### 4-1 카메라 입력 처리
* VideoCapture 클래스 사용 -> VideoCapture 객체 생성
* VideoCapture::Open() - 멤버 함수로 카메라 장치를 지정해서 연다.(디폴트 0 - 기본 카메라)VideoCapture cap(0);
* VideoCapture::isOpened() - 멤버 함수로 상태 확인(fasle - 사용X)if (!cap.isOpened()) {
* Mat 클래스 객체에 저장 후 imshow()함수로 영상을 출력한다.imshow("frame", frame);
### 4-2. 동영상 입력 처리하기
* VideoCapture 클래스 사용 -> VideoCapture 객체 생성VideoCapture cap("video name.avi");
* CAP_PROP_FRAME_COUNT - 영상의 전체 프레임 수cout << "Frame count" << cvRound(cap.get(CAP_PROP_FRAME_COUNT)) << endl;
* CAP_PROP_FRAME_WIDTH - 영상 프레임의 가로 크기cout << "Frame width " << cvRound(cap.get(CAP_PROP_FRAME_WIDTH)) << endl;
* CAP_PROP_FRAME_HEIGHT - 영상 프레임의 높이 크기cout << "Frame height " << cvRound(cap.get(CAP_PROP_FRAME_HEIGHT)) << end;
* CAP_PROP_FPS - 영상의 초당 프레임 수cout << "Frame height " << cvRound(cap.get(CAP_PROP_FPS)) << end;
* 카메라 입력 처리와 같게 Mat 클래스 객체에 저장 후 imshow()함수로 영상을 출력한다.imshow("frame", frame);
### 4-3. 동영상 출력 처리하기
* VideoWriter 클래스 사용 -> VideoWriter 객체 생성VideoWriter outputBideo("output.avi", fourcc, fps, Size(w,h));
* fourcc - 영상 파일의 저장할 코덱 지정int fourcc = VideoWriter::fourcc('D', 'I', 'V', 'X');
* fourcc('D', 'I', 'V', 'X') - DivX MPEG-4 코덱
* fourcc('X', '2', '6', '4') - H.264/AVC 코덱
* fourcc('A', 'V', 'C', '1') - Advanced Video 코덱
* outputVideo() 함수로 저장할 파일의 이름과, 코덱, fps, 크기를 지정한다.outputVideo << frame;
## 5. 이벤트 처리
### 5-1. 키보드 이벤트 처리
* waitKey() - OpenCV의 키보드 입력 함수int waitKey(int delay = 0);
* delay - 밀리초 동안 대기
* 지정된 입력 키와 지정된 시간동안 키의 입력이 없을 경우 -1 반환한다.
* 키의 입력을 지정하는 경우는 아스키 코드표를 참조한다.### 5-2. 마우스 이벤트 처리
* setMouseCallbck() 함수 사용한다.void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata = 0;
* MouseCallbak 함수의 구성typedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);
* MouseEventTypes 열거형 상수 - 마우스 버튼 조작 상태( 어느 버튼이 조작되고 있는지)
* MouseEventFlags 열거형 상수 - 버튼 눌려있는 상태### 5-3. 트랙바 이벤트 처리
* 슬라이더 컨트롤
* 프로그램 사용자가 원하는 값을 선택한다.
* createTrackbar() 함수로 트랙바를 생성한다.int createTrackbar(const String& trackbarname, const String& winname, int* value, int count, TrackbarCallback onChange = 0, woid* userdata = 0;
* getTrackbarPos() 함수로 현재 트랙바의 위치를 확인한다.int cv::getTrackbarPos(const Strign & trackbarname, const String & winname)
* 리턴으로 트랙바 위치를 반환한다.## 기타1 - 반전 영상
* 반전 변수를 생성 후 ~연산자를 사용한다.
* inversed = ~frame;inversed = ~frame;
* imshow("inversed", inversed);imshow("inversed", inversed);