jepilyu의 등록된 링크

 jepilyu로 등록된 티스토리 포스트 수는 68건입니다.

[OpenCV] 어파인 변환(Affine Transformation) [내부링크]

어파인 변환의 개념 어파인 변환(affine transformation)이란 영상의 평행 이동, 확대 및 축소, 회전 등의 조합으로 만들 수 있는 기하학적 변환을 나타낸다. 영상을 확대 또는 축소하는 크기 변환과 임의의 각도만큼 회전하는 작업은 다양한 컴퓨터 비전 시스템에서 전처리 과정으로 널리 사용된다. 어파인 변환은 영상을 평행 시키거나 회전, 크기 변환 등을 통해 만들 수 있는 변환을 통칭한다. 영상을 한쪽 방향으로 밀어서 만든 것 같은 전단 변환도 어파인 변환에 포함된다. 영상에 어파인 변환을 적용할 경우 직선은 그대로 직선으로 나타나고, 직선 간의 길이 비율과 평행 관계가 그대로 유지된다. 직사각형 형태의 영상은 어파인 변환에 의해 평행사변형에 해당하는 모습으로 변경된다. 영상의 기하학적..

[OpenCV] 잡음 제거 필터링 [내부링크]

영상 처리 관점에서 잡음(noise)란 원본 신호에 추가된 원치 않은 신호를 뜻한다. 영상에서 잡음은 주로 영상을 획득하는 과정에서 발생하며, 디지털 카메라에서 사진을 촬영하는 경우 광학적 신호를 전기적 신호로 변환하는 센서에서 주로 잡음이 추가된다. 카메라에서 획득되는 영산신호는 보통 위와 같은 식으로 표현한다. f(x, y) : 실제로 카메라에서 획득되는 영상 신호 s(x, y) : 디지털 카메라에서 카메라 렌즈가 바라보는 원본 신호 n(x, y) : 영상에 추가되는 잡음 잡음이 생성되는 방식을 잡음 모델(noise model) 이라고 하며, 다양한 잡음 모델 중 가장 대표적인 잡음 모델은 가우시안 잡음 모델이다. 가우시안 잡음 모델은 보통 평균이 0인 가우시안 분포를 따르는 잡음을 의미한..

[OpenCV] 샤프닝(Sharpening) [내부링크]

샤프닝(sharpening)이란 샤프닝이란 블러링과 반대되는 개념으로, 초점이 잘 맞은 사진처럼 사물의 윤곽이 뚜렷하고 선명한 느낌이 나도록 영상을 변경하는 필터링 기법이다. 이미 촬영된 사진을 초점이 잘 맞은 사진처럼 보이게끔 변경하려면 영상 에지 근방에서 픽셀 값의 명암비가 커지도록 해야한다. 샤프닝을 구현하기 위해서는 블러링된 영상을 사용해야 한다. 부드러워진 영상을 날카로운 영상으로 생성하는 것인데, 여기서 블러링이 적용된 영상을 날카롭지 않아 언샤프(unsharp)라고 하며, 언샤프한 영상을 이용하여 역으로 날카로운 영상을 생성하는 필터를 언샤프 마스크 필터라고 한다. 언샤프 마스크의 과정으로, x축은 픽셀 좌표의 이동, y축은 픽셀 값을 나타낸다. 영상의 에지 부근에서 픽셀 값이 증..

[Algorithm] C++ - 소수 구하기 (제곱근, 에라토스테네스의 체) [내부링크]

