Sorting Algorithm Animations 이라는 사이트(영문)이다.

 

http://www.sorting-algorithms.com/

 

삽입정렬, 선택정렬, 버블정렬, 쉘정렬, 합병정렬, 힙정렬, 퀵 정렬 등을

 

랜덤아이템세트, 거의 정렬된 아이템세트, 거꾸로 정렬된 아이템세트 등에 대해

 

어떤 식으로 동작하며 얼마나 걸리는지 등을 애니메이션화 하여 볼 수 있도록 해 준다.

 

특정 알고리즘만을 선택해서 자세히 볼 수도 있으며 다른 알고리즘과 비교도 가능하다.

 

각 정렬 알고리즘 별 특징이나 의사코드, 장단점 등도 볼 수 있도록 되어 있다.

 

각 항목의 이미지를 클릭하거나 새로고침 아이콘을 클릭하면 애니메이션이 동작한다.

 

Posted by Kugi
,



핀홀(pinhole)이란 말 그대로 종이에 핀으로 뚫은 구멍 같은 매우 작은 구멍을 말한다.

 

핀홀을 통해서 들어오는 빛을 받아들여 촬영하는 카메라를 핀홀 카메라(pinhole camera)라고 한다.

 

흔히 '바늘구멍 사진기'라고도 한다.

 

핀홀 카메라 모델은 물체에 반사된 빛이 우리 눈의 수정체(또는 카메라의 렌즈)를 거쳐서

 

망막(또는 카메라의 센서)에 도달하는 구조를 관찰하는 데 유용하다.

 

 

단, 핀홀 카메라에서는 빛이 아주 작은 구멍을 거쳐서 들어오기 때문에 빛을 모으기에는 부적합하다.

 

따라서 일반적인 카메라는 핀홀이 아닌 렌즈를 이용한다. 그러나 렌즈를 사용하게 되면

 

카메라의 구조가 복잡해지며 렌즈 자체의 왜곡으로 인하여 영상이 손상될 수 있다.

 

 

핀홀 카메라의 원리는 다음과 같다.

 

3차원인 실제 세계에서 빛이 물체의 어느 한 점에서 반사되면, 다양한 각도의 광선 중에서

 

핀홀을 향하는 광선만이 핀홀 평면에 가로막히지 않고 나아가게 된다.

 

결과적으로 이 광선은 영상 평면(image plane) 또는 투영 평면(projective plane)이라고 불리는 곳에

 

맺히게 된다. 이 상(image)의 크기는 핀홀 카메라의 초점 거리(focal length)에 의해 결정된다.

 

이상적인 핀홀 카메라일 경우, 초점 거리는 핀홀 구멍에서부터 영상 평면까지의 거리이다.

 

 

 

 

위의 그림에서 A와 a는 각각 실제 물체의 크기와 영상 내의 물체 크기를 나타낸다.

 

그림에서 꼭지점을 맞대고 있는 두 삼각형을 잘 살펴보면 다음과 같은 관계를 찾을 수 있다.

 

 

 

이를 이용하여 영상에서의 물체의 크기는 다음과 같이 구해진다.

 

 

 

핀홀 카메라 모델을 다음 그림처럼 약간 변형하면 수식을 조금 더 간단히 할 수 있다.

 

우리가 일반적으로 사용하는 렌즈카메라에서도 위 그림처럼 영상 평면(센서)이 투영중심 앞에 위치한다.

 

 

3차원 공간상의 한 점 Q=(A,Y,Z)에서 출발한 빛은 투영 중심을 향해 직진하여 영상 평면과 만난다.

 

이 점을 q=(a,y,f)로 표현한다.영상 평면이 핀홀 앞으로 이동하면서 수식에서 음수 부호가 사라졌다.

 

 

 

위 그림을 보면 광축과 영상 평면이 만나는 주점(principle point)이 항상 카메라의 영상 센서의 중심에

 

