라벨이 study인 게시물 표시

카메라 인터페이스 MIPI CSI에 관하여

이미지
카메라와 호스트 프로세서사이의 인터페이스로 CSI가 있다.  CSI (Camera Serial Interface)는 MIPI(Mobile Industry Process Interface, https://www.mipi.org/ ) alliance에 규정되어 있다. CSI는 CSI-1, CSI-2, CSI-3가 있다.  CSI-1 CSI-1은 카메라와 호스트 프로세서 간의 인터페이스를 정의하는 MIPI의 오리지널 표준이고, 이는 CSI-2와 CSI-3로 발전되고 있다.  이미지 센서의 컨트롤은 CCI (Camera Control Interface) I2C, I3C릍 사용한다. 컨트롤 명령어 세트 CCS(Camera Command Set) V1.0은 2017년 11월에 출시되었으며, CSI-2를 사용하여 이미지 세트를 제어하기 위한 표준 기능 세트를 정의한다.  CSI에서 지원되는 이미지 포맷은 RGB, RAW, YUV, JPEG가 있으며, Payload/Header보호를 위한 CRC/ECC를 지원한다.  CSI-2 CSI-2는 모바일 및 기타 시장에서 가장 널리 사용되는 카메라 인터페이스라고 한다. CSI-2는 아래와 같은 계층 구조를 가진다.   물리 계층으로 MIPI C-PHY/D-PHY를 지원하고 CSI-2 프로토콜은 전송계층과 응용 계층을 포함하고 있다.  CSI-2는 v1.0이 2005년, v2.0은 2017년 4월, v3.0은 2019년 9월에 출시되었다. V2.0은 RAW-16 및 RAW-20을 지원하고, 가상채널은 4에서 32로 늘어났다. 또한 LRTE(Latency Reduction and Transport), DPCM(Differential Pulse-Code Modulation) 압축 및 스크램블을 통해 사용 전력을 줄였다. LRTE는 시스템 비...

간단한 이미지 센서 (ccd/cmos) 원리 이해

이미지
 디지털 카메라, 휴대전화 카메라 등에 사용되는 이미지 센서는 물체를 통과하거나 반사되는 빛을 포착하여 전기신호로 변환형 이미지를 만드는 센서이다.  전자 이미지 센서에는 CCD(the charge-coupled device)와 CMOS(Complementary metal-oxide-semiconductor) 타입이 있다. 이 두 타입의 센서는 모두 MOS(metal-oxide-semiconductor) 기술을 기반으로 하고 있다.   CMOS 센서는 CCD에 비해 전력소모가 적어 배터리 구동 장치에 많이 사용되며, CCD센서는 하이엔드의 방송 품질의 비디오 카메라에 사용하고 있다고 한다.  이미지 센서의 각 픽셀에는 포토센서가 있으며 이 포토센서에서 빛을 전하로 변경한다.   CCD 센서는 이 전하를 한 라인 한 라인 모아 증폭시킨 후 전압으로 변경하고, CMOS 센서는 각 픽셀에서 바로 전압으로 변환한다. 전압의 크기는 빛의 강도가 된다.  CMOS 타입 CCD 타입 <이미지 출처:  https://www.tedpella.com/cameras_html/ccd_cmos.htm >  이미지 센서는 다양한 색상의 이미지 표현해 낸다. 이미지 센서의 색상 분리 메커니즘은 bayer-filter 센서 , foveon X3 센서 , 3CCD 센서 등이 있다.  이중 가장 저렴하고, 일반적인 방법인 bayer-filter 센서의 색상 분리 방식은 아래 그림과 같다. 색상 필터 레이어를 통과한 빛은 각 필터의 색에 해당하는 빛으로 분리되고 각 픽셀에서 색상 값을 감지하는 방식이다.

IoT Protocol CoAP 메시지 요청/응답 모델 내용 정리

이미지
 본 포스트에서는 CoAP(Constrained Application Protocol, RFC 2752)의 메시지 모델에서 지원하는 Request의 메소드와 Response의 코드 및 옵션에 대해 알아보았다. CoAP의 메시지 형식에 대한 내용은 아래 포스트에서 다룬 적이 있다. IoT protocol CoAP 메시지 구조(Message Format) 요약 정리 ∘ CoAP의 Request/Response 모델 CoAP는 HTTP의 Request/Response 모델과 유사하게 운영된다. 클라이언트는 서버로 CoAP Request를 보내고, 서버는 요청에 해당하는 응답을 클라이언트로 보내게 된다. 다만, CoAP는 HTTP와 달리 endpoint간에 TCP 연결을 필요로 하지 않는다. CoAP는 HTTP와 유사한 GET, PUT, POST, DELETE 메소드를 제공한다.  Request는 CoAP 헤더의 Code필드를 메소드 코드로 설정하고 Request 정보를 포함한다. Response는 헤더의 Code필드를 응답 코드로 하여 Response를 식별하도록 되어있다. 이는 HTTP에서 상태코드를 사용하는 것과 유사하다. Code 필드는 아래와 같이 Class와 Detail로 나눠진다. Class는 다음과 같은 카테고리로 구분된다.  0 Request 2 Response Success 3 Response Client Error, The Request contains bad syntax or cannot be fulfilled 4 Response Server Error The server failed to fulfill an apparently valid request ∘  Request/Response 전송 모델 CoAP에서 Request/Response 송수...

IoT protocol CoAP 메시지 구조(Message Format) 요약 정리

이미지
 CoAP(Constrained Application Protocol)는 제한된 환경에서 M2M(Machine To Machine) 요구사항을 충족하는 웹 프로토콜이며, 이런 특성으로 인해 IoT를 위한 프로토콜로 각광받고 있다고 한다. 본 포스트에서는 이러한 CoAP의 메시지 구조에 대해 알아봤으며, 앞으로 CoAP에 관한 더 많은 포스트를 게재할 예정이다. CoAP는 RFC 7252에 정의 되어있다. CoAP (Constrained Application Protocol) CoAP의 상호 작용 모델은 HTTP의 클라이언트/서버 모델과 유사하다.  그림 1. CoAP의 메시지는 각 EndPoint간 UDP를 통해 전송된다. 그림 2. CoAP Message Format 그림 3. CoAP Message Format CoAP의 메시지 형식은 위 그림과 같다.  - Var CoAP 버전을 의미한다. 값은 0b01이다. - T (Type) 메시지의 형식을 나타낸다. Confirmable(CON): 0 , ack를 요구하는 메시지 Non-confirmable(NON): 1 , ack를 요구하지 않는 메시지 Acknowledgement(ACK): 2 , CON 메시지에 대한 응답 메시지 Rest(RST): 3 , 메시지가 수신되었으나 올바르게 처리하기 위한 내용이 누락되었음을 나타내는 메시지 메시지의 타입은 아래와 같은 형태의 메시지에 사용된다. Empty 메시지는 일반적인 경우 CON형식은 사용되지 않으나...

numpy.einsum을 이용한 빠른 2d convolution 연산 (conv2d)예제 코드

이미지
 본 포스트는 numpy.einsum을 사용하여 2차원 합성곱 연산을 수행하는 예제 코드를 싣고 있다. 단순 연산을 사용한 2차원 합성곱 단순히 for loop를 사용하여 아래처럼 2차원 합성곱 연산을 수행할 수 있다. import numpy as np def conv2d(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel     output = np.zeros(np.subtract(image.shape, kernel.shape))          for y in range(output.shape[1]):         for x in range(output.shape[0]):             output[x, y] = (kernel * image[x: x + kernel.shape[0], y: y + kernel.shape[1]]).sum()     return output 하지만, 위 경우 image의 크기가 커지면 연산양이 많아져 수행 속도가 느려지게 된다.  numpy.einsum을 사용한 2차원 합성곱  빠른 속도의 합성곱 연산을 원한다면, numpy.lib.stride_tricks.as_strided와 numpy.einsum을 사용하면 빠른 속도로 2차원 함성곱 연산을 수행할 수 있다. import numpy as np def conv2d_np(image, kernel):     kernel = np.flipud(np.fliplr(kernel)) #XCorrel        ...

OpenCV를 사용한 간단한 차선 인식 예제

이미지
본 포스트에는 OpenCV에서 제공하는 이미지 프로세싱 API들을 사용한 차선 인식하는 Python 예제 코드를 싣고 있다.  차선인식은 허프 변환(Hough Transform) 을 사용하여 도로의 차선을 구분하도록 하였다. 차선 인식을 위해 다음과 같은 이미지 처리과정이 필요하다.  - 이미지 컬러를 흑백으로 변환 - 노이즈를 제거하기 위한 blurring - 이미지에서 경계면 검출 - 허프 변환을 통해 이미지에서 선 위치 검출 - 검출된 선 위치데이터를 사용해 차선 필터링 차선 필터링은 간단하게 검출된 선의 각도만을 계산하여 필터링 하였다. 예제 코드는 다음과 같다. import math import cv2 as cv def LaneFiltering(lines):          if lines is None:         return None          Lanes = []          for i in range(0,len(lines)):         l = lines[i][0]         x1,y1,x2,y2 = l[0],l[1],l[2],l[3]         if x1 == x2:             Lanes.append([x1,y1,x2,y2])             continue         angle = math.atan((y2-y1)/(x2-x1))*180/mat...

이미지의 가장자리 경계면 검출 (edge detection) 원리와 예제

이미지
 2차원 이미지의 경계면을 찾는 원리는 다음과 같다.    이미지의 경계면은 보통 위 그림의 a와 같이 색의 차이가 있는 것을 볼 수 있으며, 1차원으로 보면 그림의 b처럼 나타낼 수 있다. 이 색의 차이가 많아지는 부분은 미분을 통해(그림의 c) 찾을 수 있다. 미분연산은 합성곱(convolution) 연산을 사용하여 근사치를 계산할 수 있다. 예를 들어 아래와 같이 2개의 gx, gy matrix를 사용해 2d 이미지에서 미분 값이 큰 위치를 찾을 수 있다. 즉 이미지의 경계면을 찾을 수 있다.  def main():     gx = np.array([(-1,0,1),                    (-2,0,2),                    (-1,0,1)])     gy = np.array([(-1,-2,1),                    (0,0,0),                    (1,2,1)])     src = np.array([(125,255,255,255,255,255),                     (000,125,255,255,255,255),                     ...

이미지 blur와 양방향 필터링(Bilateral Filtering)

이미지
노이즈를 줄이거나 이미지를 부드럽게 보이기 위해 blurring을 사용한다.  일반적으로 커널 윈도우를 이미지 전체에서 슬라이딩하여 필터링하며 blurring한다.    많이 사용되는 필터(커널)의 형태는 다음과 같다. 1. 커널 영역 픽셀의 평균값을 사용 2. 커널 영역 픽셀의 가우스 분포 가중 평균을 사용 3. 커널 영역 픽셀의 중앙값을 사용 import cv2 as cv # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga8c45db9afe636703801b0b2e440fce37 def Blur(img, ksize=(1,1), title='Blur'):     if img is None:         return     dst = cv.blur(img,ksize)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#gaabe8c836e97159a9193fb0b11ac52cf1 def GaussianBlur(img, ksize=(1,1), title='GaussianBlur'):     if img is None:         return     dst = cv.GaussianBlur(img,ksize,0)     cv.imshow(title,dst) # https://docs.opencv.org/master/d4/d86/group__imgproc__filter.html#ga564869aa33e58769b4469101aac458f...

CA-CFAR 예제 코드

이미지
 이전 포스트에서 CFAR의 원리 에 대해 알아본 적이 있다. 본 포스트에서는 Python으로 CA-CFAR에 대해 간단하게 구현한 예제를 수록하고 있다. 구현된 CA-CFAR은 아래 그림과 같이 구현되었다.   ca-cfar 코드 import numpy as np class cacfar(object):     def __init__(self, window_size, guard_size,pfa = 0.01, scale=1.0):         self.pfa = pfa         self.scale = scale         self.window_size = window_size         self.guard_size = guard_size              def cal_threshold(self, left, right):                n = len(left)+len(right)         s = np.sum(np.square(left))+np.sum(np.square(right))                  if n > 0:             T= np.power(self.pfa,(-1.0 /n)) - 1             average = s/n ...

Python OpenCV를 사용한 간단한 얼굴 위치 인식 예제 코드

이미지
 Face ID와 같은 보안이나, SNOW 같은 카메라 app에서 얼굴을 변형하거나 이미지를 보정하는 분야까지 얼굴 인식은 현재 많은 분야에 사용되고 있다. 본 포스트는 Python에서 OpenCV를 사용하여 얼굴의 위치를 감지하고, 그 위에 다른 이미지를 그리는 예제를 담고 있다.  OpenCV 튜토리얼 중 카메라 haar cascade classifier를 사용해 영상에서 사람의 얼굴 위치를 감지하는 예제가 있다.  https://docs.opencv.org/master/db/d28/tutorial_cascade_classifier.html  Haar feature-based cascade classifier를 사용한 객체 감지는 Paul Viola와 Michael Jones의 논문 “Rapid Object Detection using a Boosted Cascade of Simple Features”에서 제안한 객체 감지 방법이라고 한다. 이는 검출하고자 하는 객체 이미지와 그 객체가 없는 이미지를 훈련시킨 후 다른 이미지에서 원하는 객체를 감지하는 일종의 머신 러닝의 방식이라고 한다. OpenCV를 사용하여 얼굴 위치를 인식하는 순서는 다음과 같다.  1. cv.CascadeClassifier를 사용하여 cascade classifier를 생성한다. 2. cv.CascadeClassifier.load를 사용하여 훈련된 모델의 xml파일을 로드 한다. 3. Cv.CascadeClassifier.detectMultiScale을 사용하여 이미지에서 얼굴의 위치를 감지한다. 객체 검출 모델은 훈련을 통해 만들 수 있다. ( https://docs.opencv.org/master/dc/d88/tutorial_traincascade.html ) OpencCV에서는 이미 학습된 얼굴 감지 모델을 제공하고 있고,...

Python OpenCV를 사용하여 동영상에서 움직이는 물체 검출 예제

이미지
 본 포스트에서는 background subtraction을 사용하여 동영상에서 움직이는 물체를 검출하는 예제를 싣고 있다. 배경 제거 (background subtraction)의 원리는 아래 포스트를 참조하자. 신호에서 배경 제거(background subtraction)를 통한 움직이는 물체의 위치 검출 OpenCV에는 Background Subtractor가 구현되어 있으므로 이를 사용하였다. https://docs.opencv.org/3.4/de/de1/group__video__motion.html 코드는 아래와 같다. import cv2 as cv import numpy as np def main():          cap = cv.VideoCapture('20201110_113359.mp4')          bgs = cv.createBackgroundSubtractorKNN(dist2Threshold =500,detectShadows=False)          while cap.isOpened():         ret, frame = cap.read()                  if not ret:             break                  frame = cv.resize(frame,None,fx=0.2,fy=0.2,interpolation = cv.INTER_CUBIC) ...

Python opencv 설치와 이미지 출력 및 카메라 영상 캡쳐 예제 코드

이미지
◼ python환경 opencv 설치 anaconda conda install -c conda-forge opencv https://anaconda.org/conda-forge/opencv pip pip install opencv-python 설치 버전 확인 import cv2 as cv print(cv.__version__) 4.1.0 ◼ opencv 동작 예제 코드 OpenCV-Python Tutorials 페이지에 python에서 opencv를 사용하는 예제 코드들이 수록되어 있다. 위 예제 중 간단한 몇 가지를 실행해 봤다. 이미지 디스플레이 예제 참조 :  https://docs.opencv.org/master/db/deb/tutorial_display_image.html import cv2 as cv img = cv.imread('14793554227.jpg') if img is not None:     cv.imshow('display', img) cv.waitKey(0) cv.destroyAllWindows() 카메라 영상 캡쳐 예제 참조 :  https://docs.opencv.org/master/dd/d43/tutorial_py_video_display.html import cv2 as cv cap = cv.VideoCapture(0) while cap.isOpened():     # Capture frame-by-frame     ret, frame = cap.read()     # if frame is read correctly ret is True     if not ret:         print("Can't ...

소음 측정 원리 개요

이미지
 소음은 사전적의미로 ‘불규칙하게 뒤섞여 불쾌하고 시끄러운 소리’를 의미한다.   현대 도시 사회에서는 이런 소음을 벗어나기 힘들고, 소음으로 인해 스트레스와 난청 등의 건강상 문제를 겪기도 한다. 극단적으로 과도한 소음은 청력 손실, 이명, 수면 장애, 혈압 상승, 스트레스 및 혈관 수측 증가와 같은 장기적으로 건강에 부정적인 영향을 미칠 수 있다고 한다.    <출처:  https://terms.naver.com/entry.nhn?docId=5550500&cid=51004&categoryId=5100 4> 본 포스트에서는 이런 소음의 측정하는 원리에 대해 알아보았다. ◼ 소리  소리는 물체의 진동으로 인해 일어나는 공기, 물 등 매질의 압력변화로 발생한다. 이 파동이 공기중으로 전달되어 우리는 소리를 듣게 된다. 이런 소리를 특징 짖는 요소들이 있다. 소리의 주파수(Frequency)  음파의 초당 변동수로 주파수가 높은 음은 고음, 주파수가 낮은 음은 저음이라고 한다. 사람의 가청 주파수는 20~2000Hz이고, 이보다 낮은 20Hz 이하는 초저주파(infrasonic, 진동/압력으로 느낌)이라고 하고, 가청 주파수보다 높은 2000hz 이상은 초음파(ultrasonic, 귀가 울리는 것처럼 느낌)이라고 한다.  음압(Sound Pressure)  매질 압력 변화의 크기, 음압이 크면 큰소리로 들리고, 음압이 작으면 작은 소리로 들린다. 예를 들어 동일한 피아노 건반을 작은 힘으로 두드릴 때와 큰 힘으로 두드릴 때의 차이. 음색  파형의 시간적 변화에 따른 차이를 나타내며, 악기들의 소리가 다르게 들리는 차이를 예로 들 수 있다. ◼ 소음 측정 고려사항  소음은 난청의 원인이 되는 큰소리와 긁히...

HTTP 프로토콜 구조 개요와 예제

이미지
HTTP는 HyperText Transfer Protocol의 약자이다. HTTP는 아마도 인터넷에서 가장 많이 사용되는 프로토콜일 것이다. HTTP 관련 표준은 다음과 같다. RFC 1945 "Hypertext Transfer Protocol HTTP/1.0", 1996 RFC 2616 "Hypertext Transfer Protocol HTTP/1.1", 1999 HTTP는 OSI 7 layer 에서 가장 상위 단의 application layer에 속한다. HTTP는 TCP/IP 연결 위에 올라가 있으며, HTTPS의 경우에는 SSL 위에 올라가 있다.  ================ HTTP     |      HTTPS ================                     SSL               =========           TCP  ================            IP ================ ◾ Protocol overview   HTTP는 위 그림과 같이 HTTP 클라이언트에서 HTTP 서버로 요청을 보내고, 요청을 받은 서버는 클라이언트에게 상황에 맞는 응답을 보내는 형태로 이루어져 있다. 예를 들어 웹 브라우저에서 서버로 웹 페이지를 요청할 때 아래와 같은 요청 메시지를 서버에 보내고, GET / HTTP/1.1 Host: ryanclaire.blogspot.com Connection: keep-alive DNT: ...