레이블이 비전인 게시물을 표시합니다. 모든 게시물 표시
레이블이 비전인 게시물을 표시합니다. 모든 게시물 표시

2020년 3월 8일 일요일

OpenCV 기반 형상 유사도 비교 방법

OpenCV는 컴퓨터 비전에 필요한 알고리즘 대부분이 잘 구현되어 있는 오픈소스 라이브러리이다. 이 글은 OpenCV를 이용해 Hu-Moment 기반 형상(모양) 유사도를 비교하는 방법을 간단히 설명한다.

형상 유사도와 모멘트 정의
예를 들어, 서로 다른 모양의 두개의 형상이 있다고 가정해 보자. 이 두개 형상의 유사한 정도는 어떻게 비교할 수 있을까? 이 글은 모양의 모멘트(moment)를 이용해 회전, 이동, 스케일에 독립적인 특성을 계산해 형상을 비교하는 방법을 소개한다.

모양의 모멘트는 모양을 이루는 각 픽셀의 강도에 대한 가중 평균이다. 예를 들어, 흑백 컬러를 가진 모양 I를 가정한다. x, y지점의 픽셀의 강도는 I(x, y)로 표현한다. I(x, y)는 0 혹은 1을 가질것이다. 이때 모엔트는 다음과 같다. 
M은 모든 픽셀 강도의 합이다. 다른말로, M은 강도에만 기반한 값이다. M은 모양의 회전에 불변인 값이 된다(RI. rotation invariant). 다음 그림을 보면, 두개의 A에 대한 M은 서로 같음을 알 수 있다. 하지만, M(C)는 다를것이다. M은 픽셀 강도의 합이므로 형상의 질량이라 볼 수 있다.
다음은 raw moment를 정의한다. 여기서, i, j는 0, 1, 2와 같은 정수값이된다. 이 정수값은 모양 질량의 중심을 계산할 때 사용한다.


다음 x̄, ȳ 는 모양 질량의 중심이라 정의한다.

이제 중심 모멘트(central moment)를 정의해보자. 이는 raw moment와 매우 유사하다. 이는 x, y 위치에서 질량 중심 x̄, ȳ 를 뺀 수치를 사용한다. 이렇게하면 이동에 불편이 된다(TI. translation invariant). 


여기에 다음 수식을 적용해 스케일에 불변인 정규화된 중심 모멘트(normalized central moments)를 얻는다(SI. scale invariant).
이제 유사도를 비교할 Hu Moment를 정의한다. Hu Moment는 7개 식으로 구성된다. 첫 6개 모멘트는 이동, 스케일, 회전 및 반사에 불편인 값을 제공한다. 마지막 7번째 모멘트는 반사에 따라 변경되는 부호이다. 

OpenCV 이용한 Hu Moments 및 유사도 계산
OpenCV는 Hu moment 계산함수를 다음과 같이 제공한다. 
이 함수는 이미지의 Hu Moment를 계산한 후, 유사도값을 리턴하는 matchShapes 함수에 사용된다. Hu moments는 log 변환을 통해 좀 더 계산하기 좋은 값으로 변환된다.

이 H값들을 이용해 유사도 비교를 위한 거리 함수 D(A, B)를 정의한다. A, B는 형상이다. OpenCV는 아래와 같이 3개의 거리 함수를 제공한다.
  • CONTOURS_MATCH_I1 
  • CONTOURS_MATCH_I2
  • CONTOURS_MATCH_I3
다음은 이를 이용한 이미지 형상 유사도 비교 파이썬 코드이다. fileList 배열에 가지고 있는 이미지 파일명으로 수정하면, 각 이미지 파일의 유사도 비교 결과를 확인할 수 있다.
import cv2
import numpy
print('OpenCV = ', cv2.__version__)

fileList = ["image1.jpg", "image2.jpg", "image1.jpg"]

imgList = []
for file in fileList:
img = cv2.imread(file, cv2.IMREAD_GRAYSCALE) 
imgList.append(img)

