C에서 C++로
입출력 #include int main(void) { // 출력 std::cout
- 프로그래밍 언어/C++
- · 2022. 12. 24.
이미지 행렬의 이동, 확대, 축소 등 기하학적 변환에 대해 다룬다. C++로 작성한 OpenCV 코드를 사용한다. 원본 이미지 좌표는 $(x, y)$로, 변환된 이미지 좌표는 $(x',y')$로 표현한다. 간결한 코드를 위해 네임스페이스를 생략하며, 이미지를 읽는 과정도 생략한다. 코드에서 img는 원본 이미지, dst는 변환된 이미지이다.OpenCV는 warpAffine과 perspectiveTransform 메서드를 지원한다.warpAffine: 어파인 변환 행렬을 이용perspectiveTransform: 투시 변환 행렬을 이용이동 변환이동(translation) 변환은 이미지 좌표를 x, y 방향으로 이동(shift)한다. 평행 이동은 간단한 덧셈으로 구현 가능하다.$$x' = x + \bigtr..
본 글은 이미지 간 덧셈과 뺄셈에 대해 다룬다. C++로 작성한 OpenCV 코드를 활용한다.오버랩먼저 이미지 간 덧셈에 대해 살펴보자. 두 이미지($X$)를 더하면 이미지가 겹쳐진 형태로 표현된다. 하지만 단순히 더하면 값이 범위를 넘어서면서 정보가 손실된다. 이미지 픽셀은 0 ~ 255 범위를 가지기 때문에 255를 넘는 정보는 모두 255로 표현된다. 참고로 정보가 손실된다는 표현이 이해되지 않는다면 saturate에 대해 읽어보자.따라서 값이 커지는 것을 막기 위해 가중합(weighted sum)을 사용한다.$$X = \sum{X_i \cdot w_i} + b$$예를 들어, 이미지 $X_1$와 $X_2$를 더한다면 $0.5X_1 + 0.5X_2$를 할 수 있다. $X_1$ 이미지를 강조하고 싶다면..
이미지 명도(brightness)와 대비(contrast)를 조절하는 수치 연산을 설명한다. C++로 작성한 OpenCV 코드를 사용한다.명도명도는 이미지의 밝기이다.$$X = saturate(X + n)$$grayscale 이미지($X$)는 0 ~ 255 값으로 이루어진 2차원 행렬이다. 0에 가까울수록 어둡고, 255에 가까울수록 밝다. 따라서 행렬 각 원소에 대해 값을 더하거나 빼는 방법을 이용해 밝기를 조절한다. 여기서 saturate 연산은 값이 0보다 작으면 0으로, 255보다 크면 255로 범위를 조정하는 함수다. 픽셀 값은 unsigned char로 항상 0 ~ 255 사이 값을 가지기 때문에 반드시 saturate 연산을 거쳐야 한다.using namespace cv;Mat src = ..
C언어의 기본 문법이나 OOP(객체지향)에 대한 기본 개념을 알고 있다는 전제로 작성된 글이다. 예제 코드의 간결함을 위해 아래 내용은 생략하고 기록하였다. #include using namespace std; C → C++ // C++ struct Sample { int id; char name[10]; }; /* C typedef struct { int id; char name[10]; } Sample; */ int main(void) { Sample sample = { 1, "DeneV" }; cout
입출력 #include int main(void) { // 출력 std::cout
Name Space namespace는 특정 영역을 분리하는 식별자 역할을 한다. 데이터의 범위를 단순히 전역·지역으로 나누지 않고 namespace를 이용해 구체적으로 지정해 줄 수 있다. namespace test1 { void HelloWorld(void); } namespace test2 { void HelloWorld(void); } test1과 test2라는 독립된 공간을 만들어 HelloWorld라는 같은 이름의 함수가 충돌하지 않도록 분리해 주었다. test1과 test2는 각각의 공간을 식별해주는 namespace가 된다. test1::HelloWorld namespace::함수/변수의 형태로 특정 namespace 내의 데이터를 정의하거나 불러온다. 예시: namespace로 분리하기 ..