SlideShare a Scribd company logo
사물인터넷
Internet of Things (IoT)
CHAPTER 6
_사물인터넷과 영상처리
Chapter 6.1 OpenCV란
OpenCV란?
OpenCV means Intel® Open Source Computer Vision Library.
It is a collection of C functions and a few C++ classes that implement
some popular Image Processing and Computer Vision algorithms.
인텔에서 개발한 컴퓨터 비전 라이브러리로 다양한 OS에서 동작하는 Cross-platform API.
이미지 프로세싱 라이브러리: OpenGL
비전 프로세싱 라이브러리: OpenCV
이미지 프로세싱 비전 프로세싱
대상 이미지(Image) 피쳐(Feature)
애플리케이션 Noise filtering,
Compression,
Edge detection
Face detection,
Face recognition,
Object tracking
Chapter 6.1 OpenCV란
OpenCV는 실제로 네가지의 라이브러리를 포함하고 있음
- CV: Computer vision algorithms (대부분의 비전처리 알고리즘)
- CVAUX: Experimental/Beta (베타버전 알고리즘)
- CXCORE: Linear algebra (선형대수)
- HIGHGUI: Media/window handling (비디오 읽고 쓰기, 윈도우 디스플레이 등)
Chapter 6.2 OpenCV 애플리케이션
OpenCV를 기반으로 한 애플리케이션
- 동영상 스트리밍
- Text 인식 및 번역
- Security 및 Monitoring
- 무인 자동차 및 쿼드콥터의 영상 처리
- 모션 인식 게임 인터페이스
Chapter 6. 3 OpenCV 라즈베리파이에 설치하기
Step 1. 라즈베리파이 B+ 혹은 2를 준비 (Chapter 3 라즈베리파이 기본 참고)
Step 2. Operating System을 설치 (Chapter 3 라즈베리파이 기본 참고)
Step 3. 데스크탑 화면의 LXTerminal을 열기
Step 4. 라즈베리파이의 패키지들을 업데이트하고 업그레이드
pi@raspberrypi ~$ sudo apt-get update
pi@raspberrypi ~$ sudo apt-get upgrade
pi@raspberrypi ~$ sudo rpi-update
Chapter 6. 3 OpenCV 라즈베리파이에 설치하기
Step 5. 필요한 개발툴과 패키지를 설치
Step 6. 이미지 입출력(I/O) 패키지 설치, JPEG, PNG, TIFF를 읽고 처리할 수 있음
Step 7. 이미지를 스크린을 통해서 볼 수 있도록 GTK를 설치 (Graphical User Interface Tool Kit)
Step 8. 비디오 입출력(I/O) 패키지 설치
Step 9. 선형대수를 위한 라이브러리 및 scs (splitting cone solver)를 위한 라이브러리 설치
pi@raspberrypi ~$ sudo apt-get install build-essential cmake pkg-config
pi@raspberrypi ~$ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev
libpng12-dev
pi@raspberrypi ~$ sudo apt-get install libgtk2.0-dev
pi@raspberrypi ~$ sudo apt-get install libavcodec-dev libavformat-dev libsws
cale-dev libv4l-dev
pi@raspberrypi ~$ sudo apt-get install libatlas-base-dev gfortran
Chapter 6. 3 OpenCV 라즈베리파이에 설치하기
Step 10. pip 설치 (파이썬 관련 프로그램 설치시 많이 사용)
Step 11. virtualenv virtualenvwrapper을 pip를 사용하여 설치
Step 12. profile에 다음의 라인을 추가 (profile은 etc라는 폴더에 있음)
Step 13. 컴퓨터 비전 Virtual Environment를 설치
pi@raspberrypi ~$ wget https://bootstrap.pypa.io/get-pip.py
pi@raspberrypi ~$ sudo python get-pip.py
pi@raspberrypi ~$ sudo pip install virtualenv virtualenvwrapper
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
pi@raspberrypi ~$ mkvirtualenv cv
pi@raspberrypi ~$ export WORKON_HOME=$HOME/.virtualenvs
pi@raspberrypi ~$ source /usr/local/bin/virtualenvwrapper.sh
pi@raspberrypi ~$ source ~/.profile
pi@raspberrypi ~$ sudo nano /etc/profile
Chapter 6. 3 OpenCV 라즈베리파이에 설치하기
Step 14. 파이썬 2.7과 numpy 설치
Step 15. OpenCV 설치하고 압축풀기
Step 16. OpenCV 설치하기 (make 후 약 8시간 소요)
(cv) pi@raspberrypi ~$ sudo apt-get install python2.7-dev
(cv) pi@raspberrypi ~$ pip install numpy
(cv) pi@raspberrypi ~$ wget -O opencv-2.4.10.zip http://sourceforge.net/proj
ects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip/download
(cv) pi@raspberrypi ~$ unzip opencv-2.4.10.zip
(cv) pi@raspberrypi ~$ cd opencv-2.4.10
(cv) pi@raspberrypi ~$ mkdir build
(cv) pi@raspberrypi ~$ cd build
(cv) pi@raspberrypi ~$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_I
NSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D INSTA
LL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAM
PLES=ON ..
(cv) pi@raspberrypi ~$ make
Chapter 6. 3 OpenCV 라즈베리파이에 설치하기
Step 17. 파이썬 2.7과 numpy 설치
Step 15. OpenCV 설치하고 압축풀기
Step 16. OpenCV 설치하기
(cv) pi@raspberrypi ~$ sudo make install
(cv) pi@raspberrypi ~$ sudo ldconfig
(cv) pi@raspberrypi ~$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
(cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv
2.so
(cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv.py cv.p
y
(cv) pi@raspberrypi ~$ workon cv
(cv) pi@raspberrypi ~$ python
>>> import cv2
>>> cv2.__version__
'2.4.10‘
Chapter 6. 4. 카메라 라이브러리 설치하기
Step 17. 파이썬 2.7과 numpy 설치
Step 15. OpenCV 설치하고 압축풀기
Step 16. OpenCV 설치하기
(cv) pi@raspberrypi ~$ sudo make install
(cv) pi@raspberrypi ~$ sudo ldconfig
(cv) pi@raspberrypi ~$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/
(cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv
2.so
(cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv.py cv.p
y
(cv) pi@raspberrypi ~$ workon cv
(cv) pi@raspberrypi ~$ python
>>> import cv2
>>> cv2.__version__
'2.4.10‘
Chapter 6. 4 실습: 얼굴 인식 (Face detection)
Chapter 6. 4 실습: 얼굴 인식 (Face detection)
Viola/Jones Face Detector
<관련논문>
P. Viola and M. Jones. Rapid object detection using a boosted cascade of simple featur
es. CVPR 2001.
P. Viola and M. Jones. Robust real-time face detection. IJCV 57(2), 2004.
Training Data
• 5000 faces
• All frontal, 24x24 pixels
• Normalized, scaled, translated
핵심 테크닉
• Rectangle features (Haar feature)
• Integral images for fast computation
• Ada-Boosting for feature selection
• Attentional cascade for fast rejection of negati
ve windows
가장 널리 알려진 얼굴 인식 (Face detection) 알고리즘으로 Viola와 Jones에 의해서 고
안됨.
• Rectangle feature
간단히 설명하면,
F= (흰부분 픽셀) – (어두운부분 픽셀)
눈 부분은 어둡고 코와 입부분은 밝음
F 값이 큼 >> “얼굴로 인식”
Chapter 6. 4 실습: 얼굴 인식 (Face detection)
• Ada-Boosting for feature selection
간단히 설명하면,
보다 좋은 classifier를 찾기 위해 트레이닝하는 방법으로, 약한 classifier의 집합으
로 strong한 classifier를 구성한다는 것. Ada는 adaptive의 약자.
• Integral images for fast computation
어느 영역의 면적을 구할 때, 단순히 더하기 빼기로 빨리 구할 수 있다는 컨셉.
즉, 점D의 값이 (1-2-D-5) 면적, B의 값이 (1-3-B-5)의 면적, A값이 (1-3-A-7)의
면적, 그리고 C의 값이 (1-2-C-7)의 면적이라고 할 때, 파란색 면적 (A-C-D-B)
은 각각의 적분 면적을 더하고 빼서 구할 수 있음: A의 값-B의 값-C의 값+D의
값 = 파란색 면적
• Attentional cascade for fast rejection of negative windows
1 2 3 4
5 6
7 8
Ada-boost classifier를 통해 얼굴이 아닌 것은 버려지고 얼굴인 것만 계속적으로
검출
Ada-boost
Classifier1
Ada-boost
Classifier2
Ada-boost
Classifier3
True True True
Face
found
Non-face Non-face
Input image
False False False
Non-face
Chapter 6. 4 실습: 얼굴 인식 (Face detection)
import cv2.cv as cv
cv.NamedWindow('a', 1)
cap = cv.CaptureFromCAM(-1)
cv.SetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_HEIGHT, 240)
cv.SetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_WIDTH, 320)
hc = cv.Load("haarcascade_frontalface_alt.xml")
while True:
frame = cv.QueryFrame(cap)
face = cv.HaarDetectObjects(frame, hc, cv.CreateMemStorage(), 1.05,2, cv.CV_HAAR_DO_CANNY_PRUNING, (120,120))
for (x,y,w,h),n in face:
cv.Rectangle(frame,(int(x),int(y)),(int(x)+w,int(y)+h),(255,0,255),8,0)
cv.ShowImage('a', frame)
c = cv.WaitKey(1)
if c == 13:
exit(0)
Python 코드 using webcam
Chapter 6. 5 실습: 달걀 인식 (egg detection)
import time
import serial
import picamera
import picamera.array
import cv2
import cv2.cv as cv
import numpy as np
hsv_min = np.array([20, 130, 100])
hsv_max = np.array([40, 180, 120])
width = 320
height = 240
with picamera.PiCamera() as camera:
with picamera.array.PiRGBArray(camera) as stream:
camera.resolution = (width,height)
camera.vflop = True
while True:
camera.capture(stream, format='bgr', use_video_port=True)
edges = cv2.Canny(stream.array, 100,300)
hsv = cv2.cvtColor(stream.array, cv2.COLOR_BGR2HSV)
imgray = cv2.cvtColor(stream.array, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:5]
screenCnt = None
Python 코드 using Pi-camera
for h, cnt in enumerate(contours):
peri = cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, 0.01*peri, True)
screenCnt = approx
M = cv2.moments(cnt)
if M['m00']!=0:
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
else:
cx = width/2
cy = height/2
center = np.array([cx,cy])
R_arr = np.zeros((1000,5))
for idx, val in enumerate(cnt):
R_arr[idx][h]= np.linalg.norm(val-center)
R = R_arr[:,h]
ratio = np.min(R[np.nonzero(R)])/max(R_arr[:,h])
cv2.circle(hsv, (cx, cy), 2, (255,0,0),2)
if cx < width and cy < height and ratio > 0.6 and ratio < 0.75:
cv2.putText(hsv, 'EGG', (cx,cy+10), cv2.FONT_HERSHEY_SIMPLEX,
0.4, (255,255,255), 1, 8)
else:
cv2.putText(hsv, str(ratio), (cx,cy), cv2.FONT_HERSHEY_SIMPLEX,
0.4, (255,255,255), 1, 8)
cv2.putText(hsv, str(hsv[cy-10,cx-10]), (cx,cy-15), cv2.FONT_HERSHEY_SIMPLEX,
0.4, (255,255,255), 1, 8)
if ratio > 0.6 and ratio < 0.75:
cv2.drawContours(hsv, [screenCnt], -1, (0,255,0),1) #[screenCnt was contours]
mask = cv2.inRange(hsv, hsv_min, hsv_max)
cv2.imshow('color-based', hsv)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
stream.seek(0)
stream.truncate()
cv2.destroyAllWindows()

More Related Content

What's hot

[IoT] MAKE with Open H/W + Node.JS - 1st
[IoT] MAKE with Open H/W + Node.JS - 1st[IoT] MAKE with Open H/W + Node.JS - 1st
[IoT] MAKE with Open H/W + Node.JS - 1stPark Jonggun
 
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인Seunghwa Song
 
강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍chcbaram
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340Samsung Electronics
 
강좌 03 개발환경 구축
강좌 03 개발환경 구축강좌 03 개발환경 구축
강좌 03 개발환경 구축chcbaram
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계chcbaram
 
[드론] 펌웨어 분석 [2015.5.23]
[드론] 펌웨어 분석 [2015.5.23][드론] 펌웨어 분석 [2015.5.23]
[드론] 펌웨어 분석 [2015.5.23]chcbaram
 
라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남Jae Sang Lee
 
SkyRover Firmware
SkyRover FirmwareSkyRover Firmware
SkyRover Firmwarechcbaram
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++KyeongWon Koo
 
Python server-101
Python server-101Python server-101
Python server-101Huey Park
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍준혁 이
 
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)어형 이
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기Huey Park
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥Seomgi Han
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기GangSeok Lee
 
