{"id":22650314,"url":"https://github.com/laphayen/opencv-basic","last_synced_at":"2026-04-25T11:34:12.540Z","repository":{"id":41211000,"uuid":"508311946","full_name":"laphayen/OpenCV-Basic","owner":"laphayen","description":null,"archived":false,"fork":false,"pushed_at":"2022-09-03T07:29:07.000Z","size":11594,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-09T07:05:54.105Z","etag":null,"topics":["computer-vision","opencv"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/laphayen.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-06-28T13:31:27.000Z","updated_at":"2022-10-05T06:16:24.000Z","dependencies_parsed_at":"2022-08-10T01:43:11.838Z","dependency_job_id":null,"html_url":"https://github.com/laphayen/OpenCV-Basic","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/laphayen/OpenCV-Basic","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laphayen%2FOpenCV-Basic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laphayen%2FOpenCV-Basic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laphayen%2FOpenCV-Basic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laphayen%2FOpenCV-Basic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/laphayen","download_url":"https://codeload.github.com/laphayen/OpenCV-Basic/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/laphayen%2FOpenCV-Basic/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32261116,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["computer-vision","opencv"],"created_at":"2024-12-09T08:33:08.351Z","updated_at":"2026-04-25T11:34:07.532Z","avatar_url":"https://github.com/laphayen.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenCV-Basic\n\nOpenCV(Open Source Computer Vision Library)는 컴퓨터 비전 라이브러리로 오픈소스이다. \nC/C++기반으로 현재 여러 운영체제에서 다양한 플랫폼을 제공하고 있다.\n라이브러리는 각각의 모듈로 구성되어 있으며 확장자는 \\*.lib, \\*.dll 등 을 가진다.\n[공식 문서 사이트](https://docs.opencv.org/)를 참고하면 다양한 정보를 얻을 수 있다.(단, 해당 버전을 참고해야 한다)\n\n## 1. [OpenCV 설치 방법 및 프로젝트 생성](https://codeomni.tistory.com/764)\n### OpenCV 설치\n* [다운로드](https://opencv.org/releases/) 에서 제공하는 OpenCV를 다운받아서 Visual Studio로 프로젝트를 생성한다.\n* 먼저, 버전에 맞는 곳에서 사용하고 있는 운영체제를 선택한다.\n* 파일을 다운받은 뒤에 라이브러리를 설치할 폴더를 지정한다.\n* 필자는 편한 관리를 위해 C:\\ 에 설치를 하였다.\n* 다운 받은 OpenCV를 사용하기 위해 헤더 파일의 위치를 시스템 환경 변수에 넣는다.\n### OpenCV 프로젝트 만들기\n* 비주얼 스튜디오에서 새 프로젝트 만들기를 클릭한다.\n* 언어 설정을 C++로 설정한 후 Window 데스크톱 마법사를 클릭한다.\n* 프로젝트 이름을 지정한 후 솔루션용 디렉터리 만들기(D)를 클릭하여 생성한다.\n* 추가 옵션에서 빈 프로젝트(E)와 SDL(Security Development Lifecycle) 검사(C)를 클릭하여 확인을 누른다.\n* 코드를 작성한 후에 활성 솔루션 플랫폼을 x64로 설정하여 실행한다.(Debug와 Release 동일)\n\n## 2. [openCV 영상을 화면에 출력하기](https://codeomni.tistory.com/798)\n### 화면 출력하기\n* #include로 프로그램 실행에 필요한 OpenCV와 입출력을 담당하는 iostrream 헤더 파일을 불러온다.\n\u003cpre\u003e\u003ccode\u003e#include \"iostream\"\n\u003c/code\u003e\u003c/pre\u003e\n* using namespace로 코드 전체에서 cv::와 std::을 생략할 수 있다.(간결함)\n\u003cpre\u003e\u003ccode\u003eusing namespace cv;\nusing namespace std;\n\u003c/code\u003e\u003c/pre\u003e\n* Mat 클래스로 영상을 담을 변수를 선언한다.\n\u003cpre\u003e\u003ccode\u003eMat img;\n\u003c/code\u003e\u003c/pre\u003e\n* imread() 함수로 lenna.png 파일을 불러온다.\n\u003cpre\u003e\u003ccode\u003eimg = imread(\"lenna.png\");\n\u003c/code\u003e\u003c/pre\u003e\n* empty() 함수로 예외처리.\n\u003cpre\u003e\u003ccode\u003eif (img.empty()) { }\n\u003c/code\u003e\u003c/pre\u003e\n* namedWindow() 함수로 영상을 표시할 창을 생성한 후 이름을 붙인다.\n\u003cpre\u003e\u003ccode\u003enamedWindow(\"image\");\n\u003c/code\u003e\u003c/pre\u003e\n* imshow() 함수로 생성한 창에 불러온 파일을 출력하고, \" \" 안에 파일의 이름을 지정한다.\n\u003cpre\u003e\u003ccode\u003eimshow(\"image\", img);\n\u003c/code\u003e\u003c/pre\u003e\n* waitkey() 키보드의 키를 입력 시 영상 종료한다. \n\u003cpre\u003e\u003ccode\u003ewaitKey();\n\u003c/code\u003e\u003c/pre\u003e\n\n\n## 3. [기본 클래스]()\n### 3-1. Point_ 클래스\n* 2차원 x, y 축의 좌표 개념이다. \n* 멤버 변수로 (x, y)를 사용한다.\n* x와 y를 나눠서 지정 가능하다.\n\u003cpre\u003e\u003ccode\u003ept1.x = 8; pt1.y = 8;\n\u003c/code\u003e\u003c/pre\u003e\n* (x, y)로 지정\n\u003cpre\u003e\u003ccode\u003ept2(6, 17);\n\u003c/code\u003e\u003c/pre\u003e\n\n### 3-2. Size_ 클래스\n* 영상에서 크기를 지정하는 클래스이다.\n* 멤버 변수로 width와 height를 사용한다.\n\u003cpre\u003e\u003ccode\u003esz1.width()\n\u003c/code\u003e\u003c/pre\u003e\n\u003cpre\u003e\u003ccode\u003esz1.height()\n\u003c/code\u003e\u003c/pre\u003e\n* area() - 영상의 면적\n\u003cpre\u003e\u003ccode\u003eint area1 = sz1.area();\n\u003c/code\u003e\u003c/pre\u003e\n\n### 3-3. Rect_ 클래스\n* 영상의 2차원 정보를 표시\n\n### 3-4. RotatedRect 클래스\n* 영상을 회전하는 클래스이다.\n* size, center, angle을 멤버 변수로 사용한다.\n\n### 3-5. Vec_ 클래스\n* 벡터 클래스로 기본 연산 및 형변환한다.\n* Matx 클래스를 상속 받는다.\n* \u003c \u003e를 사용해 자료형을 표시한다.\n\u003cpre\u003e\u003ccode\u003eVec\u003cnum-of-data\u003e{b | s | w | i | f | d}\n\u003c/pre\u003e\u003c/code\u003e\n\n### 3-6. Scalar_ 클래스\n* Vec_ 클래스를 상속 받는다.\n* 영상의 픽셀 값 표현 값 사용한다.(4채널 이하)\n* Scalar(밝기)\n* Scalar(청색, 녹색, 적색)\n* Scalar(청색, 녹색, 적색, 투명도)\n\n### 3-7. Mat 클래스\n* 이미지와 영상을 행령의 형태로 사용한다.\n* 2차원부터 고차원의 행렬을 표현한다.\n* 1개 이사으이 채널을 가질 수 있다.\n* 행렬의 생성과 초기화 - 행과 열, 타입을 지정한다.\n\u003cpre\u003e\u003ccode\u003eMat::Mat(int rows, int cols, int type);\n\u003c/code\u003e\u003c/pre\u003e\n* 행렬의 크기 지정 - OpenCV의 Size와 타입을 지정한다.\n\u003cpre\u003e\u003ccode\u003eMat::Mat(Size size, int type);\n\u003c/code\u003e\u003c/pre\u003e\n\n\n### 3-8. Range 클래스\n* 범위와 구간 클래스이다.\n* 시작은 start 변수와 끝은 end 멤버변수를 사용한다.\n\u003cpre\u003e\u003ccode\u003eint_start, int _end\n\u003c/code\u003e\u003c/pre\u003e\n\n\n### 3-9. String 클래스\n* 영상 출력에서 문자열 저장하고 출력이 가능합니다.\n\u003cpre\u003e\u003ccode\u003eString format(const char* fmt, ... );\n\u003c/code\u003e\u003c/pre\u003e\n\n\n\n## 4. 카메라 처리하기\n### 4-1 카메라 입력 처리\n* VideoCapture 클래스 사용 -\u003e VideoCapture 객체 생성\n* VideoCapture::Open() - 멤버 함수로 카메라 장치를 지정해서 연다.(디폴트 0 - 기본 카메라)\n\u003cpre\u003e\u003ccode\u003eVideoCapture cap(0);\n\u003c/code\u003e\u003c/pre\u003e\n* VideoCapture::isOpened() - 멤버 함수로 상태 확인(fasle - 사용X)\n\u003cpre\u003e\u003ccode\u003eif (!cap.isOpened()) {\n\u003c/code\u003e\u003c/pre\u003e\n* Mat 클래스 객체에 저장 후 imshow()함수로 영상을 출력한다.\n\u003cpre\u003e\u003ccode\u003eimshow(\"frame\", frame);\n\u003c/code\u003e\u003c/pre\u003e\n\n### 4-2. 동영상 입력 처리하기\n* VideoCapture 클래스 사용 -\u003e VideoCapture 객체 생성\n\u003cpre\u003e\u003ccode\u003eVideoCapture cap(\"video name.avi\");\n\u003c/code\u003e\u003c/pre\u003e\n* CAP_PROP_FRAME_COUNT - 영상의 전체 프레임 수\n\u003cpre\u003e\u003ccode\u003ecout \u003c\u003c \"Frame count\" \u003c\u003c cvRound(cap.get(CAP_PROP_FRAME_COUNT)) \u003c\u003c endl;\n\u003c/code\u003e\u003c/pre\u003e\n* CAP_PROP_FRAME_WIDTH - 영상 프레임의 가로 크기\n\u003cpre\u003e\u003ccode\u003ecout \u003c\u003c \"Frame width \" \u003c\u003c cvRound(cap.get(CAP_PROP_FRAME_WIDTH)) \u003c\u003c endl;\n\u003c/code\u003e\u003c/pre\u003e\n* CAP_PROP_FRAME_HEIGHT - 영상 프레임의 높이 크기\n\u003cpre\u003e\u003ccode\u003ecout \u003c\u003c \"Frame height \" \u003c\u003c cvRound(cap.get(CAP_PROP_FRAME_HEIGHT)) \u003c\u003c end;\n\u003c/code\u003e\u003c/pre\u003e\n* CAP_PROP_FPS - 영상의 초당 프레임 수\n\u003cpre\u003e\u003ccode\u003ecout \u003c\u003c \"Frame height \" \u003c\u003c cvRound(cap.get(CAP_PROP_FPS)) \u003c\u003c end;\n\u003c/code\u003e\u003c/pre\u003e\n* 카메라 입력 처리와 같게 Mat 클래스 객체에 저장 후 imshow()함수로 영상을 출력한다.\n\u003cpre\u003e\u003ccode\u003eimshow(\"frame\", frame);\n\u003c/code\u003e\u003c/pre\u003e\n\n### 4-3. 동영상 출력 처리하기\n* VideoWriter 클래스 사용 -\u003e VideoWriter 객체 생성\n\u003cpre\u003e\u003ccode\u003eVideoWriter outputBideo(\"output.avi\", fourcc, fps, Size(w,h));\n\u003c/code\u003e\u003c/pre\u003e\n* fourcc - 영상 파일의 저장할 코덱 지정\n\u003cpre\u003e\u003ccode\u003eint fourcc = VideoWriter::fourcc('D', 'I', 'V', 'X');\n\u003c/code\u003e\u003c/pre\u003e\n  * fourcc('D', 'I', 'V', 'X') - DivX MPEG-4 코덱\n  * fourcc('X', '2', '6', '4') - H.264/AVC 코덱\n  * fourcc('A', 'V', 'C', '1') - Advanced Video 코덱\n* outputVideo() 함수로 저장할 파일의 이름과, 코덱, fps, 크기를 지정한다.\n\u003cpre\u003e\u003ccode\u003eoutputVideo \u003c\u003c frame;\n\u003c/code\u003e\u003c/pre\u003e\n\n## 5. 이벤트 처리\n### 5-1. 키보드 이벤트 처리\n* waitKey() - OpenCV의 키보드 입력 함수\n\u003cpre\u003e\u003ccode\u003eint waitKey(int delay = 0);\n\u003c/code\u003e\u003c/pre\u003e\n* delay - 밀리초 동안 대기\n* 지정된 입력 키와 지정된 시간동안 키의 입력이 없을 경우 -1 반환한다.\n* 키의 입력을 지정하는 경우는 아스키 코드표를 참조한다.\n\n### 5-2. 마우스 이벤트 처리\n* setMouseCallbck() 함수 사용한다.\n\u003cpre\u003e\u003ccode\u003evoid setMouseCallback(const String\u0026 winname, MouseCallback onMouse, void* userdata = 0;\n\u003c/code\u003e\u003c/pre\u003e\n* MouseCallbak 함수의 구성\n\u003cpre\u003e\u003ccode\u003etypedef void (*MouseCallback)(int event, int x, int y, int flags, void* userdata);\n\u003c/code\u003e\u003c/pre\u003e\n* MouseEventTypes 열거형 상수 - 마우스 버튼 조작 상태( 어느 버튼이 조작되고 있는지)\n* MouseEventFlags 열거형 상수 - 버튼 눌려있는 상태\n\n### 5-3. 트랙바 이벤트 처리\n* 슬라이더 컨트롤\n* 프로그램 사용자가 원하는 값을 선택한다.\n* createTrackbar() 함수로 트랙바를 생성한다.\n\u003cpre\u003e\u003ccode\u003eint createTrackbar(const String\u0026 trackbarname, const String\u0026 winname, int* value, int count, TrackbarCallback onChange = 0, woid* userdata = 0;\n\u003c/code\u003e\u003c/pre\u003e\n* getTrackbarPos() 함수로 현재 트랙바의 위치를 확인한다.\n\u003cpre\u003e\u003ccode\u003eint cv::getTrackbarPos(const Strign \u0026 trackbarname, const String \u0026 winname)\n\u003c/code\u003e\u003c/pre\u003e\n* 리턴으로 트랙바 위치를 반환한다.\n\n\n\n## 기타1 - 반전 영상\n* 반전 변수를 생성 후 ~연산자를 사용한다.\n* inversed = ~frame;\n\u003cpre\u003e\u003ccode\u003einversed = ~frame;\n\u003c/code\u003e\u003c/pre\u003e\n* imshow(\"inversed\", inversed);\n\u003cpre\u003e\u003ccode\u003eimshow(\"inversed\", inversed);\n\u003c/code\u003e\u003c/pre\u003e\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaphayen%2Fopencv-basic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flaphayen%2Fopencv-basic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flaphayen%2Fopencv-basic/lists"}