c언어 포인터 이용하여 여러 가지 문제 풀어보기(영상 처리 하기, 자율 주행 시뮬레이션 구현하기)
네 안녕하세요, 이번 포스팅에서는 우리가 배운 포인터를 이용하여
여러 가지 문제들을 풀어보는 시간을 가져보도록 하겠습니다.
포인터도 계속 쓰는 습관을 들여야 자유자재로 쓸 수 있는 것이기 때문에 항상 연습을 해야 합니다.
그럼 지금부터 문제 풀이 시작하도록 하겠습니다.
1. 영상 처리 하기
첫 문제는 영상 처리를 해볼 겁니다.
c언어의 객체 지향 언어인 c++에서 보통 많이 합니다.
'클래스'라는 객체를 만들어서 그 안에 사용자 정의 함수를 상속시켜 뭉텅이로 돌리는 프로그래밍 언어입니다.
그 대표적인 예시로 파이썬과 자바가 있지요.
그리고 객체 지향 언어를 입문할 때는 파이썬으로 주로 많이 합니다.
파이썬이 명령어가 되게 직관적이기 때문에 알아보기 쉽고, 여러 가지 모듈들과 프레임워크들이
잘 짜여져 있기 때문입니다.
그래서 c언어는 컴파일 언어인 만큼, 영상 처리 자체를 할 수는 있으나, 객체 지향 언어들만큼이나
빠르다던지, 디테일한 부분들까지 구현을 하기에는 한계가 있다 보니,
맛보기로 우리가 보는 영상이 어떤 식으로 구성이 되어있는지 알아보는 시간을 가져보도록 하겠습니다.
1 - 1. 영상이란?
영상은 우리가 흔히 말하는 이미지, 동영상을 말합니다.
이를 다른 말로 정적 영상, 동적 영상이라고 표현하기도 하죠.
그리고 이들은 하나의 큰 이진수로 이루어져 있는 객체입니다.
그래서 영상의 다른 명칭은 '큰 이진 객체'(Big Bianry Object, a.k.a BLOB)이라고 합니다.
그래서 실제로 데이터베이스를 할 때 이미지를 처리하고 싶다면 자료형을 'BLOB'형으로 지정을 합니다.
그래서 객체를 다루는 것이기 때문에 앞서 말했듯이 컴파일 언어로 하는 것이 아니라 객체 지향 언어로 하는 게
좀 더 좋다고 이야기를 한 것입니다.
그럼 지금부터 간단한 예제를 한 번 작성을 해보도록 하겠습니다.
#include <stdio.h>
#define SIZE 5
void print_img(int img[SIZE][SIZE]);
void bright_img(int img[SIZE][SIZE]);
int main()
{
int img[SIZE][SIZE] =
{
{10, 20, 30, 40, 50},
{10, 20, 30, 40, 50},
{10, 20, 30, 40, 50},
{10, 20, 30, 40, 50},
{10, 20, 30, 40, 50}
};
print_img(img);
bright_img(img);
print_img(img);
return 0;
}
void print_img(int img[SIZE][SIZE])
{
int r, c;
for(r = 0; r < SIZE; r++)
{
for(c = 0; c < SIZE; c++)
{
printf("%03d ", img[r][c]);
}
printf("\n");
}
printf("\n");
}
void bright_img(int img[SIZE][SIZE])
{
int r, c;
int *p;
p = &img[0][0];
for(r = 0; r < SIZE; r++)
{
for(c = 0; c < SIZE; c++)
{
*p += 10;
p++;
}
}
}
이렇게 한 번 작성을 해봤습니다.
그럼 결과를 한 번 보도록 하겠습니다.
010 020 030 040 050
010 020 030 040 050
010 020 030 040 050
010 020 030 040 050
010 020 030 040 050
020 030 040 050 060
020 030 040 050 060
020 030 040 050 060
020 030 040 050 060
020 030 040 050 060
이렇게 이미지의 원래 형태를 뽑아냈습니다.
실제로 이미지는 이런 식으로 이진수로 이루어져 있습니다.
그리고 여기에 부합되는 형태가 픽셀 단위로 구성이 되어 있는 것이죠.
컴파일 언어인 c언어로는 모든 걸 보여주기에는 한계가 있기 때문에 형태만 보여드린 점 양해 부탁드립니다.
2. 자율 주행 시뮬레이터 구현하기
이 역시 전문적인 수준은 아니지만, 한 번 간단히 어떤 식으로 구현을 할 수 있는지 직접 작성을 해보도록 하겠습니다.
요즘 자동차는 사방에 센서가 다 달려있어서 사방에서 통신이 가능하죠?
그런데 그렇게 하면 구현이 어려워질 수 있어서 차의 정면, 좌측, 우측 센서를 가지고서 한 번 코드를 만들어보도록 하겠습니다.
그럼 한 번 작성해보도록 하겠습니다.
#include <stdio.h>
void getSensorData(double *p);
int main()
{
double sensorData[3];
getSensorData(sensorData);
printf("왼쪽 센서와 장애물과의 거리 : %lf\n", sensorData[0]);
printf("정면 센서와 장애물과의 거리 : %lf\n", sensorData[1]);
printf("오른쪽 센서와 장애물과의 거리 : %lf\n", sensorData[2]);
return 0;
}
void getSensorData(double *p)
{
p[0] = rand() % 100;
p[1] = rand() % 100;
p[2] = rand() % 100;
return;
}
이렇게 한 번 작성을 해봤습니다.
정말 간단하게 만들었습니다.
실제 센서를 조절하기 위해 코드를 짜면 이거보다 더 복잡하게 짜이겠지만,
지금 당장은 어떤 형태를 갖췄는지 보기 위해 약식으로 짠 것이니, 이런 형태로 생겼다 정도만 알고 계시면 됩니다.
그럼 결과를 한 번 보도록 하겠습니다.
왼쪽 센서와 장애물과의 거리 : 41.000000
정면 센서와 장애물과의 거리 : 67.000000
오른쪽 센서와 장애물과의 거리 : 34.000000
결과도 문제없이 잘 나온 것을 확인하실 수 있습니다.
다음 포스팅부터는 문자와 문자열에 대하여 알아보는 시간을 가지도록 하겠습니다.
긴 글 읽어주신 독자분들께 진심으로 감사드립니다~
'c언어' 카테고리의 다른 글
c언어 문자 입출력 라이브러리에 대하여 알아보기 (0) | 2022.12.22 |
---|---|
c언어 문자와 문자열에 대하여 알아보기 (0) | 2022.12.20 |
c언어 포인터 사용의 장점에 대하여 알아보기 (0) | 2022.12.10 |
c언어 포인터와 배열과의 관계 알아보기(배열의 이름과 포인터의 관계, 포인터를 배열처럼 사용하기, 배열 매개 변수) (0) | 2022.12.07 |
c언어 포인터와 함수와의 관계 알아보기(값에 의한 호출(call - by- value, 참조에 의한 호출(call - by - reference), swap(), scanf(), 포인터를 사용하는 반환 값) (0) | 2022.12.07 |
댓글