About raspberrypi
About raspberrypiAbout raspberrypi
About raspberrypiYeonah Ki
 

What's hot (20)

[IoT] MAKE with Open H/W + Node.JS - 1st
[IoT] MAKE with Open H/W + Node.JS - 1st[IoT] MAKE with Open H/W + Node.JS - 1st
[IoT] MAKE with Open H/W + Node.JS - 1st
 
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
이기종 멀티코어 기반의 Open cv 응용 사례 및 효율적인 어플리케이션 디자인
 
강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍강좌 05 통신용 PC 프로그래밍
강좌 05 통신용 PC 프로그래밍
 
kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340kics2013-winter-biomp-slide-20130127-1340
kics2013-winter-biomp-slide-20130127-1340
 
강좌 03 개발환경 구축
강좌 03 개발환경 구축강좌 03 개발환경 구축
강좌 03 개발환경 구축
 
강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계강좌 04 펌웨어 구조 설계
강좌 04 펌웨어 구조 설계
 
[드론] 펌웨어 분석 [2015.5.23]
[드론] 펌웨어 분석 [2015.5.23][드론] 펌웨어 분석 [2015.5.23]
[드론] 펌웨어 분석 [2015.5.23]
 
라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남
 
SkyRover Firmware
SkyRover FirmwareSkyRover Firmware
SkyRover Firmware
 