위치하게 될 것이라고 생각할 수 있지만, 실제적으로 광축이 센서 중심을 지나도록 하기는 매우 어렵다.

 

따라서 투영 평면에서 좌표 중심의 이동 변위를 표현하기 위해 새로운 매개변수(parameter)인 c를 사용해야 한다.

 

새로운 매개변수를 추가하여 나타낸 영상 평면에 맺히는 점의 좌표를 다음과 같이 표현할 수 있다.

 

 

 

  a : 영상에 맺히는 상의 길이(가로축)

  A : 물체의 실제 길이(가로축)

  y : 영상에 맺히는 상의 길이(세로축)

  Y : 물체의 실제 길이(세로축)

  f : 핀홀 카메라의 초점 거리

  F : 카메라와 물체 사이의 거리

  c : 투영 평면에서 좌표 중심의 이동 변위를 표현하기 위한 보조 변수

 

 

여기서 두 개의 초점 거리(f)를 사용한 이유는 대다수의 영상 센서의 개별 픽셀들이

 

정사각형이 아닌 직사각형의 형태이기 때문이다.

 

 

초점 거리 f는 렌즈의 실제 초점 거리와 영상 센서의 개별 요소 크기 s를 곱한 값이다.

 

여기서 s의 단위는(픽셀)/(거리단위[각주:1])이고,

 

실제(물리적) 초점 거리 F가 거리단위를 사용하기 때문에 f는 픽셀 단위를 갖게 된다.

 

이 때 s와 F는 카메라 내부 보정 과정에서 직접적으로 구해지지 않는다.

 

 

 

 


참고 문헌


LEARNING OPEN CV 제대로 배우기

저자
개리 로스트 브라드스키, 에이드리안 캘러 지음
출판사
한빛미디어 | 2009-09-28 출간
카테고리
컴퓨터/IT
책소개
OPENCV 제대로 배워라!개리 로스트 브라드스키, 에이드리안 ...
가격비교

 

 


  1. 밀리미터(mm) 등의 일반적인 거리 단위로써 미터(meter), 미크론(micron) 등의 단위로 바꾸어도 상관 없다. [본문으로]

'Development > Image Processing' 카테고리의 다른 글

Visual Studio에 OpenCV 개발환경 구축하기  (0) 2014.10.05
적분 영상 (integral image)  (13) 2012.09.16
Posted by Kugi
,



컴퓨터 상에서 적분을 수행하기 위한 방법 중 가장 기초적이라고 할 수 있는 사다리꼴 공식이다.

 

이름에서 유추할 수 있듯이, 적분의 근사치를 구하기 위해서 함수를 사다리꼴들로 나누어 값을 얻어낸다.

 

그렇다면, 왜 하필 사다리꼴일까?

 

그 이유는 다음 그림에서처럼 구간 [a, b]에서 어떤 함수 f(x)는 적분이 간단한 일차함수인 g(x)로 근사화할 수 있기 때문이다.

 

g(x)의 적분 영역은 옆으로 누워있는 사다리꼴 모양이 된다.

 

 

 

잘 보면 사다리꼴의 넓이가 실제 적분 영역의 넓이를 다 채우지 못하거나, 조금 넘어버리는 것을 알 수 있는데 이러한 영역이 근사치의 오차가 된다.

 

 

 

 

사다리꼴들의 폭이 작아질수록 최종적인 근사치의 정확도가 향상된다는는 것을 직관적으로 알 수 있을 것이다.

 

[사다리꼴의 넓이] = (윗변+아랫변) × 높이 ÷ 2 이므로

 

사다리꼴들의 높이(x축 간격)를 일정하게 했을 경우, 최종적인 식은 다음과 같이 정리된다. (위키피디아 발췌)

 

 

 

 

사다리꼴 공식은 심프슨(Simpson) 공식이나 가우스 구적법 등에 비하면 정확도가 조금 떨어질 수 있다.

 

