Hgnaseel
중학생도 이해할 수 있는 RANSAC 알고리즘 원리
·
Programing General/알고리즘
이 글은 RANSAC에 대해 아무것도 알지 못해도, 중학교 이상의 수학적 지식만 가지고 있다면 충분히 이해할 수 있도록 포스팅할 예정이다. 실제로 RANSAC은 매우 중요한 알고리즘이지만 실상 들여다보면 매우 간단한 구조이므로, 만약 이해하지 못한다면 그것은 독자의 문제가 아니라 쉬운 알고리즘을 쉽게 설명하지 못한 필자의 문제다. RANSAC은 RANdom SAmple consensus의 약자로, 데이터셋에서 노이즈를 제거하고 모델을 예측하는 알고리즘이다. 매우 많은 분야에서 활용되며 특히 컴퓨터 비전 분야에서 광범위하게 사용된다. RANSAC은 특정 임계값 이상의 데이터를 완전히 무시해버리는 특성이 있어 outlier에 강건한 알고리즘인데, 아래 그림을 보면 노이즈가 매우 크지만, 노이즈를 반영하지 않..
[C++] template class 템플릿 클래스 파일 분할
·
Programing General/C \ C++
템플릿 클래스의 파일 분할은 일반적인 클래스의 파일 분할과는 방법이 다르다. 우선 직접적인 구현 이전에 왜 템플릿 클래스는 일반적인 클래스처럼 파일을 헤더파일과 소스파일(cpp)로 분할할 수 없는지 알아보자. 왜 오류가 나는가? 템플릿 클래스를 헤더파일에서 선언하고, cpp파일에서 구현한다면 다음과 같은 링크 오류를 만나게 된다. 일반 함수와는 다르게 템플릿은 컴파일 시점에 인스턴스가 생성되어야 한다. 왜냐하면 일반 함수는 컴파일 시점에 정의를 볼 수 없어도, 함수가 호출 되면 어떤 함수가 호출되었는지 링킹 과정에서 파악할 수 있다. 하지만 템플릿은 호출 될 때마다 그 정의를 확인해야 정확한 코드를 작성할 수 있다. 즉, 사용되는 개별 번역단위(translation unit)마다 그 정의를 포함시켜줘야 ..
[UML] 유스케이스 다이어그램 (Usecase Diagram) 기초 및 그리는 방법
·
Programing General/UML Diagram
Usecase Diagram 시스템에서 제공해야 하는 기능이나 서비스를 명세한 다이어그램이다. 사용자와 시스템 사이의 상호작용에 집중하는 것이 특징이다. 외부에서 본 시스템의 기능을 표현하기 때문에, 실제 내부의 비즈니스 로직이 아닌, 사용자가 수행하는 기능을 파악하고 싶을 때 작성한다. Usecase Diagram을 그리는 시기 유스케이스 다이어그램은 각종 액터가 프로그램의 기능과 상호작용을 하는 것을 표현하는 것이 메인 컨텐츠이기 때문에 요구사항을 추출하는 분야에 특화되어있다. 그러므로 보통 프로젝트를 시작하고, 제품의 요구사항 명세서를 작성하는 요구분석 단계에서 그려야 한다. 프로젝트의 개발 범위를 정하거나, 사용자의 요구사항을 정의하고, 이 프로그램에 수행해야 하는 기능의 명세를 알아야 할 때 그..
[Java] Runnable과 Thread의 차이 및 간단한 실행 예제
·
Programing General/Java
보통 자바에서 쓰레드를 구현할 때 두가지 방법을 사용한다. Thread, Runnable 두 방법이 있는데, Runnable은 이름에서 느껴지지만 클래스가 아닌 인터페이스다. 그래서 위 두 방법을 구체적으로 설명하자면 1. Thread 클래스를 상속받는다. 2. Runnable 인터페이스를 구현한다. 로 정리할 수 있다. 한 가지 목적에 두 가지 방법이 있다면 각각 설계 된 이유가 있을 것이다. 하지만 한국 웹을 아무리 뒤져봐도 두 방법의 사용법의 차이 및 상속&구현의 차이만 말할 뿐 왜 이 두 가지 방법이 존재하는지에 대한 설명은 없었다. 그래서 자바 api를 잠시 살펴봤다. 흥미로운 것을 발견했는데, Thread 클래스는 Object를 상속받으며 Runnable 인터페이스를 구현한다는 것이다. 그리고..
[Java] int와 Integer의 차이
·
Programing General/Java
int와 Integer은 쓰임새가 유사한 것 같으면서도 다르다. 정확하게 개념을 짚어놓지 않으면 코딩할 때 왜 이 메소드에서 매개변수를 틀렸다고 하는지, 어떻게 변환해서 사용하는게 옳바른지 등 헷갈리기 쉽기 때문에 간단하게 정리를 해보자. primitive data type vs class 가장 큰 차이이자 핵심이다. int는 자바의 원시 자료형이고, Integer는 자바의 클래스이다. 자바는 객체지향 언어이기 때문에, 상당수의 연산을 객체의 형태를 사용해서 수행한다. 하지만 객체의 연산은 오버헤드가 발생할 수 밖에 없기 때문에, 자주 사용되는 8개의 형태를 원시 자료형으로 남겨놔서 사용할 수 있게 해줬다. int, double, boolean 등등.. 그러니까 사용법이 달라진다... 예를 들어서 자바 ..
이진 탐색 트리( map, set )와 우선순위 큐 ( Heap )
·
Programing General/자료구조
이진 탐색 트리 이진 트리의 일종 자신보다 작은 값을 왼쪽 노드에 위치시키고, 자신보다 큰 값을 오른쪽 노드에 위치시킴 C++ 컨테이너인 map, set Java의 TreeSet, TreeMap은 이진 탐색 트리로 이루어져 있다. Map, Set 중복을 허용하지 않는 자료구조 대부분의 언어에서 Red-Black Tree를 사용함 (이진 탐색 트리의 한 종류) 특정한 기준에 의해서 정렬되어있음(JAVA의 경우 TreeMap, TreeSet만 정렬되어있고 HashMap, HashSet은 정렬 X) 자료구조 key value Map 중복될 수 없음 중복 가능 Set 중복될 수 없음 X(존재하지 않음) Heap 우선순위 큐를 위한 자료구조 heap은 우선순위 큐를 구현하기 위한 자료구조로서, 완전 이진트리 이다..