Docker설치
Docker설치Docker설치
Docker설치
 
[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++[0618구경원]초보 게임프로그래머를 위한 c++
[0618구경원]초보 게임프로그래머를 위한 c++
 
pyOpenCL 입문
pyOpenCL 입문pyOpenCL 입문
pyOpenCL 입문
 
Python server-101
Python server-101Python server-101
Python server-101
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)manage inhouse openstack the hard way(kakao case study about 10,000 vms)
manage inhouse openstack the hard way(kakao case study about 10,000 vms)
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Node.js 시작하기
Node.js 시작하기Node.js 시작하기
Node.js 시작하기
 
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
파이콘 한국 2019 - 파이썬으로 서버를 극한까지 끌어다 쓰기: Async I/O의 밑바닥
 
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기[2014 CodeEngn Conference 10] 노용환 -  디버거 개발, 삽질기
[2014 CodeEngn Conference 10] 노용환 - 디버거 개발, 삽질기
 
About raspberrypi
About raspberrypiAbout raspberrypi
About raspberrypi
 

Similar to 사물인터넷 노트7_사물인터넷과 영상처리

Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Sangon Lee
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기Jaeseung Ha
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptxwonyong hwang
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현NAVER Engineering
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debuggingJongwon Han
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Appsjungkees
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅NAVER D2
 