contours = []
for im in imgList:
ret, imgBin = cv2.threshold(im, 127, 255,0)
conts, hierarchy = cv2.findContours(imgBin, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contour = conts[0]
contours.append(contour)

print("Shape Distances Between \n-------------------------")
index = 0
for contour in contours:
m = cv2.matchShapes(contours[0], contour, 1, 0)
print("{0} and {1} : {2}".format(fileList[0], fileList[index], m))
index = index + 1
cv2.waitKey()

입력 이미지는 다음과 같다. 

계산 결과는 다음과 같다. 십자모양과 같은 이미지는 유사도가 0이고, 기울어진 십자모양도 0.01로 거의 유사하다. 나머지는 차이가 있는 것을 알 수 있다.

2019년 6월 5일 수요일

우분투 기반 벨로다인 라이다와 ROS 설치, 연결 및 설정

로버나 드론 기반에서 LiDAR를 연결해 스캔하고 데이터를 처리하고자 할 때, NVIDIA TK2, 라즈베리파이, 오드로이드(ODROID)와 같은 임베디드 컴퓨터를 사용해야 하는 경우가 있다.

이 글은 NVIDIA TK2, 오드로이드 등 임베디드 보드에 연결된 벨로다인 VLP16을 이용해 스캔 데이터를 ROS RVIZ로 처리하는 방법을 간략히 정리한다. 참고로, 지난번 글에서는 윈도우에서 VPL16 LiDAR 설정 방법을 다루었었다. 참고로, 오드로이드는 이 설치방법을 참고하길 바란다. NVIDIA TK2나 인텔 호환 PC도 설치 방법은 동일하다.
Velodyne VLP16 ROS RViz 실행 모습(오드로이드)

ROS 벨로다인 LiDAR VPL16 설정 및 패키지 설치
벨로다인 설정 및 설치 방법은 아래 글을 참고하였다.
LiDAR 이더넷 연결 단계는 다음과 같다. 
  1. LiDAR 파워 연결
  2. LiDAR와 오드로이드 간 이더넷 케이블 연결
  3. 오드로이드 WiFi 끄기
  4. Networks Connections 실행. edit를 선택해 IPV4 설정 탭 선택. "Method"를 "Manual"로 변경
  5. add를 선택해 IP 주소 필드에 192.168.1.70 설정
  6. Netmask는 255.255.255.0, Gateway는 0.0.0.0 설정
  7. Routes > Use this connection only for resources on its network 선택 (for WiFi connection)
  8. OK > save 선택
IPv4 setting

Routes setting

LiDAR 설정단계는 다음과 같다.
  1. 터미널에서 다음 명령 입력. sudo ifconfig eth0 192.168.3.100
  2. LiDAR IP 주소에 고정 라운트를 추가함. IP주소는 제품 CD 케이스에 포함되어 있음 (참고로 벨로다인 VLP16 라이다에 기본 설정된 IP는 192.168.1.201 임). sudo route add 192.168.XX.YY eth0 
  3. LiDAR 설정 체크를 위해, 인터넷 브라우저에 192.168.XX.YY 입력해 세부 설정 화인
혹시 eth0가 안보인다면, 다음 파일에 eth0를 설정, 맵핑한다.
sudo gedit /etc/udev/rules.d/70-persistent-net.rules

편집 내용은 다음과 같다. 여기서, ATTR{address}는 벨로다인을 연결했을 때 mac 주소이며, KERNELS는 이더넷 PCI 장치 번호이다. 이 장치 번호는  lspci -D 명령을 통해 확인할 수 있다.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="40:8D:5C:B1:D9:A0", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNELS=="0000:02:00.0", NAME="eth0"

이제, VLP16 ROS 패키지를 다음과 같이 설치한다. 참고로 VERSION은 melodic이다.
sudo apt-get install ros-VERSION-velodyne

만약 제대로 설치되지 않으면, 다음과 같이 소스코드를 다운로드받아 직접 빌드한다. 
  1. cd ~/catkin_ws/src/ && git clone https://github.com/ros-drivers/velodyne.git
  2. cd ..
  3. rosdep install --from-paths src --ignore-src --rosdistro YOURDISTRO -y
  4. cd ~/catkin_ws/ && catkin_make
혹시 rospkg 등이 제대로 설치되지 않아 빌등 에러가 발생하면 해당 패키지를 다음과 같이 설치하고 재시도한다.
pip install rospkg

제대로 설치가 되면, 다음과 같이 터미널에서 ROS를 실행한다.
source ~/.bashrc
roscore
ROS 실행된 모습

터미널에서 다음과 같이 velodyne VLP16 노드와 토픽을 실행한다.
roslaunch velodyne_pointcloud VLP16_points.launch
rosnode list
rostopic echo /velodyne_points

velodyne pointcloud node 실행 후 rosnode list 결과

rostopic echo 실행 결과

rviz 를 다음과 같이 실행한다.
rosrun rviz rviz -f velodyne

RViz에서 다음과 같이 Point Cloud 토픽 데이터를 볼 수 있도록 설정한다.
  1. RViz > display > Add 선택 후 Point Cloud2 선택 확인
  2. Topic 필드에 Point Cloud2 탭에서 "/velodyne_points" 입력 후 확인
설정 후 다음 같이 벨로다인에서 획득한 포인트 클라우드를 확인할 수 있다.

RViz 실행 모습

추신 - 요즘 오랜만에 시간이 나서 1년동안 쌓여 있던 장비와 컨텐츠들을 꺼내 쌓인 먼지를 털고 기억을 떠올려가며 정리한다. 회사가 정출연이라 직업은 연구하는 것인데, 여기 저기서 행정으로 인터럽트가 걸리고, 정신차려보면 몇년이 흘러 있는 경우가 많음. 브랜드 기술력 쌓으며 연구하기 정말 어려운 환경. - 넌센스

추신 - 시스템 안전성 테스트를 위해 2019년 6월 5일부터 현재(6월 17일)까지 LiDAR를 실행해 보았다. 아직 잘 동작하고 있다.

부록: VeloView 설치 및 실행
다음 링크를 참고해 VeloView를 설치하고 실행한다. 단, VeloView 설치 파일은 아직 64비트만 지원하고 있어, 직접 소스코드를 빌드해야 한다. 이 경우, QT4 패키지 업데이트 부분이 있는 데, 이는 오드로이드의 EGL과 Segmentation fault를 유발한다. 이 경우, 여기를 참고해 QT를 다시 설정해야 한다.
레퍼런스

오드로이드 XU4 우분투와 ROS, RVIZ 설치하기

오드로이드(ODROID)는 개발용으로 자주 사용되는 임베디드 컴퓨터로 라즈베리파이와 비슷한 크기를 가지나 성능은 훨씬 좋다.

이 글은 오드로이드에 로버 기반 LiDAR 스캔 장치를 개발하고 데이터를 획득해 볼 생각으로 진행한 우분투와 ROS(Robot Operating System)설치 방법을 간략히 정리한다.

참고로 NVIDIA, 라즈베리파이에 ROS 설치 후 비전을 개발하는 방법은 여기를 참고하길 바란다.

오드로이드 연결
다음 그림과 같이, 모니터 HDMI, 키보드, 마우스 및 WiFi 동글을 연결한다.

우분투 설치
다음 링크를 참고하여, 우분투 18.04를 설치한다.
설치 순서는 다음과 같다.
  1. ODROID 사이트에서 제공하는 우분투 이미지 다운로드
  2. 7-Zip 이용해 우분투 이미지 압축 해제
  3. Win32 Disk Imager와 이미지를 이용해 micro SD 메모리 부팅 드라이브 만들기
  4. micro SD 메모리를 오드로이드 슬롯에 삽입
  5. 오드로이드 파워 켜기
  6. 오드로이드 WiFi 동글 삽입 후 WiFi 설정
  7. 오드로이드 우분투 날짜 설정 
  8. 터미널창에서 다음 명령 이용해 우분투 업데이트 및 설치
$ sudo apt update
$ sudo apt upgrade
$ sudo apt dist-upgrade
$ sudo reboot
업데이트 중에 다음 같은 lock 파일 에러가 나올 수 있다.
E: Could not get lock /var/lib/apt/lists/lock - open (11: Resource temporarily unavailable)

이 경우, rm 명령을 실행해 lock 걸린 해당 파일을 삭제한다. 
sudo rm /var/lib/apt/lists/lock

재부팅하면 우분투가 설치된다. 이제 여러 패키지를 설치할 수 있다.
$ sudo apt install smplayer


3차원 그래픽 성능은 다음과 같이 확인한다. 
$ glmark2-es2
$ es2gears

webglsamples.org 사이트를 방문하면 webgl 예제로 성능을 테스트할 수 있다. 


ROS 설치
다음 링크를 참고해 ROS를 설치한다. ROS 버전은 melodic 이다.
오드로이드는 GPU가 없으므로 OpenGL 관련 패키지 실행시 에러가 있다. 이는 임베디드 보드에서 ROS의 RViz 사용 시 고질적인 GL 관련 에러를 발생한다. 이 문제를 해결하기 위해서 다음 명령을 우분투 터미널에서 입력한다(관련 링크). 

sudo -s
wget -O /usr/local/bin/odroid-utility.sh https://raw.githubusercontent.com/mdrjr/odroid-utility/master/odroid-utility.sh
chmod +x /usr/local/bin/odroid-utility.sh
odroid-utility.sh

오드로이드 유틸리티 쉘을 실행해 나오는 화면에서 6번 화면을 선택해 업데이트한다. 

내장된 Embedded GL인 EG를 사용해야 하므로, 이에 맞게 GUI로 사용되는 QT를 다시 업데이트해야 한다. 다음 명령을 터미널에 입력해 실행한다(관련 링크).

sudo apt update && sudo apt upgrade
sudo apt install libfbclient2 libodbc1 libpq5 libsybdb5 libgles2-mesa-dev libxext-dev libinput-dev libxkbcommon-dev
wget https://dn.odroid.com/5422/ODROID-XU3/Ubuntu/qt5.9.5_armhf_bionic.tar.gz
tar xvfz qt5.9.5_armhf_bionic.tar.gz
cd qt5.9.5_armhf_bionic/
sudo dpkg -i *.deb

제대로 설치되었다면, 다음 명령을 실행했을 때 QT 3D 그래픽 창을 볼 수 있다. 
DISPLAY=:0.0 /usr/lib/arm-linux-gnueabihf/qt5/examples/opengl/hellogles3/hellogles3


참고로, 디스크 용량을 절약하려면, 다운로드한 파일들을 다음처럼 삭제다.
cd ..
rm -rf qt5.9.5_armhf_bionic*

ROS와 RVIZ 실행
다음 명령을 실행한다.
source ~/.bashrc
roscore

이제 터미널 창을 하나 더 띄우고, 다음 명령을 실행한다. 혹시 GL관련 에러가 있다면, ROS RVIZ Troubleshooting 페이지를 참고해 "export LIBGL_ALWAYS_SOFTWARE=1" 명령어를 이용하여 하드웨어 가속기를 OFF한다. 
rosrun rviz rviz

그럼 다음과 같이 오드로이드 우분투 환경에서 RVIZ 화면을 확인할 수 있다.


ROS 상세한 사용법은 다음 튜토리얼 및 레퍼런스를 참고한다.
기타, ROS 관련 3D 이미지 비전은 이 링크를 참고한다.

2018년 6월 19일 화요일

밸로다인 LiDAR 센서와 VeloView 사용기

이 글은 밸로다인(Velodyne) LiDAR 센서와 VeloView 사용기를 간략히 공유한다.

진행 중인 연구과제 핵심 기술을 좀 더 깊게 이해하기 위해, 벨로다인 센서를 구입해 분석중이다. 2014년부터 진행한 비전 역설계 과제의 활용 센서는 Kinect, Intel RGBD sensor, RPLiDAR 였다. 이때 목적은 저렴한 스캔 기술이 가능한지 파악하는 것이었다. 그때 문제는 정확도와 밀도였는 데, Trimble TX5 LiDAR에 비해 현격하게 차이나는 정확도와 밀도는 플랜트와 같은 정밀 엔지니어링에 활용하기 어려운 수준이었다(플랜트 대상).

밸로다인센서 VLP-16은 IMU 데이터를 입력받을 수 있는 데이터 통합 보드를 함께 제공한다. 센서 스펙 (문서 다운로드)은 다음과 같다. 참고로, TX5 같은 전문적인 LiDAR 센서는 최소 수백만 포인트 이상 획득되는 데 실시간은 아니며, 가격이 고가이다. 참고로, 저가 모델인 VLP-16은 7~8백만원대로 구입할 수 있다.
  • Dual Returns
  • 830 grams
  • 16 Channels
  • 100m Range
  • Up to 600,000 Points per Second
  • 360° Horizontal FOV
  • ±15° Vertical FOV
  • Low Power Consumption
  • Protective Design
벨로다인에서 얻은 (X, Y, Z, I) 데이터로 구성된 포인트 클라우드 데이터에는 가속도 값이 포함되어 있지 않다. 센서가 기울어지면, 데이터도 함께 기울어지므로, 이를 보정할려면, IMU에서 제공하는 Xa, Ya, Za 가속도 값이 필수적이다. 통합 보드에 IMU를 장착하고, 데이터를 취득하면, (X, Y, Z, I, Xa, Ya, Za) 값이 함께 TCP/IP 케이블을 통해 컴퓨터에 전달되는 구조이다.
센서, 데이터 통합 보드 및 통신 케이블

벨로다인 라이다 센서

데이터 통합 보드

이론상 VLP-16센서는 100미터까지 스캔을 할 수 있다. 본인은 사무실 공간에서 스캔을 해 보았는 데, 600 미터제곱 면적의 사무실 공간 벽체까지 스캔되는 것을 확인하였다. 참고로, 사무실은 둥근 직사각형 모양이며, 중간에서 벽체까지 거리는 25미터 정도이다.
스캔된 포인트 클라우드 모습

밸로다인 센서를 구동하는 프로그램은 VeloView이다. 윈도우에서는 VeloView를 설치하면드라이버가 함께 설치된다. TCP/IP4 네트워크 등 설정 후, 프로그램을 실행하고 연결된 라이다 장치를 VLP-16으로 선택하면 바로 점군을 실시간으로 볼 수 있다. 

TCP/IP4 설정

단, TCP/IP 이더넷 케이블 통신이므로, 방화벽이 있는 경우, 비활성화해야 한다. 우분투 리눅스에서는 아래 github 링크에서 다운로드 받은 VeloView 소스를 빌드해야 한다. 
VeloView는 포인트 클라우드를 시계열방식으로 캡쳐할 수 있는 기능있다. .pcap 점군 캡쳐파일을 저장한 후, 다시 재생할 수 있다. VeloView의 자세한 기능은 다음 영상을 참고한다.

ParaView는 획득된 점군을 분석하고, 처리하는 프로그램으로 구입시 함께 포함되어 있다. 오픈소스이므로, 다운로드받아 설치해도 된다. 

ParaView 활용 예

3차원 점군은 대용량이다. 임베디드 보드는 대용량 점군 처리가 가능한 것이어야 하며, 다음과 같은 것을 추천한다. 
NVIDIA TX2
NVIDIA TX2 CARRIER BOARD(캐리어 보드. TX2 개발보드 크기가 너무 커 이동성이 떨어진다면 캐리어 보드를 사용하면 된다. USB 인식이 안될 경우에는 이 링크(#1, #2)를 참고 한다)

다음은 라떼판다(LATTE PANDA) 임베디드 컴퓨터에 VELOVIEW를 설치한 후 실행한 모습이다. 큰 문제 없이 포인트 클라우드가 실시간으로 획득되어 가시화되는 것을 확인할 수 있다.
 



아래는 ODROID XU4에 VLP16를 마운트해 만든 드론 기반 LiDAR 스캔 프로젝트 사례이다. 

이제, 엔지니어링 전용 라이다, 토탈 스테이션과 밸로다인 센서의 정확도, 밀도를 확인 비교해 볼 계획이다.

2018년 3월 2일 금요일

우분투 블랙 스크린 문제 해결 방법

이 글은 고질적인 우분투 블랙 스크린(black screen) 문제 솔류션 트리를 간략히 요약한다. 이 문제는 우분투 부팅했는 데, 로그인 조차 안되는 검정색 화면만 보여지는 현상이다. 

블랙 스크린 문제는 14.04, 16.04 모두 공통적으로 발생된다. 주 발생 원인은 NVIDIA + Unity + ubuntu 간에 충돌 발생이다. 충돌 발생 원인은 매우 다양하다. 정상적인 apt-get install 설치 후에도 발생할 수 있다. 이번엔 터치패드 패키지 욕심내어 설치하다, 노트북이 또 벽돌 되어 버렸다(Deja-dup 백업도 의미 없다. 다시 솔류션 트리를 수행하고, 아애 그 과정을 영원히 기록해 놓을 요량으로 글을 쓴다). 그냥 운이 없으면 블랙 스크린을 만난다고 보면 될 것이다.
욕심내지 말껄 T.T~

블랙 스크린은 로그인 메시지도 안뜨는 벽돌 상태로 변하기 때문에, 당하면 멘붕 오게 된다. 
정신이 붕괴되는 빌어먹을 블랙 스크린(처음 대면하면 우주에 혼자 미아가 된 듯 너무 막연하고 황당하다)

본인은 두대의 노트북을 이렇게 날려먹고, 수십번의 블랙 스크린과 무한 구글링을 경험했다. 지금은 아래 솔류션 트리로 한 두시간 만에 벽돌 노트북을 살릴 수 있다.

1. 터미널 모드 부팅 및 NVIDIA 드라이버 재설치
부팅 시 grub에서 e 키를 입력해, grub 스크립트의 부팅 옵션에 nomodeset 옵션(이후 제대로 드라이버 설치된 후에 부팅안되면, 이 옵션을 삭제한 후 부팅 시도)을 추가한 후 F10입력해 부팅함. 이후, 터미널모드(CTRL+ALT+F1)로 부팅한다. 그리고, nvidia 드라이버를 삭제 후, 재 설치해야 한다.

sudo apt-get purge nvidia-*
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt-get update

NVIDIA GTX 1070일 경우 다음과 같이 해당 버전의 드라이버를 설치한다. 아니면, 본인 GTX 버전에 맞는 드라이버 번호를 확인(링크)하고, 설치하라.
sudo apt-get install nvidia-384
(혹은 367, 375, 525)

2. 우분투 데스크탑 재설치
운이 없다면, 블랙 스크린 문제가 계속 발생할 것이다. 
이 경우, 다음과 같이, unity, nvidia, ubuntu-desktop, ubuntu-session을 모두 purge하고, 재부팅 후 다시 설치한다.
sudo apt-get purge unity*
sudo apt-get purge nvidia-*
sudo apt-get install ubuntu-desktop
sudo apt-get install ubuntu-session

혹시, 디펜던시 에러가 발생한다면 해당 버전 패키지를 설치하여 해결한다(링크 참고)

2015년 7월 29일 수요일

3차원 비전 기반 객체 인식

이 글은 3차원 기반 객체 인식 과정을 정리한 글이다. 포인트 클라우드를 획득한 상황을 가정한다. 이와 관련된 기본적인 알고리즘은 이미 논문과 관련 PCL과 같은 소스로 오픈되어 있다. 당연하지만, 특정 목적에 맞게 응용하기 위해서는 관련된 이론을 파악하고 있어야 한다.

보통 객체 인식과정은 다음과 같다.

1. 3차원 포인트 클라우드 획득
2. 필터링
포인트 클라우드는 데이터 양이 매우 많다. 그러므로, 불필요한 노이즈 등을 제거한다. 또한, 관심 영역만 필터링한다. 만약, 정밀도 높은 객체 인식이 필요하지 않은 경우, LOD (Level Of Detail)을 줄인다. 이는 Octree와 같은 공간인덱싱 기법을 이용해 빠른 속도로 처리 가능하다.
Octree 처리 모습 (nvidia)

3. 특징점 추출
특징점은 좌표 변환, 스케일 변환에 불변인 고유한 특징을 가진 점이다. 특징점을 획득하면, 여러 위치에서 스캔한 포인트 클라우드를 손쉽게 정합하거나, 포인트 클라우드를 세그먼테이션하거나 하는 등의 작업을 할 수 있다.

특징점을 얻기 위해서는, 반듯이 주어진 포인트 클라우드 PCD={P0...Pn} 의 모든 점 P에 대한 법선 벡터 Np를 계산해야 한다. 이를 위해서는 P 주변을 미소평면 PLN이라 가정하고, 미소평면상에 있는 포인트들 PLNp을 획득해야 한다. 이는 kNN 알고리즘을 통해 계산할 수 있다.

   PLNp = kNN(P)
kNN(Bandwidth Selection and Reconstruction Quality in Point-Based Surfaces. IEEE)

획득한 PLNp 을 다음 PCA 모델을 이용해, 미소평면 PLN을 획득하고, 여기서, 법선벡터 Np를 구한다. PCA는 주어진 포인트 들을 이용해, 공분산을 계산하여, 고유치를 획득한다. 고유치의 주성분이 평면을 구성하는 X, Y, Z축이 된다.

\mathbf{w}_{(1)} = {\operatorname{\arg\,max}}\, \left\{ \frac{\mathbf{w}^T\mathbf{X}^T \mathbf{X w}}{\mathbf{w}^T \mathbf{w}} \right\}

다음은 이렇게 계산된 법선벡터 Np이다.

법선벡터가 계산된 후에, 이 값을 이용해, 특징값들을 계산한다. 예를 들어, Point Feature Histograms (PFH) 와 같이, 두 이웃 포인트 Np1, Np2 간 법선벡터의 변화를 히스토그램화하여, 빈에 그 변화량을 누적하여, 특징으로 사용한다.

이 과정을 전체 포인트에 적용한다.

4. 세그먼테이션
앞서 계산된 법선벡터와 포인트들 간 거리를 이용해, 주어진 포인트 클라우드를 곡률 및 거리에 근거에 분할할 수 있다. 이외에, 다양한 포인트 속성값을 이용할 수 있는 데, 다음 그림은 색상을 이용해, 세그먼테이션한 것이다.

색상 기반 세그먼테이션 (PCL)

또한, 직선, 원, 호, 구, 평면, 실런더 등의 기본 모형을 정의하여, RANSAC알고리즘을 이용해 이 기본 모형에 가장 잘 부합하는 포인트 클라우드를 추출할 수 있다.

RANSAC

5. 객체 인식
객체를 인식한다는 것은, 객체의 형상, 위치, 크기, 치수 및 속성값 등을 추출한다는 것이다. 세그먼테이션을 하였다면, 각 세그먼트마다, 이 속성값들을 추출하기 위해, 다양한 전략을 적용한다.

1) Hough Transformation
허프변환을 통해, 기본 형상의 단면에 대해 가장 잘 부합하는 치수를 찾는다. 허프변환은 2차원 비전에도 활용된 방식으로, 정규분포를 가정하고, 모델 치수의 평균값을 계산한다.

2) PFH Matching
인식하고자 하는 모델의 특징점 히스토그램을 미리 저장해 놓고, 입력되는 PCD에 대해, 이 값과 비교한다. 이는 2차원 비전에서 히스토그램 매칭과 같은 개념이다.

3) RANSAC
모델을 수학적으로 미리 정의해 놓는다. 그리고, 주어진 PCD의 샘플점을 획득해, 수학적 모델을 만들고, 이 모델과 PCD가 얼마정도 부합하지지 inlier 포인트 갯수를 계산한다. 이를 통해, 모델과 유사도를 계산해, 유사도가 미리 정의한 Tolerance 값을 넘으면, 그 모델의 수치가 PCD와 일치한 것으로 가정한다.

4) Curve fitting
커브 피팅은 주어진 PCD에 가장 일치하는 수학 모델의 계수값을 계산하는 방식이다. 예를 들어, 다음과 같은 모델 수식이 있다고 하면,

P(t) = ax + by + c

여기서, 주어진 포인트 P={x, y, z} 의 군 PCD에 대해, 이 모델 수식과 가장 잘 부합하는 a, b, c값을 찾는다. 이는 복잡한 수치해석이 필요하다.

5) ICP (Interactive Iterative Closest Point)
두개의 포인트 클라우드 PCD1, PCD2가 있을 경우, 각 PCD의 특징점 집합을 구해, 서로 위치가 같도록 (서로간의 거리가 가깝도록), 좌표 변환 행렬을 계산해 각 PCD에 적용한다. 그리고, 이 과정을 계산된 거리 편차가 Tolerance이하 일때까지 반복적으로 실행한다.

만약, 두 포인트 클라우드가 같다면, 정확히 위치가 일치된다. 이런 방식이기 때문에, 정합과정에서 기본적으로 사용된다.

ICP (PCL)


6. 객체 생성
이제, 각 알고리즘에서 획득된 값을 이용해, 다음과 같이 객체를 정의할 수 있다.