소수(Prime Number)란 소수란 1보다 큰 자연수 중 1과 자기 자신만을 약수로 가지는 수를 말한다. 아래 표는 100 이하의 소수를 나타내는 표로, 1과 자기 자신 말고 약수가 존재하지 않는다. 총 3가지의 방법으로, 일반 반복문, 제곱근, 에라토스테네스의 체를 이용한 방법을 설명한다. 1. 모든 경우의 수를 전부 나누는 방법 O(n) 이 경우는 판단하는 수를 2부터 그 수까지 모두 나누는 방법이다. 모든 값을 하나하나 약수가 있는지 판단하는 알고리즘으로 구현은 쉽지만 시간 복잡도가 O(n)으로 가장 비효율적이다. bool PrimeNumber(int number) { for(int i = 2; i < number; i++) { // 1개라도 나누어 떨어지면 약수가 존재하므로 false if(n..

[Algorithm] C++ - 10진수, 2진수 진법 변환 [내부링크]

진법 변환 C++에서 각 진법 변환에 대한 예제이다. 10진수에서 2진수 변환 에제 코드 #include using namespace std; int ToBinary(int number); int main() { int n; cout > n; cout

[Algorithm] C - Boyer-Moore 문자열 검색 알고리즘 [내부링크]

요약 시간 복잡도 평균 : O(n / m) / 최악 : O(n) 검색하고자 하는 패턴의 마지막 문자부터 앞쪽으로 검사를 진행 일치하지 않는 문자가 있을 경우 Skip 표에 따라 패턴을 옮겨 가면서 검사 각각의 문자를 만났을 때 패턴을 옮길 크기를 저장할 표를 만들어야 함 문자열의 커서는 앞에서 뒤로, 패턴의 커서는 뒤에서 앞으로 역방향으로 검사 Boyer-Moore 알고리즘이란 Boyer-Moore 알고리즘이란 검색하고자 하는 패턴의 마지막 문자부터 앞쪽으로 검사를 진행하면서 일치하지 않는 문자가 있으면 미리 준비한 표에 따라 패턴을 옮길 크기를 정하는 고리즘이다. Booyer-Moore 법은 Brute-Froce나 KMP 보다 효율이 더 우수하기 때문에 널리 사용되는 문자열 검색 알고리즘이다. R.S ..

[Algorithm] C - KMP(Knuth-Morris-Pratt Algorithm) 알고리즘 [내부링크]

요약 시간 복잡도 : 최상 O(mn) 문자열에서 특정 패턴을 미리 찾아내 검색하는 문자열 검색 알고리즘 문자열 검색 시 검사했던 위치 결과를 버러지 않아 효율적으로 검색할 수 있음 문자열 검색 시 불필요한 문자간 비교를 없애기 위해 실패 함수를 사용함 Boyer-Moore 법과 성능이 같거나 좋지 않아 실제로 많이 사용되지 않는 알고리즘 KMP(Knuth-Morris-Pratt Algorithm) 알고리즘이란 KMP 알고리즘이란 문자열 중에서 특정 패턴을 찾아내는 문자열 검색 알고리즘 중 하나이다. 문자열 검색 시 검사했던 위치 결과를 버리지 않고 효율적으로 검색할 수 있는 특징이 있다. 문자열 검색 시 불필요한 문자간 비교를 없애기 위해서 실패 함수를 사용한다. 문자열 검색 방법 아래 예제는 "ZABC..

[OpenCV] 블러링 기법과 가우시안 필터 [내부링크]

블러링 기법 블러링(bluring)이란 마치 초점이 맞지 않은 사진처럼 영상을 부드럽게 만드는 필터링 기법이다. 스무딩(smoothing)이라고도 한다. 영상에서 인접한 픽셀 간의 픽셀 값 변화가 크지 않은 경우 부드러운 느낌을 받을 수 있다. 블러링은 거친 느낌의 입력 영상을 부드럽게 만드는 용도로 사용되거나 영상에 존재하는 잡음의 영향을 제거하는 전처리 과정으로 사용한다. 평균값 필터 블러링 필터 중 단순하고 구현하기 쉬운 평균값 필터(mean filter)가 있다. 평균값 필터란 입력 영상에서 특정 픽셀과 주변 픽셀들의 산술 평균을 결과 영상 픽셀 값에 설정하는 필터이다. 평균값 필터에 의해 생성되는 결과 영상은 픽셀 값의 변화가 줄어들고, 날카로운 에지가 무뎌지며 노이즈의 영향이 크게 사라..

[OpenCV] 필터링 개념과 filter2D함수 [내부링크]

영상 처리에서 필터링(filtering)이란 원하는 정보만 통과시키고 원하지 않는 정보는 걸러 내는 작업을 뜻한다. 필터링에는 영상의 노이즈 성분을 걸러 영상을 깔끔하게 만드는 필터가 있고, 부드러운 느낌의 성분을 제거해 영상을 날카로운 느낌이 들도록 하는 필터가 있다. 영상의 필터링은 보통 마스크(mask)라고 부르는 작은 크기의 행렬을 이용한다. 마스크는 필터링의 성격을 정의하는 행렬이며, 커널(kernel), 윈도우(window) 라고도 부른다. 마스크 자체를 필터라고 부르기도 한다. 마스크는 다양한 크기와 모양으로 정의할 수 있으며, 마스크 행렬의 원소는 보통 실수로 구성된다. 1 x 3, 3 x 1 형태의 직사각형 행렬, 5 x 5, 3 x 3 등 형태의 정사각형 행렬, 십자가 모양 등 ..

[OpenCV] 영상의 논리 연산 방법 [내부링크]

OpenCV에서 영상의 논리 연산(logical operation)이란 픽셀 값을 2진수로 표현하여 각 비트 단위 논리 연산을 수행하는 것을 의미한다. OpenCV에서는 논리합(OR), 논리곱(AND), 부정(NOT), 배타적 논리합(XOR) 연산을 지원한다. 논리합(OR) : 2개의 입력 비트 중 1개라도 1이면 결과가 1이 되는 연산 논리곱(AND) : 2개의 입력 비트 중 모두 1인 경우만 결과가 1이 되는 연산 부정(NOT) : 입력 비트가 0이면 결과가 1, 1이면 결과가 0이 되는 연산 배타적 논리합(XOR) : 2개의 입력 비트 중 1개만 1인 경우 결과가 1이 되는 연산 입력 비트 논리 연산 결과 a b OR AND NOT a XOR 0 0 0 0 1 0 0 1 1 0 1 1 1 0..

[OpenCV] 영상의 산술 연산 방법 [내부링크]

OpenCV에서 영상은 일종의 2차원 행렬이기 때문에 산술 연산이나 논리 연산을 적용할 수 있다. 2개의 영상을 서로 더하거나 빼는 등 산술 연산을 수행함으로써 다른 영상을 생성할 수 있다. 영사들끼리 곱셈이나 나눗셈의 연산은 거의 사용하지 않는다. 영상의 덧셈 영상의 덧셈은 2개의 입력 영상에서 같은 위치 픽셀 값을 서로 더하여 결과 영상 픽셀 값으로 설정하는 연산이다. dst는 덧셈 연산의 결과이고, src1과 src2가 입력 영상이다. 영상의 덧셈 연산을 통하여 그 결과 값이 그레이스케일의 최대값인 255보다 커질 수 있으므로 포화 연산을 함께 적용한다. OpenCV에서 산술 연산을 위해 제공하는 함수가 있다. add(); void add(InputArray src1, InputA..

[OpenCV] 히스토그램 [내부링크]

히스토그램(histogram)이란 표로 되어 있는 도수 분포를 정보 그래프 형태로 표현한 것이다. 영상의 히스토그램(histogram)이란 영상의 픽셀 값 분포를 그래프 형태로 표현한 것을 의미한다. 그레이스케일 영상의 경우, 각 그레이스케일 값에 해당하는 픽셀이 개수를 구하고 이를 막대 그래프 형태로 표현함으로써 히스토그램을 구할 수 있다. 4 x 4 영상이 있다고 가정하고, 이 영상 의 픽셀이 0 ~ 7 사이의 밝기를 가질 수 있는 형태의 영상이 있다. 영상을 이루고 있는 각각의 밝기에 해당하는 픽셀 개수를 세어서 막대그래프 형태로 표현한 것이 히스토그램이다. 히스토그램 그래프에서 가로축을 히스토그램의 빈(bin) 이라고 한다.' 위의 히스토그램에서 빈 개수는 8개 이다. 픽셀이 0..

[OpenCV] 영상 밝기 및 명암 조절 [내부링크]

OpenCV에서 영상 밝기 조절은 덧셈 연산(밝기) 와 곱센 연산(명암)이 있다. 영상의 밝기 조절 영상의 밝기(brightness) 조절이란 영상의 전체적인 밝기를 조절하여 더 밝게 만들거나 어둡게 만드는 작업이다. 영상의 밝기를 조절하려면 입력 영상의 모든 픽셀에 일정 값을 더하거나 빼는 연산 작업을 수행하면 된다. 모든 픽셀 값에 양수 값을 더하면 영상이 밝아지고, 양수 값을 빼면 영상이 어두워진다. 영상의 밝기 조절을 수식으로 표현할 수 있다. dst(x, y) = src(x, y) + n dst : 출력 영상 src : 입력 영상 n : 조절할 밝기 값 n이 양수이면 dst(출력 영상)의 전체적인 밝기가 증가하고, n이 음수이면 밝기가 감소하여 어두워진다. 영상의 밝기 조절..

[OpenCV] FileStorage, FileNode 클래스 [내부링크]

OpenCV에서 Mat 클래스에 저장된 영상 데이터는 imwrite() 함수를 이용하여 PNG, JPG, BMP 등 영상 파일로 저장할 수 있다. 하지만, uchar 자료형을 사용하는 영상이 아닌 int, double, float 등의 자료형을 일반적인 행렬은 영상 파일 형식으로 저장할 수 없다. OpenCV에서 제공하는 FileStorage 클래스는 Mat 클래스 객체뿐만이 아니라 일반적인 C/C++ 자료형 데이터를 XML, YAML, JSON 등 파일 형식으로 저장하는 기능을 제공한다. FileStorage 클래스 OpenCV에서 데이터 파일 입출력을 하는 클래스이다. 데이터 파일의 입출력 기능을 캡슐화하여 지원한다. class FileStorage { public: FileStorage(..

[OpenCV] 이벤트 처리 인터페이스 [내부링크]

OpenCV는 영상 출력 창에서 발생하는 키보드 입력, 마우스 이벤트 등 사용자에게 전달하는 인터페이스를 제공하며. 이를 이용하면 프로그램 동작 시 사용자 입력을 실시간으로 처리하는 영상 처리 응용 프로그램을 만들 수 있다. 키보드 이벤트 처리 함수 waitKey(); int waitKey(int delay = 0); delay : 키 입력을 기다릴 시간(ms 단위). delay

[OpenCV] 문자열 출력 [내부링크]

openCV에서 영상에 직접 영상 처리 결과 또는 추가적인 정보를 문자열 형태로 나타낼 수 있는 함수를 제공한다. putText(); void putText(InputOutputArray img, const String& text, Point org, int fontFace, double fontScale, Scalar color, int thickness = 1, int lineType_LINE_8, bool bottomLeftOrigin = false); img : 입출력 영상 text : 출력할 문자열 org : 영상에서 문자열을 출력할 위치의 좌측 하단 좌표 fontFace : 폰트 종류로 cv::HersheyFonts에서 선택 가능 fontScale : 폰트 크기 확대/축소 비율 colo..

[OpenCV] 도형 그리기 [내부링크]

OpenCV 에선 사각형, 원, 다각형 등 도형에 관한 여러 가지 함수들을 제공한다. rectangle(); void rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); void rectangle(InputOutputArray img, Rect rec, const Scalar& color, int thickness = 1, int linetype = LINE_8, shift = 0); img : 입출력 영상 pt1 : 사각형 꼭지점 좌표 (Point 객체) pt2 : pt1과 대각 방향에 있는 사곽형 꼭지점 좌표 (P..

[OpenCV] 직선 그리기 [내부링크]

그리기 함수는 영상 위에 직선을 그리는 line() 함수가 있다. line() 함수는 cv 네임스페이스 안에 선언되어 있다. line(); void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0); img : 입출력 영상 pt1 : 시작점 pt2 : 끝점 color : 색 선상(밝기) thickness : 선 두께 lineType : 선 타입. LINE_4, LINE_8, LINE_AA 중 하나를 지정할 수 있다. shift : 그리기 좌표 값의 축소 비율 (오른쪽 비트 시프트 연산 >> ) line() 함수는 img 영상 ..

[OpenCV] VideoWriter 클래스 [내부링크]

VideoWriter 클래스란 VideoWriter 클래스는 OpenCV에서 동영상 파일을 생성하고 프레임을 저장하기 위해서 사용되는 클래스이다. class VideoWriter { public: VideoWriter(); VideoWriter(const String& filename. int fourcc, double fps, Size frameSize, bool isColor = true); virtual ~VideoWriter(); virtual bool open(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true); virtual bool ioOpened() const; virtual void rel..

[OpenCV] VideoCapture 클래스 [내부링크]

VideoCapture 클래스란? 카메라 또는 동영상 파일로부터 정지 영상 프레임을 받아올 수 있는 클래스이다. 동영상이란 일련의 정지 영상을 압축하여 파일로 저장한 형태로, 이때 동영상에 저장되어 있는 일련의 정지 영상을 프레임(frame) 이라고 한다. 그러므로 동영상을 처리하는 작업은 동영상에서 프레임을 추출한 후, 각각의 프레임에 영상 처리 기법을 적용하는 형태로 이루어진다. 컴퓨터에 연결된 카메라 장치를 사용하는 작업도 카메라로부터 일정 시간 간격으로 정지 영상 프레임을 받아와서 처리하는 형태이다. class VideoCapture { public: VideoCapture(); VideoCapture(const String& filename, int apiPreference = CAP_A..

[OpenCV] InputArray, OutputArray 클래스 [내부링크]

InputArray 와 OutputArray 클래스는 OpenCV 함수 인자로 자주 사용된다. InputArray 클래스는 주로 OpenCV 함수의 입력으로 사용되고, OutputArray 주로 클래스는 OpenCV 함수의 출력으로 사용되는 인터페이스 클래스이다. InputArray 클래스 InputArray 타입의 인자를 사용하는 함수는 자주 볼 수 있다. InputArray 클래스는 Mat, vector 등 다양한 타입을 표현할 수 있는 인터페이스 클래스이다. typedef const _InputArray& InputArray InputArray 클래스는 위와 같은 형태의 이름 재정의가 되어 있다. Mat, Mat_, Matx, vector, vector< vector >, vector, ..

[OpenCV] Scalar 클래스 [내부링크]

OpenCV 에서 Mat 클래스 다음으로 자주 사용되는 클래스가 Scalar 클래스이다. Scalar 클래스는 영상에서 픽셀 값을 표현하는 용도로 자주 사용된다. Scalar 클래스는 Scalar_ 라는 이름의 클래스 템플릿 이름 재정의 이며, Scalar_ 클래스는 Vec 클래스를 상속받아 만들어졌다. template class Scalar_ : public vec { public: Scalar_(); // Scalar_ 클래스 기본 생성자 Scalar_(_Tp, v0); // Scalar_ 클래스 생성자 Scalarl_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0); static Scalar_ all(_Tp v0); // Scalar_::all() 멤버 함수는 4개의 val 배열..

[OpenCV] Vec 클래스 [내부링크]

Vec 클래스란 Vec 클래스란? 작은 개수의 원소로 구성된 벡터를 표현하는 템플릿 클래스이다. Vec 클래스는 OpenCV 프로그래밍에서 유용하게 사용되고 있다. Vec 클래스는 Matx 클래스의 상속을 받는다. 하나의 행으로만 이루어진 행렬을 행 벡터라고 부르고, 하나의 열로만 구성된 행렬은 열 벡터라고 부른다. 즉, 벡터는 같은 자료형을 가진 원소 몇 개로 구성된 데이터 형식이라고 볼 수 있다. template class Matx { public: ... _Tp val[m*n]; } template class Vec : public Matx { public: ... _Tp& operator[](int i); }; tmplate static inline std::ostream& operator 괄..

[OpenCV] Mat 클래스의 크기 및 타입 변환 함수 [내부링크]

Mat 클래스의 크기나 타입을 변환시키는 멤버 함수가 있다. Mat::convertTo() void Mat::convertTo(OutputArray m, int rtype, doule alpha=1, double beta=0) const; m : 출력 행렬이다. 만약 m 행렬이 적절한 크기와 타입이 아닌 경우 행렬 원소 데이터를 새로 할당한다. rtype : 원하는 출력 행렬의 타입이다. 만약 rtype이 음수이면 출력 행렬은 입력 행렬과 같은 타입을 갖는다. alpha : 추가적으로 곱할 값 beta : 추가적으로 더할 값 Mat::convertTo() 함수는 행렬의 타입을 변경하는 함수이다. 행렬 원소의 타입을 다른 타입으로 변경하고, 추가적으로 모든 원소에 일정한 값을 더하거나 곱할 수 있다. ..

[OpenCV] Mat 클래스의 픽셀 접근 방법 [내부링크]

OpenCV 에서 제공하는 픽셀(원소) 접근 방법은 여러 가지가 있다. Mat::at(); template _Tp& Mat::at(int y, int x) y : 참조할 행 번호 x : 참조할 열 번호 반환값 : (_Tp& 타입으로 형 변환된) y번째 행, x번째 열의 원소 값(참조) Mat::at() 함수는 보통 행과 열을 나타내는 2개의 정수를 인자로 받아 해당 위치의 픽셀 값을 참조 형식으로 반환한다. 템플릿을 사용하는 템플릿 함수로서 여러 가지 형태로 재정의가 되어 있다. 템플릿 함수로 지정되어 있기 때문에 사용할 때 자료형을 명시적으로 지정해야 한다. 예를 들어 Mat 행렬의 타입이 CV_8UC1이면 uchar 자료형을, CV_32FC1 타입이라면 float 자료형을 지정한다. 만약 CV..

[OpenCV] Mat 클래스 ROI 추출 함수 [내부링크]

ROI(Region Of Interset)란 ROI란 이미지(영상) 에서 내가 원하는 관심 영역을 말한다. Mat 클래스로 정의된 행렬에서 특정 사각형 영역의 부분 행렬을 추출하고 싶을 땐 괄호 연산자 재정의를 사용한다. Mat::Mat(); Mat Mat::operator()(const Rect& roi) const; Mat Mat::operator()(Range rowRange, Range colRange) const; roi : 사각형 관심 영역 rowRange : 관심 행 범위 colRange : 관심 열 범위 반환값 : 추출한 부분 행렬 또는 영상이다. 부분 영사의 픽셀 데이터를 서로 공유한다. 부분 영상 추출 코드 작성 Mat img1 = imread("Lenna.bmp"); // ..

[OpenCV] Mat 클래스의 행렬 복사 [내부링크]

Mat 클래스 객체에 저장된 영상 또는 행렬을 복사하는 가장 간단한 방법은 복사 생성자 또는 대입 연산자를 사용하는 것이다. Mat img1 = imread("Lenna.bmp"); Lenna.bmp 파일을 불러와 Mat 타입의 변수 img1에 저장한다. Mat img2 = img1; // 복사 생성자(얕은 복사) img1 변수에 저장된 레나 영상을 복사하여 img2에 저장한다. img1과 같은 크기, 같은 타입의 새로운 Mat 객체 img2를 생성하고, img1의 픽셀 데이터를 img2가 참조하도록 설정한다 즉, img1과 img2는 하나의 영상을 공유하는 서로 다른 이름의 변수 형태로 동작한다. 이처럼 Mat 클래스의 복사 생성자는 행렬의 원소 데이터를 공유하는 얕은 복사(Shallow Copy)를 ..

[OpenCV] Mat 객체 생성과 초기화 함수 [내부링크]

Mat 클래스를 이용하여 객체의 생성과 초기화 방법은 여러가지 방법이 있다. Mat 클래스의 객체 생성 방법 Mat(); 기본 생성자 Mat img1; 가장 기본적인 Mat 객체 생성 방법으로 Mat 클래스의 기본 생성자를 이용하는 방법이다. 기본 생성자는 아무런 인자를 받지 않으며, 실제 코드 작성 시에는 단순히 Mat 클래스 타입의 변수를 선언하는 형태이다. img1 객체는 비어 있는 행렬이다. 즉 img1.rows 와 img1.cols 의 값은 0이고 img1.data에도 0(NULL)이 저장된다. 이렇게 비어 있는 행렬을 OpenCV 영상 처리 함수의 입력으로 사용하거나 비어 있는 행렬의 원소 값을 참조 시 에러가 발생한다. Mat::Mat(); 객체 생성과 동시에 원소 값 저장을 위한 메모리..

[OpenCV] Mat 클래스의 자료형 [내부링크]

OpenCV에서 Mat 클래스의 여러 자료형의 원소를 가질 수 있으며, 원소는 하나의 값을 가질 수도 있고, 또는 여러 개의 값이 모여서 하나의 원소로 표현되기도 한다. OpenCV에서 C/C++ 기본 자료형 중 unsigend char, signed char, unsigned short, signed short, int, float, double 자료형을 사용하는 Mat 행렬을 지원한다. OpenCV 4.0 버전 부터는 16비트 실수형 자료형도 존재한다. Mat 클래스에서 어떤 행렬이 어떤 자료형을 사용하는지에 대한 정보를 깊이(depth)라고 한다. OpenCV는 C/C++에서 사용하는 기본 자료형의 이름을 typedef 구문을 이용하여 재정의 해서 사용한다. OpenCV에서 사용하는 주요 자..

[OpenCV] Mat 클래스 [내부링크]

OpenCV에서 가장 많이 사용하는 클래스는 행렬을 나타내는 Mat 클래스이다. 그러므로 OpenCV 라이브러리를 잘 다루기 위해서는 Mat 클래스를 제대로 이해해야 한다. Mat 클래스의 개요 Mat 클래스란? OpenCV 라이브러리에서 가장 많이 사용하는 행렬을 표현하는 클래스이다. 이름에서 알 수 있듯이 행렬(Matrix)을 표현하는 클래스이다. OpenCV가 컴퓨터 비전 라이브러리이기 때문에 실제로는 일반적인 행렬보다는 2차원 영상을 표현하는 용도로 많이 사용된다. 일반적인 2차원 행렬뿐만 아니라 고차원 행렬을 표현할 수 있으며, 한 개 이상의 채널을 가질 수 있다. 정수, 실수, 복소수 등으로 구성된 헹렬 또는 벡터(vector)를 저장할 수 있고, 그레이스케일 또는 컬러 영상을 저장할 ..

[OpenCV] String 클래스 [내부링크]

많은 프로그램에서 그렇듯 OpenCV에서도 문자열을 다루는 경우가 많다. OpenCV 에서는 영상 출력 창에 고유의 문자열을 지정하여 구분하고, 영상에 문자열을 출력하는 기능을 제공한다. C++ 표준 라이브러리(STL) 에서 std::string 클래스와 같이 OpenCV 에서는 cv::String 클래스를 사용하여 문자열을 저장하고 차리할 수 있다. OpenCV 4.0 버전 이전에 자체적인 String 클래스를 정의하여 사용하였다. 그러닥 OpenCV 4.0 버전부터 자체적인 String 클래스 정의를 삭제하고 대신 C++ 표준 라이브러리의 std::string 클래스를 String 클래스로 이름 재정의하여 사용한다. 실제로 OpenCV 헤더 파일에는 다음과 같이 typedef로 재정의 코드가 들어..

[OpenCV] Range 클래스 [내부링크]

Range 클래스란 범위 또는 구간을 표현하는 클래스이다. Range 클래스는 start 와 end를 멤버 변수로 갖는다. start : 범위의 시작 end : 범위의 끝 class Range { public: Range(); // 기본 생성자로 start와 end를 0으로 초기화 Range(int _start, int _end); // 두 개의 정수를 인자로 받는 생성자로 start = _start, end = _end로 초기화 int size() const; // Range::size() 멤버 함수는 범위 크기(end - start) 반환 bool empty() const; // Range::empty() 멤버 함수는 start와 end가 같으면 true 반환 static Range all(); //..

[OpenCV] RotatedRect 클래스 [내부링크]

RotatedRect 클래스란 회전된 사각형을 표현하는 클래스이다. 멤버변수로 center, size, angle을 가진다. center : 회전된 사각형의 중심 좌표를 나타냄 size : 사각형의 가로 및 세로 크기를 나타냄 angle : 회전 각도 정보를 나타냄 class RotatedRect { public: RotatedRect(); // 기본 생성자로 모든 멤버 변수를 0으로 초기화 RotatedRect(const Point2f& _center, const Size2f& _size, float _angle); // (_center, _size, _angle)을 인자로 받는 생성자로 center = _center, size = _size, angle = _angle 으로 초기화 RotatedRec..

[OpenCV] Rect_ 클래스 [내부링크]

Rect_ 클래스 사각형의 위치와 크기 정보를 표현할 때 사용한다. 사각형의 좌측 상단 점의 좌표를 나타내는 x, y 멤버 변수와 사각형의 가로 및 세로 크기를 나타내는 width, height 멤버 변수를 가지고 있다. template class Rect_ { public: Rect_(); // 기본 생성자로 모든 멤버 변수를 0으로 초기화 Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height); // (_x, _y, _width, _height) 사각형 정보를 인자로 받는 생성자로 x = _x, y = _y, width = _width, height + _height 로 초기화 Rect_(const Recdt_& r); // 복사 생성자로 x = r.x, y = r.y, ..

[OpenCV] Size_ 클래스 [내부링크]

Size_ 클래스는 영상 또는 사각형 영역의 크기를 표현할 때 사용한다. Size_ 클래스는 사각형 영역의 가로와 세로 크기를 나타내는 width, height 멤버 변수를 가지고 있다. template class Size_ { public: Size_(); // 기본 생성자로 width, height를 0으로 초기화 Size_(_Tp _width, _Tp _height); // (_width, _height) 크기를 인자로 받는 생성자로 width = _width, height = _height로 초기화 Size_(const Size_& sz); // 복사 생성자로 width = sz.width, height = sz.height로 초기화 Size_& operator = (const Size_& sz)..

[OpenCV] Point_ 클래스 [내부링크]

Point_클래스 2차원 평면 위에 있는 점의 좌표를 표현하는 템플릿이다. 2차원 좌표를 나타내는 x와 y라는 이름의 멤버 변수를 가지고 있다. template class Point_ { public: Point_(); // Point 의 기본 생성자로 x = 0, y = 0으로 초기화 Point_(_Tp _x, _Tp _y); // (_x, _y) 좌표를 인자로 받는 생성자로, x = _x, y = _y로 초기화 Point_(const Point_& pt); // 복사 생성자로, x - pt.x, y = pt.y 로 초기화 Point_& operator = (const Point_& pt); // 대입 연산자 재정의 _Tp dot(const Point_& pt) const; // Point::dot()..

[OpenCV] Visual Studio - OpenCV 환경 설정 [내부링크]

Visual Studio에서 OpenCV를 사용하기 위해서 Debug와 Release 항목은 각각의 설정을 해주어야 한다. 설정은 디버그와 릴리즈 항목 동일하지만, 추가 종속성 항목에서만 다르다. 릴리즈 항목을 설정하기 위해서 프로젝트 속성 - 구성 항목을 릴리즈로 변경하면 된다. 아래 코드는 설치되어 있는 OpenCV 버전을 확인하는 코드이다. 해당 코드를 빌드하면 오류가 발생한다. #include "opencv2/opencv.hpp" #include int main() { std::cout > 추가 포함 디렉터리에서 우측 화살표 >> 클릭 우측 메뉴 4개 중 좌측 메뉴(줄 추가) 클릭 후 $(OPENCV_DIR)\include 입력 $(OPENCV_DIR)\include는 C:\open..

[OpenCV] 주요 모듈 [내부링크]

OpenCV 모듈 OpenCV 라이브러리는 다수의 모듈(module)로 구성되어 있다. 모듈은 OpenCV에서 제공하는 다양한 클래스와 함수를 그 기능과 성격에 따라 모아서 만들어놓은 OpenCV의 부분 라이브러리다. 예를 들어 OpenCV의 핵심 클래스와 함수는 core 모듈에 들어 있고, 영상 출력 기능은 highgui 모듈에 포함되어 있다. OpenCV는 다수의 모듈 라이브러리가 모여서 만들어진 것이다. 모듈 이름 설명 calib3d 카메라 캘리브레이션과 3차원 재구성 core 행렬, 벡터 등 OpenCV 핵심 클래스와 연산 함수 dnn 심층 신경망 기능 features2d 2차원 특징 추출과 특징 벡터 기술, 매칭 방법 flann 다차원 공간에서 빠른 최근방 이웃 검색 highgui 영상의 화면 ..

[OpenCV] OpenCV란 [내부링크]

OpenCV(Open source Computer Vision) OpenCV란 인텔에서 개발한 이미지 처리를 위한 라이브러리로, 주로 실시간 이미지 처리를 위해서 사용된다. OpenCV는 1999년 인텔의 개리 브래드스키(Gary Bradsky)가 개발을 시작하여 2000년에 처음 공개된 C/C++ 기반의 영상 처리 전용 라이브러리이다. 파이썬, C#등 다양한 언어를 지원하고 있다. OpenCV를 사용하면 쉽게 영상 처리를 할 수 있고, 다양한 영상 처리 알고리즘을 지원하며, 카메라와 같은 장치를 통한 영상 입력 기능들도 제공하고 있다. 영상 처리, 패턴 인식, 컴퓨터 비전 알고리즘을 구현한 풍부한 함수를 제공하며, 영상의 인식과 처리, 색상 공간의 변환, 필터링, DTF 및 FET, 주파수 ..

[Embedded] 부트 로더(Boot loader) [내부링크]

부트로더란(boot loader) 부트로더란 장치에 생명을 불어넣고 부트 절차를 시작하는 것이다. 즉, 부트로더는 시스템을 시작시키고 운영체제 커널을 로드하는 것이다. 부트로더가 하는 일 임베디드 리눅스 시스템에서 부트로더는 시스템을 기본 수준(basic level)으로 초기화하고 커널을 로드하는 2가지의 주요 작업을 수행한다. 전원을 켜거나 부트로더 코드의 첫 줄이 실행되면 시스템은 아주 최소 상태에 있다. 이때 DRAM 컨트롤러가 시작하지 않았기 때문에 주 메모리에는 접근할 수 없다. 마찬가지로 다른 인터페이스도 구성되지 않았기 때문에 NAND 플래시 컨트롤러, MMC 컨트롤러 등을 통해 접근하는 저장소도 사용할 수 없다. 결과적으로 시스템 부트스트랩은 몇 단계의 코드로 이루어지며, 각각의 시..

[Embedded] 툴체인(Toolchain) [내부링크]

툴체인(toolchain)이란? 소스 코드를 타겟(target) 장치에서 실행할 수 있는 실행 파일로, 컴파일러, 링커, 런타임 라이브러리를 포함하는 컴파일 도구의 집합이다. 부트로더, 커널, 루트 파일시스템을 빌드하기 위해서 툴체인이 필요하다. 흔히 리눅스용 툴체인은 GNU 프로젝트에서 만들어진 요소에 기반을 두고 있다. 표준 GNU 툴체인은 3가지 주요 요소로 이루어져 있다. Binutils 어셈블러와 링커를 포함하는 바이너리 유틸리티의 집합이다. GCC(GNU Compiler Collection) C, C++ 등 여러 언어를 위한 컴파일러이다. 공통 백엔드를 사용해 어셈블러 코드를 만들고, GNU 어셈블러로 넘긴다. C 라이브러리 POSIX 규격에 기반을 둔 API로 응용 프로그램..

[Embedded] 임베디드 리눅스란 [내부링크]

임베디드 리눅스는 간단하게 스마트폰, 셋톱 박스, TV, 라우터 등 부터 크게는 산업용 장치, 의료 감시 장치 등 임베디드 컴퓨터 시스템 상에서 사용하는 리눅스를 일컫는 말이다. 리눅스는 1991년에 최초 버전이 출시 되었는데, 약 8년 뒤인 1999년 정도에 처음으로 임베디드 장치에 쓸만해 졌다. 액시스(Axis Communication)의 네트워크 카메라, 티보(Tivo)의 DVR(Digital Video Recorder) 출시를 시작으로, 임베디드 리눅스가 보편화되어 사용하게 되었다. 임베디드 장치에 리눅스가 탑재되어 사용된 이유는 임베디드 제품이 더욱 복잡하고, 다양한 기능들이 많아져 운영체제가 필요하게 된 것이다. 예를 들어, TV는 단순히 영상만 보여주기만 하는 것이 아닌, 인터넷에 연..

[Embedded] 상태 레지스터 구조 [내부링크]

ARM의 상태 레지스터 내부 구조 ARM은 2가지의 상태 레지스터(Status Register) 종류를 가지고 있으며, 1개의 CPSR과 6개의 SPSR로 구성된다. 각각의 종류 모두 내부 구조는 32bit 길이로 동일하다. 각각의 비트에 따라 동작 모드, ARM/Thumb 명령어 상태, 인터럽트 상태, ALU 연산 결과에 대한 정보를 저장한다. 플래그 비트(Flag Bit) 플래그의 뜻은 어원은 깃발을 들거나 내리는 행위를 말한다. 프로그래밍 개념에서는 무엇인가를 기억해야하거나 또는 다른 프로그램에게 약속된 신호를 남기기 위한 용도로, 프로그램에 의해 사용되는 미리 정의된 비트를 말한다. 상태 레지스터에서 플래그 비트는 ALU의 연산 결과에 대한 상태 정보를 나타낸다. ALU의 연산 결과에 따라..

[Embedded] ARM 구성 레지스터 [내부링크]

ARM Register ARM 프로세서는 32비트 길이의 레지스터를 총 40개 가지고 있다. 데이터 연산을 할 때 사용하는 범용 레지스터(General Purpose Register) 32개, 프로세서의 동작 상태를 나타낼 때 사용하는 상태 레지스터(Status Register) 7개 프로그램을 제어할 때 사용하는 프로그램 카운터(PC, Program Counter) 1개로 구성되어 있다. 범용 레지스터(General Purpose Register) 범용 레지스터는 데이터 처리나 데이터 전송 등 다양한 목적으로 사용된다. 32개의 범용 레지스터는 8가지의 ARM 동작 모드에서 공유하여 사용하는 레지스터와 각 동작 모드별로 할당된 레지스터가 있다. 각 동작 모드별로 할당되는 레지스터는 서로 다른 동작 ..

[Embedded] ARM 동작 모드와 레지스터 [내부링크]

ARM 프로세서의 동작 모드 ARM 프로세서의 동작 모드는 프로세스가 어떤 권한을 가지고 어떤 종류의 작업을 처리하는지를 나타낸다. ARM에서 제공하는 모드는 총 8가지 동작 모드가 있다. 유저 모드와 시스템 모드를 제외한 다른 동작 모드는 모두 외부의 요청이나 오류에 의해 전환이 이루어진다. 유저 모드와 시스템 모드는 외부의 요청이나 오류가 아닌 프로그래밍 필요에 의해 S/W 적으로만 변경할 수 있다. ARM에는 상태 레지스터(Status Register)가 존재하는데, 이 레지스터의 값을 수정하여 각각의 동작 모드를 제어할 수 있다. User Mode 유저 모드는 ARM이 User Task, Application 등을 수행할 때의 동작 모드이다. 유저 모드를 제외한 다른 모드들과 다르게 유..

[Embedded] ARM의 개요 [내부링크]

ARM(Advanced RISC Machine)이란 1985년 영국의 아콘 컴퓨터(Arcon Computers) 에서 처음 개발을 시작하여 만든 프로세서이다. 이 때, 초기 ARM의 이름은 Acorn RISC Machine 으로 시작한 것이 ARM의 시작이었다. 이후 약 5년 뒤 1990 Apple, VLSI Technology 라는 두 회사와 아콘 컴퓨터, 총 세 회사의 조인트 벤처로 생겨났다. 세 회사가 합작회사를 설립하고 이름을 Advanced RISC Machine 으로 변경하였고, 이 ARM이 지금까지 이어져 오고 있다. ARM 프로세서는 현재 임베디드 기기에서 가장 많이 사용되는 RISC 기반의32bit 프로세서이다. 저전력을 기반으로 설계된 ARM은 스마트폰을 비롯한 각종 다양한 전자기기..

[Embedded] 명령어 구조 [내부링크]

명령(Instruction)의 의미 명령이란 프로세서에 어떤 업무를 지시하는 것을 총칭하는 의미이다. 프로세서의는 내부는 많은 디지털 회로들로 구성되어 있다. 이러한 이유로 프로세서는 0과 1만을 이해할 수 있는 2진수로 명령을 내려야만 프로세서가 이해할 수 있다. 이러한 프로세서가 이해할 수 있는 언어, 즉 2진수로 표현한 언어를 기계어(Machine Language)라고 한다. 개발을 하는 개발자들은 사람이기 때문에 0과 1로 이루어진 2진수로 프로그램을 작성하기란 쉽지 않다. 그래서 임베디드 개발을 하기 위해 C언어 또는 어셈블리어를 이용하여 코드를 작성하고, 컴파일러와 같은 도구를 이용해 기계어로 변환한다. 임베디드 개발에서는 어셈블리어(Assembly Language)가 중요한 요소이다..

[Embedded] 임베디드 시스템의 메모리 종류 [내부링크]

메모리(Memory)란 메모리(Memory)는 프로그램이나 데이터를 저장하기 위한 장치로, 크게 주기억 장치(Main Memory), 보조 기억 장치(Secondary Memory), 캐시(Cashe)로 나뉜다. 주기억 장치는 프로그램이 수행되는 동안에 프로그램과 데이터를 저장한다. 어떠한 동작을 바이트, 하트워드, 워드 단위에 맞게 수행할 수 있도록 구성되어 있으며, 메모리의 특정 위치에 명령이나 데이터의 접근(Access)하기 위해 주소를 사용한다. 일반적으로 DRAM(Dynamic Random Access Memory), SRAM(Static Random Access Memory)를 주로 사용한다. 보조 기억 장치는 자주 사용되지 않거나, 당장 사용하지 않는 프로그램이나 데이터를 저장하기 위..

[Embedded] Endian 구조 [내부링크]

엔디안(Endian) 이란 엔디안이란 컴퓨터의 메모리와 같이 데이터를 저장하는 공간에서 여러 개의 연속된 대상을 배열하는 방법을 뜻한다. 즉, 데이터가 메모리에 저장되는 순서이다. 메모리는 프로그램과 데이터를 저장하는 공간으로 사용되는데, 메모리 구조에 따라 빅 엔디안(big endian), 리틀 엔디안(little endian)으로 나뉜다. 대표적으로 PC에서 가장 많이 사용되는 Intel의 x86 계열 프로세서가 대표적인 리틀 엔디안 방식을, IBM, Motorora 같은 경우는 빅 엔디안 방식을 사용한다. ARM의 같은 경우 리틀 엔디안과 빅 엔디안 둘 다 사용할 수 있지만 디폴트 값으로 리틀 엔디안 방식을 사용한다. ARM의 경우 기본적으로 외부의 신호에 의해 하드웨어적으로 선택되지만,..

[Algorithm] C - 브루트 포스(Brute Force)를 이용한 문자열 검색 [내부링크]

요약 시간 복잡도 : 최상 O(n) 최악 O(mn) 브루트 포스 알고리즘이란 완전탐색 알고리즘으로 문제에 나와있는 모든 경우의 수를 시험하는 방법 찾고 싶은 문자열이 있을 때 각각의 문자 하나하나 대조하며 찾아내는 방법 검색할 문자열의 커서와 찾을 문자열의 커서를 두고 한 문자씩 비교 구조가 간단하여 구현 및 이해가 쉽지만 비효율적 알고리즘 브루트-포스법(Brute force) 알고리즘 브루트 포스 알고리즘이란 완전탐색 알고리즘으로 문제에 나와있는 모든 경우의 수를 시험하는 방법이다. 문자열을 검색하는 가장 기초적인 알고리즘으로 꼽히며 찾고 싶은 문자열이 있을 때 하나하나 대조하며 찾아낸다. 브루트 포스 알고리즘은 구조가 간단하여 구현 및 이해가 쉽지만 비효율적 알고리즘이다. 아래 예제는 문자열 "ABA..

[Algorithm] C - 퀵 정렬(Quick Sort) [내부링크]

요약 시간 복잡도 : O(n log n) ~ O(n ^ 2) 정렬할 데이터에서 피벗을 기준으로 두 개의 비균등한 크기로 분할하는 작업을 반복 피벗 이하의 그룹과 이상의 그룹이 왼쪽, 오른쪽으로 분리되었을 경우 배열을 다시 분할 요소가 1개가 되었을 때 분할을 멈춤 퀵 정렬(Quick Sort) 퀵 정렬이란 정렬할 데이터에서 피벗(pivot)을 기준으로 두 개의 비균등한 크기로 분할하고 분할된 부분 리스트를 정렬하는 알고리증믈 말한다. 퀵 정렬은 가장 빠른 정렬 알고리즘으로, 찰스 앤터니 리처드 호어(C. A. R. Hoare)가 붙인 이름으로, 속도가 빠른 만큼 많이 사용되는 정렬 알고리즘이다. 만약 어떤 학생 그룹이 있고, 수가 8명이며 키 순서대로 정렬해야 되는 구조가 있다. 먼저 임의의 학생 A를 ..

[Algorithm] C - 이진 탐색(Linear Search) [내부링크]

요약 시간 복잡도 : O(log N) 데이터의 중간 값을 확인해 검색 범위를 반씩 좁혀가는 검색하는 검색 알고리즘 오름차순 또는 내림차순으로 정렬된 데이터 구조에서만 사용할 수 있음 검색이 반복될 때마다 검색 범위가 반으로 좁혀지므로 검색 속도가 빠름 검색 범위를 맨 앞, 맨 끝, 중앙 요소로 두고 중앙 요소의 값으로 학인함 이진 탐색(Binary Search) 이진 탐색이란 데이터가 오름차순 또는 내림차순으로 정렬되어 있을 때 검색하는 정렬 알고리즘이다. 이진 탐색은 정렬되지 않은 데이터에서는 사용할 수 없으나, 선형 검색보다 빠르게 검색할 수 있는 장점이 있다. 데이터의 중간 값을 확인해 검색 범위를 반씩 좁혀가며 검색하는 구조를 가지고 있다. 먼저 정렬된 배열이 있다고 가정한다. [5, 7, 15,..

[Algorithm] C - 선형 검색(Linear Search) [내부링크]

요약 시간 복잡도 : O(n) 검색 방법 중 가장 단순하여 구현이 쉽움 정렬되지 않은 데이터 구조에서도 사용 가능 길이가 길수록 비효율(모든 데이터 검색 필요) 선형 검색(Linear Search)이란 선형 검색이란 데이터가 모인 집합(배열, 링크드 리스트 등)에서 원하는 키 값을 갖는 요소를 만날 때까지 맨 앞부터 순서대로 검색하여 찾는 검색 알고리즘을 말한다. 다른 말로 순차 검색(Sequential Search)라고도 한다. 검색하고자 하는 데이터 집합이 있다고 가정한다. 이 배열에서 2라는 값을 찾기 위해 0번 인덱스 요소부터 차례로 검색한다. 위 배열에서는 2라는 값을 찾기 위해 4번의 검색으로 발견하였다. 첫 번째 인덱스 값 6 확인, 원하는 값이 아님 두 번째 인덱스 값 4 확인, 원하는 값..

[Algorithm] C - 삽입 정렬(Insertion Sort) [내부링크]

요약 시간 복잡도 : O(n^2) 선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 삽입하는 작업을 반복하는 정렬 알고리즘 정렬되지 않은 데이터가 있을 때 정렬되지 않은 첫 번째 요소를 정렬된 부분의 알맞은 위치에 삽입 정렬이 많이 이루어진 경우 효율적으로 사용 가능 정렬에 안정적이고 단순해서 구현이 쉬우나 시간 복잡도가 비효율적임 삽입 정렬(Insertion Srot)이란 삽입 정렬이란 선택한 요소를 그보다 더 앞쪽의 알맞은 위치에 삽입하는 작업을 반복하는 정렬 알고리즘이다. 정렬되지 않은 데이터가 있을 때 정렬되지 않은 첫 번째 요소를 정렬된 부분의 알맞은 위치에 삽입하는 개념이다. 위와 같은 정렬되지 않은 배열이 있다고 가정한다. 삽입 정렬은 2번째 요소부터 선택하여 진행한다. 이때 4는 6보다 앞쪽에..

[STM32] RCC 설정용 구조체 및 구동 함수 [내부링크]

RCC 설정용 구조체 함수 명 설명 RCC_ClkInitTypeDef 클럭의 초기 설정용 구조체 [DataType] uint32_t ClockType : 설정할 클럭, 이 파라미터는RCC_System_Clock_Type 중의 값 이어야 함 uint32_t SYSCLKSource : 시스템 클럭으로 사용하는 소스, RCC_System_Clock_Source 중의 값 이어야 함 uint32_t AHBCLKVivider : AHB 클럭의 디바이더. RCC_AHB_Clock_Source 중의 값이어야 하고 AHB클럭은 시스템 클럭에 의해 동작됨 uint32_t APB1CLKDivider : APB1 클럭의 디바이더. RCC_APB1_APB2_Clock_Source 중의 값이어야 하고 APB1 클럭은 AHB 클럭..

[STM32] Timer [내부링크]

타이머(Timer)란 타이머란 임의의 주기를 갖는 신호를 측정하거나 생성할 때 사용되는 디지털 회로를 말한다. 특정 주기마다 이벤트를 발생시키거나, 외부에서 들어온 신호의 길이를 측정할 때 사용한다. 또 PWM과 같은 파형을 생성하여 출력으로 보낼 때도 사용된다. MCU에서 GPIO, 통신 모듈과 더불어 자주 사용되는 모듈 중 하나이다. 대표적인 타이머 타이머는 대표적으로 4가지가 있다. 범용(General-Purpose) 타이머 출력 비교, 원펄스 입력캡쳐, 센서 인터페이스(엔코더, 홀 센서 등) 등의 용도로 사용할 수 있는 범용 기능을 가지는 타이머 고급(Advanced) 타이머 범용 타이머보다 더 많은 기능을 가지는 타이머, 주로 모터 제어와 디지털 파워 변환(Power Conversion) 용..

[STM32] ADC(Analog Digital Converter) [내부링크]

ADC(Analog Digital Converter)란 ADC란 뜻 그대로 아날로그를 디지털 컨버터로 변환하는 과정이다. 외부에서의 센서 값, 엔코더 등 아날로그 적인 신호를 받아 MCU 내부에서 디지털로 변환 후 처리하는 작업이다. ADC의 모드 1. 단일(Single) 변환 모드 단일 변환 모드에서 AD 변환기는 변환을 1번만 수행한다. ADC_CR2 레지스터의 CONT 비트를 0으로 두면 단일 변환 모드로 설정된다. ADC_CR2 레지스터의 ADON 비트가 설정되거나 또는 외부 트리거 입력이 인가되면 변환이 시작된다. 2. 연속(Continuous) 모드 연속 변환 모드에서 AD 변환기는 하나의 변환이 완료되면 바로 다음의 변환을 시작한다. 레지스터의 CONT 비트를 1로 두면 연속 변환 모드로 설..

[STM32] DAC(Digital Analog Convertor) [내부링크]

DAC(Digital Analog Convertor)란 이름 그대로 디지털을 아날로그로 변환하는 과정이다. 쉽게 생각해서 ADC에 반대로 생각할 수 있다. DAC 변환 과정 APB1_CLK에 맞게 DHRx(DAC Holding Register) 와 DORx(DAC Output Register)가 로딩된다. DAC_DORx에 직접 데이터를 로딩 하는 것은 허용되지 않으며, DAC_DHRx 레지스터(DHR8x, DHR12Lx, DHR8D, DHR12LD 또는 DAC_DHR12LD)를 통해 로딩해야 한다. DAC_DHRx 레지스터에 로드된 데이터는 1개의 ABP1 클럭 사이클 후 DAC_DORx 레지스터로 전송되고 데이터가 DAC_DORx 레지스터에 로드되면 DA변환이 시작되고, t(SETTING) 시간 후 ..

[STM32] UART, USART [내부링크]

UART(Universal Asychronous Receiver/Transmitter)란 데이터를 직렬, 또는 병렬로 변환시켜주는 범용 비동기 수신기로 두 장치 사이에 데이터가 전송될 때 수신부의 클럭에 동기되지 않는 방식 USART(Universal Synchronous and Asychonous Receiver/Transmitter) 비동기 뿐만 아니라 동기 통신도 가능한 범용 동기/비동기 수신기로 두 장치 사이에 데이터가 전송될 때 수신부의 클럭이 송신부의 클럭에 동기되는 방식임. 동기를 위해서 별도의 클럭 단자를 이용해서 송신부의 클럭을 수신부에 공급하는 방법을 많이 사용함 통신 방식 통신에 사용되는 라인의 수를 기준으로 구분하면 직렬 통신과 병렬 통신으로 나눌 수 있다. 렬 통신은 1개의 라..

[Algorithm] C - 선택 정렬(Selection Sort) [내부링크]

선택 정렬(Selection Sort) 요약 시간 복잡도 : O(n ^ 2) 가장 작은 요소부터 선택해 알맞은 위치로 옮겨서 순서대로 정렬하는 정렬 알고리즘 배열의 가장 작은 값을 찾아 맨 처음 요소와 위치를 변경하는 작업을 반복하여 정렬을 수행 같은 값이 있을 경우 상대적인 위치가 변경될 수 있어 안전하지 않음 배열의 크기를 알고 있기 때문에 이동 횟수를 미리 알 수 있다는 장점이 있음 단순 선택 정렬이란 단순 선택 정렬이란 가장 작은 요소부터 선택해 알맞은 위치로 옮겨서 순서대로 정렬하는 정렬 알고리즘이다. 어떤 배열이 있을 때, 배열의 가장 작은 값을 찾아 맨 처음 요소와 위치를 변경하는 작업을 반복하여 정렬을 수행한다. 배열에서 가장 작은 값 1을 찾아 0번째 인덱스 6과 위치를 교환한다. 1번째..

[Algorithm] C - 하노이의 탑(Towers Of Hanoi) [내부링크]

하노이의 탑(Towers Of Hanoi) 요약 큰 원반이 아래에서 차례로 위치할 수 있고, 최소한의 횟수로 마지막 기둥으로 원반을 옮기는 문제 가장 큰 원반을 제외하고 나머지 원반을 그룹으로 묶어 문제 해결에 접근 그룹은 원반 개수의 N - 1 하노이의 탑(Towers Of Hanoi)이란 하뇌의 탑은 작은 원반이 위에, 큰 원반이 아래에 위치할 수 있도록 원반을 3개의 기둥 사이에서 옮기는 문제이다. 모든 원반는 크기가 다르고 처음에는 모든 원반이 이 규칙에 맞게 첫 번째 기둥에 쌓여 있다. 이 상태에서 모든 원반을 세 번째 기둥으로 최소한의 횟수로 옮기는 문제이며, 원반은 1개씩만, 큰 원반을 작은 원반위에 쌓을 수 없다. 문제를 해결하기 위해 가장 큰 원반을 제외하고, 나머지 원반을 그룹으로 묶어..

[Algorithm] C - 재귀함수(Recursion) [내부링크]

재귀(Recursive)란 어떤 사건이 자기 자신을 포함하고 다시 자기 자신을 사용하여 정의될 때 재귀적 이라고 한다. 쉽게 말해서 자기 자신을 포함한 것이라고 쉽게 생각할 수 있다. 프로그래밍에서 재귀란 하나의 함수에서 자신을 다시 호출하여 작업을 수행하는 방식으로 주어진 문제를 푸는 방법을 말한다. 재귀를 효과적으로 사용하면 프로그램을 간결하게 작성할 수 있다. 재귀적 정의에 의해 무한으로 존재하는 자연수를 아래의 두 조건으로 정의할 수 있다. 1은 자연수이다. 자연수 n의 바로 다음 수도 자연수이다. 팩토리얼(Factorial) 팩토리얼이란 한글로 계승 또는 순차곱셈이라고 하며, 1에서 시작하여 어떤 범위에 있는 모든 정수를 곱하는 것을 의미한다. 팩토리얼 예제는 재귀함수의 예제로 많이 사용한다. ..

[Algorithm] C - 큐(Queue) [내부링크]

요약 링 버퍼 큐 복잡도 : O(1) 배열 큐 복잡도 : O(n) 가장 먼저 넣은 데이터를 가장 먼저 꺼내는 선입선출 구조인 FIFO(First In - First Out) 구조를 따름 큐에 데이터를 넣는 작업을 인큐(Enqueue), 또는 스택과 같이 푸쉬(Push)라고 함 큐에서 데이터를 꺼내는 작업을 디큐(Dequeue) 또는 스택과 같이 팝(Pop)이라고 함 데이터를 꺼내는 쪽을 프론트(Front), 데이터를 넣는 쪽을 리어(Rear)라고 함 링 버퍼는 배열의 처음과 끝이 연결되어 있는 구조로, 배열 요소를 앞쪽으로 옮기지 않아도 되어 좀 더 효율적인 구조로 사용 가능 일반 배열로 사용하는 큐로 구현 시 배열 요소를 앞쪽으로 옮겨야 하는 작업이 필요 큐(Queue)란 큐란 스택과 비슷한 자료구조로..

[Algorithm] C - 버블 정렬(Bubble Sort) [내부링크]

버블 정렬(Bubble Sort) 요약 시간 복잡도 : O(n) = n ^ 2 인접한 두 요소의 대소 관계를 비교하여 반복 교환 시간 복잡도가 느리지만, 코드가 단순하여 구현이 쉬워 자주 사용 요소의 개수가 n개인 배열에서 n - 1회 비교, 교환을 하고 나면 가장 작은 요소가 맨 처음 또는 끝으로 이동 비교, 교환 과정을 패스라고 함 버블 정렬이란 인접한 두 요소의 대소 관계를 비교하여 교환을 반복하는 것을 말한다. 시간 복잡도가 상당히 느리지만, 코드가 단순하여 구현이 쉽기 때문에 자주 사용된다. 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 버블 이라는 이름이 붙었다. 버블 정렬은 정렬을 앞에서 시작할 수도 있고, 뒤부터 시작할 수도 있지만, 요소의 끝부터 확인하고 정렬해야 한다..

[Algorithm] C - 스택(Stack) [내부링크]

요약 데이터를 일시적으로 저장히기 위해 사용하는 자료구조로 한 곳에서만 입출력이 일어남 먼저 들어간 데이터는 마지막에 나오는 FIFO 구조 (First In - Last Out) 마지막에 들어간 데이터는 먼저 나오는 LIFO 구조 (Last In - First Out) 데이터를 담는 행위를 Push, 데이터를 추출하는 행위를 Pop이라고 함 중요 구조체 멤버로 저장할 메모리 공간, 현재 가리키는 위치, 최대 사이즈 3가지가 필요 스택(Stack)이란 스택은 바닥에서 부터 데이터를 쌓아 올리는 자료구조의 일종이며, 스택의 입/출력은 오로지 꼭대기에서만 이루어진다. 가장 먼저 들어간 데이터는 가장 나중에 나오는 구조이고(FILO First In - Last Out), 가장 마지막에 들어간 데이터는 가장 먼저..

[Algorithm] C - 환형 더블 링크드 리스트(Circular Double Linked List) [내부링크]

환형 링크드 리스트(Circular Linked List) 요약 더블 링크드 리스트와 동일하며, 다른 점은 헤드와 테일이 연결되어 있음 테일은 자신의 nextNode로 헤드를 가리키고, 헤드는 prevNode로 테일을 가리킴 리스트의 시작과 끝을 미리 알 수 있음 환형 링크드 리스트(Circular Linked List)란 환현 링크드는 헤드와 테일이 연결되어 있는 리스트 구조를 말한다. 테일은 자신의 nextNode로 헤드를 가리키고, 헤드는 prevNode로 테일을 가리킨다. 환형 링크드 리스트의 가장 큰 장점은 리스트의 시작과 끝을 미리 알 수 있다는 부분이다. 이러한 장점으로, 더블 링크드의 삽입 함수와 같은 부분의 성능을 많이 개선할 수 있다. 또한 노드를 뒤에서 역순으로 찾아나갈 수 있는 탐색..

[Algorithm] C - 더블 링크드 리스트(Double Linked List) [내부링크]

요약 링크드 리스트의 문제였던 탐색 문제를 개선한 링크드 리스트 자료구조 첫 데이터를 헤드, 끝 데이터를 테일, 각 데이터를 노드라고 부름 각 노드의 다음 노드 주소와 이전 노드 주소 양 방향을 관리 노드가 앞 뒤 양 방향을 다루므로 접근은 용이하나 삭제 등에서 각각 전부 삭제해 주어야 함 데이터의 접근이 어려우나, 생성, 소멸, 삭제 등은 쉬움 더블 링크드 리스트(Double Linked List)란 더블 링크드 리스트란 링크드 리스트의 탐색 기능을 개선한 자료구조이다. 기존 링크드 리스트에서 탐색을 하기 위해 헤드에서 테일 방향으로의 노드를 모두 거쳐야 했다. 이러한 불편함을 더블 링크드 리스트 구조에선 헤드 -> 테일 및 테일 -> 헤드 방향, 즉 양방향 탐색이 가능하도록 개선했다. 양방향 탐색이 ..

[Algorithm] C - 링크드 리스트(Linked List) [내부링크]

요약 배열의 반대 개념으로, 데이터의 크기를 유연하게 변경할 수 있음 첫 데이터를 헤드, 끝 데이터를 테일, 각 데이터를 노드라고 부름 다음 노드의 주소를 이전 노드의 저장하여 다음 노드의 주소로 접근 데이터의 접근이 어려우나, 생성, 소멸, 삭제 등은 쉬움 장점 새로운 노두의 추가, 삽입, 삭제가 쉽고 빠름. (배열은 새로운 요소를 삽입하거나 삭제를 하기 어려움) 현재 노드의 다음 노드를 얻어오는 연산에 대해 비용이 발생하지 않음 단점 다음 노드를 가리키려는 포인터 때문에 각 노드마다 추가적인 메모리가 필요함 특정 위치에 있는 노드에 접근하기 위한 비용이 크며 접근하기 까지 시간이 많이 필요함 (노드에 접근하기 위해 N - 1회의 접근이 필요함) 리스트란 리스트는 이름과 같이 목록 형태로 이루어진 데이..