보안프로젝트 세미나 Viper-v1.2
보안프로젝트 세미나 Viper-v1.2보안프로젝트 세미나 Viper-v1.2
보안프로젝트 세미나 Viper-v1.2Jason Choi
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주iamhjoo (송형주)
 
Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypiYeonah Ki
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02정출 김
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine LearningJEEHYUN PAIK
 
톰캣 #10-모니터링
톰캣 #10-모니터링톰캣 #10-모니터링
톰캣 #10-모니터링GyuSeok Lee
 
Image and deep learning 07-2
 Image and deep learning 07-2 Image and deep learning 07-2
Image and deep learning 07-2PartPrime
 
pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나
pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나
pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나슬 김
 

Similar to 사물인터넷 노트7_사물인터넷과 영상처리 (20)

Android ndk jni 설치및 연동
Android ndk jni 설치및 연동Android ndk jni 설치및 연동
Android ndk jni 설치및 연동
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
Modern PHP
Modern PHPModern PHP
Modern PHP
 
Spring boot DI
Spring boot DISpring boot DI
Spring boot DI
 
Vue.js 기초 실습.pptx
Vue.js 기초 실습.pptxVue.js 기초 실습.pptx
Vue.js 기초 실습.pptx
 
KAFKA 3.1.0.pdf
KAFKA 3.1.0.pdfKAFKA 3.1.0.pdf
KAFKA 3.1.0.pdf
 
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
[네이버오픈소스세미나] Pinpoint를 이용해서 서버리스 플랫폼 Apache Openwhisk 트레이싱하기 - 오승현
 
