- 컴퓨터 비전이란 무엇인가요?
컴퓨터가 디지털 이미지를 분석하고 이해하며, 사람과 같이 시각적인 정보를 처리하는 기술이다.
- 컴퓨터가 다루는 이미지란 무엇인가요?
컴퓨터가 다루는 이미지는 Matrix 형태로 이루어진 픽셀로 구성된 디지털 데이터이다. 픽셀은 색상과 밝기 값을 가지며 일반적으로 RGB 색상 공간으로 표현된다.
OpenCV 같은 라이브러리에서는 이미지를 Mat 형식으로 불러오고 처리할 수 있다.
- 컴퓨터 비전의 Main Topics
- 얼굴 인식 기술의 발전 (Face detection, recognition, and attributes)
얼굴을 검출하여 신원을 확인하거나 감정을 분석하는 데 사용된다. 또한 미소 감지와 같은 추가 기능도 얼굴의 감정 상태를 분석하는 데 활용된다.
- 얼굴 변형 및 생성 모델 (Face mainpulation)
얼굴 변형 기술은 얼굴 이미지를 조작하거나 생성하는 것을 포함하며, 텍스트 설명을 기반으로 새로운 얼굴 이미지를 생성하는 text-guided generation model이 그 예시이다.
- 장면 이해 (Scene understanding)
장면 이해는 컴퓨터 비전이 이미지의 장면의 구성 요소를 분석하고 해석하는 과정이다.
예를 들어, 자율 주행 시스템에서 도로의 상태, 교통 신호, 주변 차량 및 보행자를 인식하는 것을 예시로 들 수 있다.
- 이미지 품질 향상 (Quality enhancement)
안개나 연기 같은 요소로 인해 이미지가 흐릿해질 때 이를 제거하여 선명한 이미지를 얻는 기술인 Dehazing(안개 제거)이 있다.
또한 이미지의 밝고 어두운 부분의 차이를 키워 선명하게 만드는 기술인 Contrast Enhancement(대비 향상)이 있으며,
카메라 흔들림이나 움직임 때문에 생긴 이미지의 흐림을 제거하는 기술인 Deblurring(흐림 제거)가 있다.
- 3D 이미지 처리 (3D image processing)
3D Reconstruction (3D 재구성): 2D 이미지나 영상으로부터 3D 객체나 장면을 복원하는 기술이다. 카메라로 촬영된 다양한 각도의 이미지를 분석하여 3차원 구조를 만드는 것이 목표이다.
Geometry Analysis (기하 분석): 이미지나 영상에서 객체의 모양과 구조를 분석하여 객체의 기하학적 특징을 파악하는 기술이다.
Depth Estimation (깊이 추정): 2D 이미지에서 각 픽셀에 대한 깊이 정보를 추정하여, 해당 장면에서 객체가 얼마나 멀리 떨어져 있는지를 계산하는 기술이다.
NeRF Rendering (Neural Radiance Fields 렌더링): NeRF는 딥러닝 기반의 3D 렌더링 기술로, 2D 이미지 여러 장을 기반으로 3D 장면을 매우 높은 해상도로 복원하는 방법이다.
이 기술은 복잡한 광학 효과를 사실적으로 표현하는 데 강력하다.
- 로봇 공학 및 우주 탐사 (Vision for robotics and space exploration)
화성 탐사에서 컬러 파노라마 이미지는 탐사 로봇이 화성의 표면을 분석하고 이해하는 데 사용된다.
화성 탐사에서 촬영한 이미지를 복원하는 과정에서 실제로는 돌이 있지만 복원하는 과정에서 돌이 없다고 판단될 수 있다. 이러한 input이 정해져 있는 상황에서 최대한 복원하는 것이 목표이다.
- 바이오메트릭스 (Biometrics)
Fingerprint recognition (지문 인식): 각 개인의 고유한 지문 패턴을 분석하여 신원을 확인하는 생체 인식 기술이다.
Iris recognition (홍채 인식): 사람의 눈동자에 있는 홍채(iris)의 고유한 패턴을 분석하여 신원을 확인하는 기술이다.
Face anti-spoofing (얼굴 인식 안티 스푸핑): 사진, 비디오, 또는 3D 마스크와 같은 가짜 얼굴 데이터를 이용한 사기 시도를 탐지하고 방지하는 기술이다.
- 슈퍼마켓 및 상업적 응용 (Vision in supermarkets)
아마존의 무인 점포는 컴퓨터 비전 기술을 사용하여 고객이 물건을 선택하고 결제하는 과정에서 자동으로 상품을 인식하고 계산한다.
- 의료 영상 (Vision in medical imaging)
기계 학습 알고리즘을 통해 조직 검사의 이미지를 분석하고 종양을 정확하게 식별하는 데 도움을 준다. 이는 진단의 정확성과 효율성을 높이는 데 기여한다.
- 컴퓨터 비전과 딥러닝 (Computer vision with deep learning)
CNN(Convolutional Neural Networks)과 RNN(Recurrent Neural Networks) 같은 딥러닝 모델은 이미지 인식, 객체 탐지, 세분화 등 다양한 비전 작업에서 뛰어난 성능을 보여주고 있다.
CNN은 이미지의 공간적 패턴을 학습하는 데 강점을 가지며, 객체 탐지와 분류에서 뛰어난 성능을 보인다. RNN은 시간적 데이터를 처리하는 데 적합하여, 비디오 분석과 같은 연속적 장면 이해에 활용된다.
- OpenCV란?
OpenCV(Open Source Computer Vision Library)는 컴퓨터 비전 및 이미지 처리 작업을 위한 오픈 소스 라이버러리이다. 2000년에 인텔에서 시작되었으며 현재는 전 세계적으로 널리 사용되고 있다.
OpenCV는 다양한 알고리즘을 제공하여 실시간 이미지 처리, 동영상 분석, 얼굴 인식, 객체 추적, 3D 재구성 등 여러 분야에서 활용된다.
마치 C 언어에서 #include <stdio.h>를 사용해 입출력 기능을 불러오는 것과 유사하다. 그렇다면 어떻게 OpenCV같은 라이브러리를 사용할 수 있을까? Visual Studio 2022를 기준으로 알아보자.
- Install OpenCV
OpenCV는 라이브러리이기 때문에 다운만 받아도 되며 특별히 설치할 것은 없다.
https://opencv.org/releases/page/4/
Releases
OpenCV is the world’s biggest computer vision library. It’s open source, contains over 2500 algorithms and is operated by the non-profit Open Source Vision Foundation. Support OpenCV
opencv.org
오늘자 기준 OpenCV 홈페이지에 접속하여 "OpenCV – 3.4.5"를 설치해보자.
해당 PC의 기준에 맞춰 다운받으면 되는데 필자는 "Windows"를 선택하였다.
설치를 할 때 경로를 확인하여 파일이 잘 저장되어있는지 확인해야 한다.
- Visual Studio에서 OpenCV 설정
visual studio에서 "새 프로젝트 만들기" 후 "콘솔 앱"을 누른 뒤 프로젝트와 경로를 설정하여 새로운 프로젝트를 만들 수 있다. 지금은 필요하진 않지만 웬만하면 경로에 한글이 없는 것이 좋으니 이름을 영어로 설정하자.
* 경로에 한글이 없는 것이 좋은 이유 *
파일 이름이 한글일 경우 임베디드 환경에서 에러가 발생할 수 있다. 많은 임베디드 시스템은 UTF-8과 같은 문자 인코딩을 지원하지 않거나, 파일 시스템이 ASCII 문자만을 허용하는 경우가 많기 때문이다.
- 솔루션 구성 변경: Debug 모드 -> Release 모드
컴파일러가 디버깅 정보를 포함하지 않고 최적화된 코드를 생성하도록 설정을 변경하는 것을 의미한다.
Debug 모드와 Release 모드에서 사용하는 라이브러리는 차이가 있기 때문이다.
그렇기에 OpenCV에서 Debug 모드에서는 opencv_worldXXXd.lib와 같이 파일명에 d가 붙은 라이브러리를 참조해야 한다. Release 모드에서는 opencv_worldXXX.lib와 같이 Release 전용 라이브러리를 사용해야 한다.
- Project 속성 변경
OpenCV를 이용하려면 Visual Studio에서 Project 속성을 변경해야 한다. OpenCV가 제공하는 함수와 라이브러리를 사용할 수 있도록 Project에서 적절한 경로와 라이브러리를 설정해 주어야 하기 때문이다.
1) Include 디렉터리 추가
생성한 Project 이름을 클릭한 뒤
프로젝트를 누르고 속성에 들어간다.
이후 VC++ 디렉터리에 포함 디렉터리에 OpenCV의 include 폴더 경로를 설정해야 한다. 이는 OpenCV 헤더 파일을 프로젝트에서 인식할 수 있도록 하기 위함이다.
편집을 누르면 다음과 같은 창이 뜨는데 오른쪽 맨 끝을 더블 클릭해야 파일 경로를 입력하는 창이 나오니 유의하자.
파일 경로는 다음과 같다.
2) 라이브러리 디렉터리 추가
OpenCV에서 제공하는 라이브러리를 링크할 수 있도록 추가 라이브러리 디렉터리에 OpenCV의 lib 폴더 경로를 추가한 것이다. 경로는 위와 같다.
3) 링커 입력 설정(라이브러리 파일 추가)
프로젝트 속성 -> 링커 -> 입력 -> 추가 종속성에서 OpenCV 라이브러리 파일을 명시적으로 추가해야 한다.
Typing을 통해 이루어진다.
Project가 OpenCV 함수와 모듈을 링크할 수 있도록 링커 입력에 OpenCV 라이브러리를 추가하는 작업이다.
4) 환경 변수 설정
DLL 파일을 복사하여
프로젝트 -> x64 -> Release
에 넣으면 되는데 프로젝트를 한 번도 실행하지 않으면 x64가 뜨지 않으니 한 번 실행한 뒤 파일이 생성된 것을 확인한 후 복사한 것을 붙여넣자.
이로서 OpenCV를 Visual Studio에서 사용하기 위해 헤더 파일과 라이브러리 파일을 프로젝트에 설정해주고, Release 모드에서는 해당 모드에 맞는 라이브러리를 추가하는 과정까지 진행해봤다.
이제 OpenCV를 활용하여 이미지를 편집해보자.
- OpenCV 기본 코드 예제
- ImageIO with OpenCV
* 네임스페이스(namespace) *
서로 다른 코드에서 같은 이름의 함수나 변수가 있을 때 충돌을 피하기 위해 도입된 개념이다.
이와 같이 서로 다른 라이브러리에서 같은 함수를 사용할 때 namespace를 활용하면 충돌을 피할 수 있다.
- 이와 같이 namespace가 없다면 컴파일러가 어느 imshow()를 사용해야 할지 모른다.
- 하지만 충돌이 없고 위의 코드와 같이 OpenCV만 사용한다면 using namespace cv;를 사용해 cv::를 생략할 수 있다.
namespace 사용 -> OpenCV에서 제공하는 함수들 cv::를 생략하고 사용 가능
but,
다른 라이브러리에서도 동일한 이름의 함수 존재 -> 함수의 네임스페이스 명시
* png와 jpg의 차이 *
PNG는 품질 손실 없이 이미지를 여러 번 수정하거나 반복적인 편집이 필요한 경우에 적합하다. 따라서 코드에서 직접 편집하거나 여러 번 수정해야 하는 이미지를 저장할 때 PNG를 사용하는 것이 좋다.
JPG는 손실 압축을 사용하여 파일 크기를 줄이는 방식이므로, 저장 공간을 절약하거나 빠른 로딩이 필요한 상황에 적합하다.
정리하자면, PNG는 데이터 크기가 크지만 이미지 품질을 유지할 수 있는 포맷이다. 반면에 JPG는 데이터 크기를 줄여야 할 상황에서 효율적이다.
- Color Manipulation(색상 조작) with OpenCV
* image.at<Vec3b>(i, j) *
1) Vec3b 자료형
컬러 이미지에서의 픽셀값에 접근할 때 쓰이는 자료형이다.
OpenCV에서 컬러 이미지를 표현하는데 쓰이며 3개의 unsigned cha(0에서 255 범위의 값)로 이루어진 벡터 자료형이다.
(255, 0, 0)과 같은 형태의 데이터를 표현하는 자료형으로 [0]은 Blue 채널, [1]은 Green 채널, [2]는 Red 채널이다. Vec3b 객체를 만들어 RGB 값에 접근하려면 아래와 같이 작성하면 된다.
이미지에서 한 픽셀의 값을 Vec3b 자료형으로 가져오게 된다면 (a, b, c)와 같은 자료형을 얻을 수 있는데 각 채널에 따라 색이 다르다.
는 BGR 채널을 가지므로 한 픽셀에 3개의 값을 가지게 되어 <Vec3b>를 사용하여 각 채널의 uchar 값을 처리한다. 그레이스케일의 이미지는 단일 uchar로 표현할 수 있으므로 <uchar> 자료형으로 표현한다.
2) uchar 자료형
컬러 이미지를 그레이스케일로 변화한 후 픽셀에 접근할 때 쓰이는 자료형이다.
unsigned char의 약자로 0에서 255 사이의 값을 가진다.그 레이스케일 이미지 또는 단일 채널 이미지의 특정 픽셀 값을 읽거나 쓸 때 사용한다.
3) at<자료형>(세로 인덱스, 가로 인덱스) 함수
at<>()는 OpenCV의 이미지의 특정 픽셀에 접근하거나 픽셀 값을 수정할 때 사용하는 함수이다.
위의 코드와 같이 픽셀의 값을 불러올 수 있고, 수정할 수 있다.
'학부 수업 내용 정리 > 전기전자심화설계및소프트웨어실습' 카테고리의 다른 글
#10 Image Segmentation (0) | 2024.12.08 |
---|---|
#9 Face Verification with landmark points (0) | 2024.11.15 |
#3 image의 기울기를 통한 magnitude, orientation, histogram (0) | 2024.10.05 |
#2 Image Resizing && Ratation (0) | 2024.09.11 |