사다리꼴 공식의 좀 더 자세한 설명에 대해서는 위키피디아백과([사다리꼴 공식(KR)], [Trapezoidal rule(EN)], [台形公式(JP)]) 등을 참고하고,

 

이하는 이것을 C언어로 구현한 예시(example)이다.

 

 

Posted by Kugi
,



SharedPreferences에 값이 제대로 들어가는 지 테스트했었는데

 

테스트 할 당시에는 제대로 값이 남아있는 듯 보였으나 나중에 스마트폰을 재부팅한 뒤 다시보니

 

아무런 데이터도 저장되어있지 않은 것을 발견하였다.

 

확인해본 결과 환경설정->어플리케이션 메뉴에서 어플을 찾아 강제종료버튼(작업관리자에 표시되지 않더라도 활성화되어있다)을 누르고 나면

 

다시 실행했을 때 SharedPreferences 값이 하나도 남아있지 않음을 알 수 있었다.

 

메모리 혹은 임시파일 형태로 저장되는 것이라고 추측된다.

 

해결 방법은 다음과 같다.

 

 

SharedPreferences의 Editor를 사용하기 전에 Editor 객체의 clear() 메소드를 호출했더니 문제가 해결되었다.

 

SharedPreferences.Editor ePref = pref.edit();
ePref.clear();
ePref.putStringSet(XXX , XXX);
ePref.apply();

 

 

Editor에 값을 갱신한 후 commit() 또는 apply()를 빠뜨리면 아예 저장이 되지 않으므로 주의하자.

 

또한 clear()를 호출한 후에는 SharedPreferences 값이 지워지므로 보존해야 할 데이터는 따로 마련한 변수 등에 저장해두어야 한다.

Posted by Kugi
,



안드로이드의 SharedPreferences.Editor에는

비슷한 역할을 하는 apply()와 commit() 두 개의 메소드가 존재한다.

 

이 둘의 차이점을 알아보자.

 

(*아래 내용은 http://developer.android.com/reference/android/content/SharedPreferences.Editor.html 의 영어 원문 일부를 번역한 것이다.)

 

 

public abstract boolean commt()

 

해당 Editor에서 변경한 preferences 값을 이 Editor의 SharedPreferences 객체에 전달한다.

 

두 개의 Editor가 동시에 preferences를 수정 중이라면 마지막에 호출된 commit()가 적용된다.

 

만약 반환값을 필요로 하지 않는다면 apply()를 써도 좋다.

 

반환값: 변경한 값이 성공적으로 저장장치에 반영되면 true를 반환한다.

 

 

public abstract void apply()

 

해당 Editor에서 변경한 preferences 값을 이 Editor의 SharedPreferences 객체에 전달한다.

 

자동적으로, 원래 SharedPreferences 안의 내용이 무엇이었든간에 요청받은 값으로 내용을 대체한다.

 

두 개의 Editor가 동시에 preferences를 수정 중이라면 마지막에 호출된 apply()가 적용된다.

 

저장공간에 지속적인 동기를 유지하며 preferences를 작성하는 commit()과는 달리,

 

apply()는 메모리 내의 SharedPreferences를 즉시 변경하지만 디스크로의 반영은 비동기적으로 시작되며

 

작업 실패에 대한 어떠한 알림도 받을 수 없다.

 

SharedPreferences는 프로세스 내에서 싱글톤 방식의 인스턴스이기 때문에

 

만약 반환 값을 필요로 하지 않는다면 commit() 대신에 apply()를 쓰는 것이 안전하다.

 

apply()의 경우 안드로이드 컴포넌트의 라이프사이클 및 디스크 쓰기의 상호작용을 신경 쓸 필요가 없다.

 

구조적으로 apply()를 한 후에 이루어지는 in-flight 디스크의 쓰기는 상태(state) 전환이 이루어지기 전에 완료되도록 되어있다.

Posted by Kugi
,