20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging20170813 django api server unit test and remote debugging
20170813 django api server unit test and remote debugging
 
Progressive Web Apps
Progressive Web AppsProgressive Web Apps
Progressive Web Apps
 
[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅[232] 성능어디까지쥐어짜봤니 송태웅
[232] 성능어디까지쥐어짜봤니 송태웅
 
보안프로젝트 세미나 Viper-v1.2
보안프로젝트 세미나 Viper-v1.2보안프로젝트 세미나 Viper-v1.2
보안프로젝트 세미나 Viper-v1.2
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 
Python on Android
Python on AndroidPython on Android
Python on Android
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypi
 
ARTIK 710 IoT class 02
ARTIK 710 IoT class 02ARTIK 710 IoT class 02
ARTIK 710 IoT class 02
 
Tensorflow service & Machine Learning
Tensorflow service & Machine LearningTensorflow service & Machine Learning
Tensorflow service & Machine Learning
 
톰캣 #10-모니터링
톰캣 #10-모니터링톰캣 #10-모니터링
톰캣 #10-모니터링
 
Image and deep learning 07-2
 Image and deep learning 07-2 Image and deep learning 07-2
Image and deep learning 07-2
 
pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나
pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나
pip, virtualenv, vagrant - Python Korea 2014년 6월 세미나
 

사물인터넷 노트7_사물인터넷과 영상처리

  • 1. 사물인터넷 Internet of Things (IoT) CHAPTER 6 _사물인터넷과 영상처리
  • 2. Chapter 6.1 OpenCV란 OpenCV란? OpenCV means Intel® Open Source Computer Vision Library. It is a collection of C functions and a few C++ classes that implement some popular Image Processing and Computer Vision algorithms. 인텔에서 개발한 컴퓨터 비전 라이브러리로 다양한 OS에서 동작하는 Cross-platform API. 이미지 프로세싱 라이브러리: OpenGL 비전 프로세싱 라이브러리: OpenCV 이미지 프로세싱 비전 프로세싱 대상 이미지(Image) 피쳐(Feature) 애플리케이션 Noise filtering, Compression, Edge detection Face detection, Face recognition, Object tracking
  • 3. Chapter 6.1 OpenCV란 OpenCV는 실제로 네가지의 라이브러리를 포함하고 있음 - CV: Computer vision algorithms (대부분의 비전처리 알고리즘) - CVAUX: Experimental/Beta (베타버전 알고리즘) - CXCORE: Linear algebra (선형대수) - HIGHGUI: Media/window handling (비디오 읽고 쓰기, 윈도우 디스플레이 등)
  • 4. Chapter 6.2 OpenCV 애플리케이션 OpenCV를 기반으로 한 애플리케이션 - 동영상 스트리밍 - Text 인식 및 번역 - Security 및 Monitoring - 무인 자동차 및 쿼드콥터의 영상 처리 - 모션 인식 게임 인터페이스
  • 5. Chapter 6. 3 OpenCV 라즈베리파이에 설치하기 Step 1. 라즈베리파이 B+ 혹은 2를 준비 (Chapter 3 라즈베리파이 기본 참고) Step 2. Operating System을 설치 (Chapter 3 라즈베리파이 기본 참고) Step 3. 데스크탑 화면의 LXTerminal을 열기 Step 4. 라즈베리파이의 패키지들을 업데이트하고 업그레이드 pi@raspberrypi ~$ sudo apt-get update pi@raspberrypi ~$ sudo apt-get upgrade pi@raspberrypi ~$ sudo rpi-update
  • 6. Chapter 6. 3 OpenCV 라즈베리파이에 설치하기 Step 5. 필요한 개발툴과 패키지를 설치 Step 6. 이미지 입출력(I/O) 패키지 설치, JPEG, PNG, TIFF를 읽고 처리할 수 있음 Step 7. 이미지를 스크린을 통해서 볼 수 있도록 GTK를 설치 (Graphical User Interface Tool Kit) Step 8. 비디오 입출력(I/O) 패키지 설치 Step 9. 선형대수를 위한 라이브러리 및 scs (splitting cone solver)를 위한 라이브러리 설치 pi@raspberrypi ~$ sudo apt-get install build-essential cmake pkg-config pi@raspberrypi ~$ sudo apt-get install libjpeg8-dev libtiff4-dev libjasper-dev libpng12-dev pi@raspberrypi ~$ sudo apt-get install libgtk2.0-dev pi@raspberrypi ~$ sudo apt-get install libavcodec-dev libavformat-dev libsws cale-dev libv4l-dev pi@raspberrypi ~$ sudo apt-get install libatlas-base-dev gfortran
  • 7. Chapter 6. 3 OpenCV 라즈베리파이에 설치하기 Step 10. pip 설치 (파이썬 관련 프로그램 설치시 많이 사용) Step 11. virtualenv virtualenvwrapper을 pip를 사용하여 설치 Step 12. profile에 다음의 라인을 추가 (profile은 etc라는 폴더에 있음) Step 13. 컴퓨터 비전 Virtual Environment를 설치 pi@raspberrypi ~$ wget https://bootstrap.pypa.io/get-pip.py pi@raspberrypi ~$ sudo python get-pip.py pi@raspberrypi ~$ sudo pip install virtualenv virtualenvwrapper export WORKON_HOME=$HOME/.virtualenvs source /usr/local/bin/virtualenvwrapper.sh pi@raspberrypi ~$ mkvirtualenv cv pi@raspberrypi ~$ export WORKON_HOME=$HOME/.virtualenvs pi@raspberrypi ~$ source /usr/local/bin/virtualenvwrapper.sh pi@raspberrypi ~$ source ~/.profile pi@raspberrypi ~$ sudo nano /etc/profile
  • 8. Chapter 6. 3 OpenCV 라즈베리파이에 설치하기 Step 14. 파이썬 2.7과 numpy 설치 Step 15. OpenCV 설치하고 압축풀기 Step 16. OpenCV 설치하기 (make 후 약 8시간 소요) (cv) pi@raspberrypi ~$ sudo apt-get install python2.7-dev (cv) pi@raspberrypi ~$ pip install numpy (cv) pi@raspberrypi ~$ wget -O opencv-2.4.10.zip http://sourceforge.net/proj ects/opencvlibrary/files/opencv-unix/2.4.10/opencv-2.4.10.zip/download (cv) pi@raspberrypi ~$ unzip opencv-2.4.10.zip (cv) pi@raspberrypi ~$ cd opencv-2.4.10 (cv) pi@raspberrypi ~$ mkdir build (cv) pi@raspberrypi ~$ cd build (cv) pi@raspberrypi ~$ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_I NSTALL_PREFIX=/usr/local -D BUILD_NEW_PYTHON_SUPPORT=ON -D INSTA LL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAM PLES=ON .. (cv) pi@raspberrypi ~$ make
  • 9. Chapter 6. 3 OpenCV 라즈베리파이에 설치하기 Step 17. 파이썬 2.7과 numpy 설치 Step 15. OpenCV 설치하고 압축풀기 Step 16. OpenCV 설치하기 (cv) pi@raspberrypi ~$ sudo make install (cv) pi@raspberrypi ~$ sudo ldconfig (cv) pi@raspberrypi ~$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ (cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv 2.so (cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv.py cv.p y (cv) pi@raspberrypi ~$ workon cv (cv) pi@raspberrypi ~$ python >>> import cv2 >>> cv2.__version__ '2.4.10‘
  • 10. Chapter 6. 4. 카메라 라이브러리 설치하기 Step 17. 파이썬 2.7과 numpy 설치 Step 15. OpenCV 설치하고 압축풀기 Step 16. OpenCV 설치하기 (cv) pi@raspberrypi ~$ sudo make install (cv) pi@raspberrypi ~$ sudo ldconfig (cv) pi@raspberrypi ~$ cd ~/.virtualenvs/cv/lib/python2.7/site-packages/ (cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv2.so cv 2.so (cv) pi@raspberrypi ~$ ln -s /usr/local/lib/python2.7/site-packages/cv.py cv.p y (cv) pi@raspberrypi ~$ workon cv (cv) pi@raspberrypi ~$ python >>> import cv2 >>> cv2.__version__ '2.4.10‘
  • 11. Chapter 6. 4 실습: 얼굴 인식 (Face detection)
  • 12. Chapter 6. 4 실습: 얼굴 인식 (Face detection) Viola/Jones Face Detector <관련논문> P. Viola and M. Jones. Rapid object detection using a boosted cascade of simple featur es. CVPR 2001. P. Viola and M. Jones. Robust real-time face detection. IJCV 57(2), 2004. Training Data • 5000 faces • All frontal, 24x24 pixels • Normalized, scaled, translated 핵심 테크닉 • Rectangle features (Haar feature) • Integral images for fast computation • Ada-Boosting for feature selection • Attentional cascade for fast rejection of negati ve windows 가장 널리 알려진 얼굴 인식 (Face detection) 알고리즘으로 Viola와 Jones에 의해서 고 안됨. • Rectangle feature 간단히 설명하면, F= (흰부분 픽셀) – (어두운부분 픽셀) 눈 부분은 어둡고 코와 입부분은 밝음 F 값이 큼 >> “얼굴로 인식”
  • 13. Chapter 6. 4 실습: 얼굴 인식 (Face detection) • Ada-Boosting for feature selection 간단히 설명하면, 보다 좋은 classifier를 찾기 위해 트레이닝하는 방법으로, 약한 classifier의 집합으 로 strong한 classifier를 구성한다는 것. Ada는 adaptive의 약자. • Integral images for fast computation 어느 영역의 면적을 구할 때, 단순히 더하기 빼기로 빨리 구할 수 있다는 컨셉. 즉, 점D의 값이 (1-2-D-5) 면적, B의 값이 (1-3-B-5)의 면적, A값이 (1-3-A-7)의 면적, 그리고 C의 값이 (1-2-C-7)의 면적이라고 할 때, 파란색 면적 (A-C-D-B) 은 각각의 적분 면적을 더하고 빼서 구할 수 있음: A의 값-B의 값-C의 값+D의 값 = 파란색 면적 • Attentional cascade for fast rejection of negative windows 1 2 3 4 5 6 7 8 Ada-boost classifier를 통해 얼굴이 아닌 것은 버려지고 얼굴인 것만 계속적으로 검출 Ada-boost Classifier1 Ada-boost Classifier2 Ada-boost Classifier3 True True True Face found Non-face Non-face Input image False False False Non-face
  • 14. Chapter 6. 4 실습: 얼굴 인식 (Face detection) import cv2.cv as cv cv.NamedWindow('a', 1) cap = cv.CaptureFromCAM(-1) cv.SetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_HEIGHT, 240) cv.SetCaptureProperty(cap, cv.CV_CAP_PROP_FRAME_WIDTH, 320) hc = cv.Load("haarcascade_frontalface_alt.xml") while True: frame = cv.QueryFrame(cap) face = cv.HaarDetectObjects(frame, hc, cv.CreateMemStorage(), 1.05,2, cv.CV_HAAR_DO_CANNY_PRUNING, (120,120)) for (x,y,w,h),n in face: cv.Rectangle(frame,(int(x),int(y)),(int(x)+w,int(y)+h),(255,0,255),8,0) cv.ShowImage('a', frame) c = cv.WaitKey(1) if c == 13: exit(0) Python 코드 using webcam
  • 15. Chapter 6. 5 실습: 달걀 인식 (egg detection) import time import serial import picamera import picamera.array import cv2 import cv2.cv as cv import numpy as np hsv_min = np.array([20, 130, 100]) hsv_max = np.array([40, 180, 120]) width = 320 height = 240 with picamera.PiCamera() as camera: with picamera.array.PiRGBArray(camera) as stream: camera.resolution = (width,height) camera.vflop = True while True: camera.capture(stream, format='bgr', use_video_port=True) edges = cv2.Canny(stream.array, 100,300) hsv = cv2.cvtColor(stream.array, cv2.COLOR_BGR2HSV) imgray = cv2.cvtColor(stream.array, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold(imgray, 127, 255, 0) contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE) contours = sorted(contours, key = cv2.contourArea, reverse = True)[:5] screenCnt = None Python 코드 using Pi-camera for h, cnt in enumerate(contours): peri = cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, 0.01*peri, True) screenCnt = approx M = cv2.moments(cnt) if M['m00']!=0: cx = int(M['m10']/M['m00']) cy = int(M['m01']/M['m00']) else: cx = width/2 cy = height/2 center = np.array([cx,cy]) R_arr = np.zeros((1000,5)) for idx, val in enumerate(cnt): R_arr[idx][h]= np.linalg.norm(val-center) R = R_arr[:,h] ratio = np.min(R[np.nonzero(R)])/max(R_arr[:,h]) cv2.circle(hsv, (cx, cy), 2, (255,0,0),2) if cx < width and cy < height and ratio > 0.6 and ratio < 0.75: cv2.putText(hsv, 'EGG', (cx,cy+10), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255,255,255), 1, 8) else: cv2.putText(hsv, str(ratio), (cx,cy), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255,255,255), 1, 8) cv2.putText(hsv, str(hsv[cy-10,cx-10]), (cx,cy-15), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (255,255,255), 1, 8) if ratio > 0.6 and ratio < 0.75: cv2.drawContours(hsv, [screenCnt], -1, (0,255,0),1) #[screenCnt was contours] mask = cv2.inRange(hsv, hsv_min, hsv_max) cv2.imshow('color-based', hsv) if cv2.waitKey(1) & 0xFF == ord('q'): break stream.seek(0) stream.truncate() cv2.destroyAllWindows()