[OpenCV]OpenCV란 무엇인가? 그리고 설치
1. OpenCV
OpenCV는 Open Source Computer Vision의 약자로 영상 처리에 사용할 수 있는 오픈 소스 라이브러리 입니다. 컴퓨터가 사람의 눈처럼 인식할 수 있게 처리해주는 역할을 하기도 하며, 우리가 많이 사용하는 카메라 어플에서도 OpenCV가 사용하기도 한다. (추가로 자율주행자동차에서 자동차의 눈이 되주는 것이 카메라와 OpenCV가 합작해서 해낸 일이다.) 추가로 사용되는 예로는
- 공장에서 제품 검사할 때
- 의료 영상 처리 및 보정 그리고 판단
- CCTV영상
- 로보틱스
등 다양한 범위에서 사용되고 있다. 카메라로 찍어서 할 수 있는 모든 일은 OpenCV로 처리할 수 있다. 여기에 머신 러닝과 A.I를 활용해서 그 활용도를 더욱 넓혀가고 있는 중이다.
OpenCV가 더욱 인기있는 이유는 오픈소스이지만 BSD(Berkely Software Distribution)라이선스를 따르기 때문에, 상업적 목적으로 사용해도 좋다. 그리고 소스코드 공개 의무가 없다는 점에서 강점을 가지고 있다. OpenCV의 기원은 인텔에서부터 시작되는데, 컴퓨터 비전과 인공지능의 발달 시키고자 하는 바램으로 OpenCV를 출시한 것이다. (with Grary Bradski)
OpenCV는 실시간 처리에 중점을 두고 설계되서 빠른 속도와 효율성을 자랑한다. 기반 언어는 C++로 멀티 코어 프로세서를 활용할 수 있다. 심지어 인텔IPP(Integrated Performance Primitives)를 통한 최적화 루틴을 활용함으로써 로우레벨에서 자동화된 최적화를 사용할 수 있다. 이전에는 유료로 구매해야 했지만, OpenCV 3.0 부터는 IPP의 일부를 무료로 제공해주고 있다.
[사실 인텔은 OpenCV를 배포함으로써 OpenCV가 점차 발전함에 따라 빠른 프로세서가 필요시 되고 이는 인텔 프로세서의 수요가 늘어나 수입이 늘어나는 큰 그림을 그리고 있었다.]
그렇다면 여기서 가장 중요한 단어인 컴퓨터 비전이란 무엇인가?
2. 컴퓨터 비전?
컴퓨터 비전은 카메라로 얻은 일련의 영상들을 모두 컴퓨터 비전이라 한다. 사람은 눈을 통해 많은 정보를 받아들인다. 지금 이 글을 읽는 순간에도 눈을 통해서 읽고 있지 않은가? 프로그래밍에서 항상 생각해보아야 할 것 중 하나의 원칙은 '사람에게 쉬운 일은 컴퓨터에게 어려울 수 있다.'라는 말이다. 컴퓨터 비전 또한 마찬가지이다. 사람에게 너무나 쉬운 보는 일은 컴퓨터에게는 너무나도 어려운 일이다. 하나의 사진에서 사람을 가려내고, 그 속에서 지나는 여러 사물을 골라내는 일은 컴퓨터에게 어렵다. 사람은 이렇게 어려운 일을 자연스럽게 해낸다. 카메라의 역할을 하고 있는 눈은 빛을 자연스럽게 조절하며, 초점을 자동으로 조절한다. 정말 대단한 일인 것이다. 카메라는 이를 일일히 작업해서 맞춰줘야 한다. 카메라가 사진을 찍으면 컴퓨터는 이를 단순한 숫자로 인식할 뿐이다. 오로지 0과 1로 이루어져서 다시 나올 뿐이다.
컴퓨터는 이러한 숫자의 행렬로 사진 및 여러 형태를 인식한다. 그렇다면 우리는 이러한 형태를 가지고 컴퓨터에게 유의미한 정보를 입력해줌으로써 사람이 보는 시선과 최대한 비슷하게 만들어야 하는 것이다. 하지만 여기에는 많은 문제가 도사리고 있다. 우리의 시각 정보는 왜곡이 많다. 예를 들어 우리가 보는 관점에 따라 사물이 왜곡될 확률이 있다. 다른 왜곡은 빛의 양에 따라 달라지기도 하며 비가 오는 경우에는 더욱 심각해진다. 심지어 카메라의 성능에 따라 계속 변한다. 전기적 노이즈도 생각해봐야 한다. 이러한 왜곡을 이겨내고서 우리는 정확한 이미지 처리가 필요한 것이다. (심지어 카메라는 3D 정보를 2D로 받아들이고 있다.)
이 부분에 대한 해결책은 머신러닝 기술로 어느정도 보완하고 있다. 혹은 다른 추가적인 데이터를 활용해서, 예를 들어 라이다 센서 혹은 거리 센서를 활용해서 왜곡정보를 올바르게 해석하기 위한 노력을 하고 있다. 그리고 OpenCV는 이러한 다양한 문제들을 해결하기 위한 도구를 제공해주는 것을 목표로 한다. 지금도 많은 연구가 이루어지고 있으며, 다양한 자료들이 쏟아져 나오고 있다.
OpenCV와 사용할 수 있는 언어로는 C/C++, 파이썬, Java등이 있다. 요새 많이 쓰이는 언어로는 파이썬이 많이 사용되고 있다. 빅데이터와 머신 러닝에서 강점을 보이고 있기에 파이썬이 많이 쓰인다. 하지만 이 블로그에서는 C++을 통해서 사용하도록 할 예정이다. 나중에 기회가 된다면 파이썬을 통한 머신러닝과 딥러닝 그리고 A.I를 사용할 때 파이썬을 사용하려 한다. 하나의 언어를 제대로 배워두면 다른 언어에 대한 장벽은 높지 않은 편이므로 일단은 C++로 진행하려 한다.
3. 기본 구조
OpenCV의 기본 아키텍처는 다음과 같다.
각 요소를 살펴보자면,
- CV : Computer Vision으로 기본 구성 요소에서는 기본 이지미 처리와 고급 컴퓨터 비전 알고리즘을 포함하고 있다.
- ML (Machine Learning) : 머신러닝이 주를 이루므로 이를 활용할 수 있는 기본적인 통계 분류기와 클러스터링 도구를 포함하고 있는 라이브러리들이 있다.
- HighGUI : OpenCV에 기본으로 포함되어 있는 GUI이다. 여기에는 비디오와 이미지 저장 그리고 이를 로드하기 위한 I/O 루틴을 포함하고 있다. 이 모듈을 활용해서 사용자의 입력을 받고 그에 따른 출력하는 기능을 하는 유저 인터페이스 기능을 하고 있다. 기본 기능으로 지원하고 있지만 조금 더 범용적으로 Qt를 사용한다. (윈도우 GUI 툴킷 정도라 생각할 수 있다.)
- CXCORE : 이곳에는 기본 데이터 구조와 여러 content가 구성되어 있다.
다른 관점에서 보자면 이러한 아키텍처 구조를 갖는다. 다양한 라이브러리의 모듈이다. 업데이트가 되면 달라지겠지만 현재 모듈 구성은 다음과 같다.
-
Core - 모든 객체 타입과 기본 연산자가 들어 있는 라이브러리 섹션
-
Imgproc - 이미지 처리 모듈로써 이미지 변환 등을 포함하고 있다.
-
highgui - 위에서 설명했다. ( 사용자의 입력을 받는 유저 인터페이스 기능 포함)
-
video - 비디오 라이브러리로써 비디오 스트림을 read/write하는 함수가 포함되어 있다.
-
calib3d - 캘리브레이션하는데 필요한 알고리즘이 포함된 모듈
-
features2d - 중요한 feature(특징)을 탐지하고 표현, 매칭하기 위한 알고리즘이 구현된 모듈
-
objdetect - 말 그대로 오브젝트 디텍트, 특정 오브젝트를 탐지하는 알고리즘이 들어있는 모듈이다. 이를 머신 러닝으로 기계 학습 시켜서 특정 물체들을 탐지할 수 있다.
-
ml - 머신러닝 라이브러리
-
flann - Fast Library for Approximate Nearest Neighbors 나중에 이야기하겠지만, 머신러닝에 사용되는 알고리즘이다. 자세한 내용은
flann의 자세한 내용은 공식 깃헙 [github.com/mariusmuja/flann]에 있다.
-
gpu - 그래픽 카드를 이용한 연산을 사용한다. 일명 그래픽카드 연산을 위한 라이브러리이다. CUDA연산에 최적화 되어 있다. 당연히 머신러닝을 위한 설계이다. CUDA (Computed Unified Device Architecture)로써 NVIDIA에서 개발한 GPU 개발툴이다. 딥러닝에서 사용하기 위해서 만들어졌으며, 하드웨어에서는 얻을 수 없는 연산을 할 때 많이 사용된다. 비트코인 채굴할 때 사용하는 것이 CUDA이다. (tensorflow도 사용된다.)
-
photo - 사진을 활용할 수 있는 다양한 도구를 포함하고 있다.
-
stitching - 스티치 파이프라인을 구현하기 위한 모듈, Image stitching이란 이미지를 포갤 지점을 찾는 과정이라 생각하면 된다. 이를 빠르게 하는 파이프라인을 구현하기 위한 모듈이라 생각하면 된다.
-
nonfree - OpenCV에서 특허나 사용 제한이 걸려있는 알고리즘의 구현이 이곳에 있다. ( 예를 들어 SIFT알고리즘)
등이 존재한다.
4. 다운로드 및 설치
앞서 이야기했듯이 설치는 C++로 진행할 예정이다. 바인딩 용 언어는 Java, C++, Python 등을 많이 사용하지만 그 원론에 다가가고자 C++를 이용해서 설치하고 실습해볼 예정이다. 처음 배울 때는 역시 라이브러리가 만들어진 언어 혹은 권장하는 언어가 좋다. 필자는 그냥 C++가 빨라보여서 C++를 사용하고자 한다.
선행조건으로 Visual Studio가 설치되어 있어야 한다. 설치는
visualstudio.microsoft.com/ko/downloads/ 이곳에서 할 수 있다. [커뮤니티]로 설치하면 된다. 공짜다
기본 설치 옵션으로 당연히 C++를 사용할 것이므로 "C++를 사용한 데스크톱 개발"을 체크해줘야 한다. 어차피 체크 못했어도 나중에 추가할 수 있으므로 상관이 없다.
먼저, 프로젝트를 만들어주고,
Window 데스크톱 마법사 -> 다음을 눌러준다.
적당한 프로젝트 이름을 만들어준 뒤에, 만들기 버튼을 클릭!
빈프로젝트 체크박스에 체크해주고 확인 버튼을 누르자.
소스파일에서 오른쪽 클릭!
그러면 이렇게 나오는데, 여기서 추가 -> 새 항목을 클릭
이렇게 C++ 파일을 눌러주고 추가를 누르면 완성!
여기서 이름을 잘 보면 cpp는 C++(씨플플)으로 만들어지며, 확장명이 .c로 끝나면 C언어로 구성된다.
OpenCV공식 홈페이지로 들어가면 다양한 버전이 나온다. 안정화 버전은 버전 3.4.13, 최신 버전은 4.5.1이다.
여기서는 4.5.1을 통해 진행해보도록 하자.
자신에게 맞는 운영체제를 선택하면 되지만, 대부분이 Windows이므로 선택!
소스포지에서 기다리면 알아서 다운로드가 시작된다. 적당한 곳에 다운로드를 받자.
211MB의 크기를 가진다. 배포 서버에 따라 속도가 천차만별 이므로 일단은 기다리자. 다운로드 받은 뒤에는 나머지 창은 꺼도 좋다.
파일명은 opencv-4.5.1-vc14_vc15.exe 이다.
실행하면 별거 없다. Extract누르자. 이건 단순히 압축해제를 시켜주는 것이다. C:\나 D:\에다가 해두면 된다.
자 이제 비주얼 스튜디오로 가자.
파일을 하나 만들고 (파일명은 main.cpp로 하자)
프로젝트란에 있는 속성을 누르자.
구성 : 모든 구성, 플랫폼 : x64로 하자 (기본 운영체제 구성이 64비트면 x64, 32비트면 win32를 선택하면 된다.)
그리고서 좌측에 있는 C/C++ 란에 일반을 클릭한 뒤
추가 포함 디렉터리에 D:\opencv\build\include를 입력한다.
만약에 다른 곳에 저장되어 있으면 저장된 위치에 있는 [ 저장된위치\opencv\build\include ]를 입력해주면 된다.
이번에는 링커 탭에 있는 일반으로 간다.
거기에도 마찬가지로 추가 라이브러리 디렉터리 란에
D:\opencv\build\x64\vc15\lib 를 입력해준다.
링커탭에 입력란으로 눌러준다.
그러면 추가 종속성이 있는데, 여기에 opencv_world451d.lib;를 입력해준다. 세미콜론 ;을 꼭 넣어줘야 한다. 컴퓨터가 인식할 때는 세미콜론으로 구분하기 때문에 반드시 넣어주자!
여기에 넣는 문장은 설치한 파일명을 명확히 입력해야 한다.
필자는 4.5.1 버전을 설치했으므로 opencv_world451d.lib가 나온것이다.
일반적으로 [ 설치한 폴더\opencv\build\x64\vc15\lib ]에서 확인할 수 있으므로 확인해보고 가자!
마지막으로
x64로 되어 있는지, 디버그 모드인지 확인하자.
자 이제 프로젝트 명을 오른쪽 클릭하면 여러 속성이 나오는데, 여기에서 파일 탐색기에서 폴더 열기를 눌러준다.
그리고서,
D:\opencv\build\x64\vc15\bin여기에 들어가면
파일 두 개가 있다. 이것을 아까 열어둔 파일 탐색기에서 폴더 열기 를 한 곳에다가 복사! 하면 된다.
프로젝트 폴더 안에 같이 나란히 존재하면 된다. 아까 사용했던 lib 파일이 아니다.
dll 확장자를 가진 파일이다. 유의하자. 컴파일러에게 파일과 파일을 연결해주는 역할을 해준다. (동적 링크라고 하며, 실행파일에서 라이브러리 기능을 사용 시에, 라이브러리를 참조해서 기능을 호출해주는 역할을 하는 것이다.)
이제 프로젝트 파일에다가 코딩 테스트를 할 png 파일을 가져다 두자.
프로젝트 폴더는 일반적으로 C:\Users\<사용자명>\source\repos\Project_OpenCV_1\Project_OpenCV_1
에 들어있다. 못 찾겠으면 위에 올라가서 탐색기에서 열기를 다시 활용하자.
아까 만들어 놓은 main.cpp에다가 입력하자.
#include<opencv2/imgcodecs.hpp>
#include<opencv2/video.hpp>
#include<opencv2/highgui.hpp>
#include<iostream>
#include<stdio.h>
using namespace std;
int main(int arg, char** argu) {
cv::Mat img = cv::imread("cat.png");
imshow("img", img);
cv::waitKey(0);
return 0;
}
확인할 용도이므로 나중에 설명하도록 하자.
타이핑이 완료되었다면,
디버깅 시작을 누르고 잠시 기다리면 프로그램이 시작된다.
귀여운 고양이가 나온다면 완료!
정말 고생했다. 이로써 우리는 OpenCV를 사용하기 위한 기본 셋팅을 완료한 것이다.
다음 시간에는 OpenCV에서 사용되는 기본적인 함수를 사용하면서 하나하나 이야기해보도록 하자.
참고 자료