KITTI 데이터 사용하기 (LiDAR-카메라 변환)

영상처리 2023. 4. 16. 12:47

최근에 LiDAR 데이터를 사용할 필요가 있어서, 테스트 목적으로 KITTI 데이터셋을 받아보았다. 최종 목적은 LiDAR 데이터를 카메라 이미지에 매핑해서 영상과 함께 거리값을 이용하는 것이다. 그런데, LiDAR를 처음 사용하다 보니 LiDAR 데이터 포맷도 모르겠고,  KITTI에서 제공하는 캘리브레이션 정보도 어떻게 해석해야 할지 모르겠다. 그래서, 여기 저기 검색해 보고 테스트해 보면서 나름 파악한 내용을 정리해 본다.

 

1.  LiDAR 데이터 포맷

 

KITTI에서 제공하는 LiDAR 데이터는 64채널 Velodyne 센서(HDL-64E) 데이터로서 확장자가 *.bin이다. 처음에는 거리값들이 순서대로 저장되어 있나 했는데, 그건 아니고 ray의 끝 점 (x, y, z) 좌표와 반사도(reflectance) 값이 순서대로 저장되어 있다. 각각의 데이터 값은 float 타입으로 4 byte를 차지한다.

 

그림1. LiDAR bin 파일 데이터 포맷

LiDAR 좌표계 기준은 LiDAR 센서 중심이 원점 (0, 0, 0)이고 전방(front)이 x축, 왼쪽이 y축, 상단(하늘 방향)이 z축이다. 센서 장착 위치 및 좌표축 방향은 KITTI Sensor Setup 페이지에 그림으로 잘 설명되어 있다.

 

이제 bin 파일을 실제 Matlab으로 불러서 가시화해 보자. Matlab 예제 코드 및 실행 결과는 다음과 같다. 샘플 데이터로는 KITTI 데이터셋 중에서 가장 용량이 적은 road dataset을 이용하였다.

 

fid = fopen('data_road/training/velodyne/uu_000024.bin', 'r');
data = fread(fid,'single');
fclose(fid);
data = reshape(data,4,[])' ;
pcshow(data(:,1:3));

 

코드에서 'single'은 단정밀도(single precision) 부동소수점으로 데이터를 읽는다는 의미이다. 실행하면 다음과 같이 멋진 lidar 데이터를 볼 수 있다.

그림2. LiDAR 데이터 가시화

 결과를 보면, 360도 전방향에 대해 데이터가 기록된 것임을 알 수 있다. 참고로, Velodyne HDL-64E의 수평시야각은 360도, 수직시야각은 26.8도이다. 개인적으로 내부 데이터를 분석해 보니 맨 위쪽 스캔라인(scane line) 정면방향부터 시작해서 반시계방향으로 회전하면서 맨 아래쪽 스캔라인까지 데이터가 순차적으로 기록되어 있다.

 

그리고, 위 LiDAR 데이터에 대응되는 이미지와 비교해 보면 가시화가 제대로 되었다는 것을 확인할 수 있다.

그림3. data_road/training/image_2/uu_000024.png

 

2.  LiDAR - 카메라 매핑

 

LiDAR 데이터를 카메라 이미지에 매핑하기 위해서는 둘 사이의 캘리브레이션 관계를 이해해야 한다. KITTI 데이터셋에는 센서간 캘리브레이션 파일이 같이 제공되는데, 예를 들어, 'data_road/training/calib/uu_000024.txt' 파일의 내용은 다음과 같다.

 

P0: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 0.000000000000e+00 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P1: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 -3.875744000000e+02 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 0.000000000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 0.000000000000e+00
P2: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 4.485728000000e+01 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 2.163791000000e-01 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 2.745884000000e-03
P3: 7.215377000000e+02 0.000000000000e+00 6.095593000000e+02 -3.395242000000e+02 0.000000000000e+00 7.215377000000e+02 1.728540000000e+02 2.199936000000e+00 0.000000000000e+00 0.000000000000e+00 1.000000000000e+00 2.729905000000e-03
R0_rect: 9.999239000000e-01 9.837760000000e-03 -7.445048000000e-03 -9.869795000000e-03 9.999421000000e-01 -4.278459000000e-03 7.402527000000e-03 4.351614000000e-03 9.999631000000e-01
Tr_velo_to_cam: 7.533745000000e-03 -9.999714000000e-01 -6.166020000000e-04 -4.069766000000e-03 1.480249000000e-02 7.280733000000e-04 -9.998902000000e-01 -7.631618000000e-02 9.998621000000e-01 7.523790000000e-03 1.480755000000e-02 -2.717806000000e-01
Tr_imu_to_velo: 9.999976000000e-01 7.553071000000e-04 -2.035826000000e-03 -8.086759000000e-01 -7.854027000000e-04 9.998898000000e-01 -1.482298000000e-02 3.195559000000e-01 2.024406000000e-03 1.482454000000e-02 9.998881000000e-01 -7.997231000000e-01
Tr_cam_to_road: 9.999069316651e-01 1.126439637474e-02 -7.700846908379e-03 -1.756802998348e-02 -1.132554323887e-02 9.999042860338e-01 -7.943238435040e-03 -1.626967196797e+00 7.610633921140e-03 8.029712858942e-03 9.999387540998e-01 2.839303758772e-01

 

내용을 보면 4개의 projection 행렬(P0, P1, P2, P3)과 1개의 rectification 행렬(R0_rect), 그리고 3개의 Tr 행렬이 제공된다.  KITTI Sensor Setup에 보면 Cam0, Cam1, Cam2, Cam3 총 4대의 카메라가 일렬로 나란히 배치되어 있는데, 이들 카메라 의 projection 행렬이 각각 P0, P1, P2, P3이다. 이들 중 가장 기본이 되는 카메라는 Cam2이며, 샘플로 다운로드 받은 road dataset에서도 Cam2를 사용하기 때문에 여기서는 P2만 사용하면 된다.

 

☞참고로, 카메라의 projection 행렬은 3D 월드좌표를 이미지 픽셀 좌표로 변환해주는 행렬을 의미한다. 3D 월드좌표 (X, Y, Z)가 있을 때, [R|t]를 곱해서 카메라좌표계로 변환한 후 이미지 평면에 투영하면 픽셀좌표 (x, y)가 얻어지는데, 이를 행렬 연산으로 표현하면 s[x y 1] = K[R|t][X Y Z 1]가 된다. 여기서, 3 x 4 행렬 P = K[R|t]를 카메라의 projection matrix라 부른다 (K는 3 x 3 camera matrix, R은 3 x 3 rotation matrix, t는 3 x 1 translation vector).

 

캘리브레이션 파일 내용에 보면 P2에 대해 "P2: p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12"와 같이 총 12개의 실수값이 저장되어 있는데, P2 = [p1 p2 p3 p4; p5 p6 p7 p8; p9 p10 p11 p12]와 같은 식으로 3 x 4 projection 행렬을 만들면 된다.

 

LiDAR 데이터를 카메라 이미지에 매핑하기 위해서는 1) LiDAR 좌표를 기준 좌표계로 변환한 후, 2) rectification을 수행, 3) 카메라 projection 행렬(여기서는 P2)을 이용해서 이미지에 투영하는 과정을 거친다. LiDAR 좌표가 (X, Y, Z)라면 Cam2로의 매핑 변환식은 다음과 같다 (만일, Cam1으로의 매핑이라면 P2만 P1으로 바꾸면 된다).

 

s(x, y, 1) = P2 * R0_rect * Tr_velo_to_cam * (X, Y, Z, 1)

 

먼저, Tr_velo_to_cam은 LiDAR 좌표를 기준 좌표계(reference coordinate)로 변환해주는 3 x 4 변환행렬로서, LiDAR 센서와 기준 좌표계 카메라와의 [R|t] 관계를 나타낸다. KITTI Sensor Setup 그림에 보면, Cam0가 기준 좌표계 카메라인 것으로 보인다. 다음으로, R0_rect를 곱해주는 rectification 과정이 조금 이해가 어려울 수 있다. R0_rect는 Cam0를 최종적인 월드평면으로 회전시켜주는 3 x 3 회전변환 행렬이다. KITTI Sensor Setup 그림에 보면 카메라 4대가 스테레오 카메라처럼 일렬로 나란히 배치된 것을 볼 수 있다. 스테레오 연산을 위해서는 이 4대의 카메라들이 모두 동일한 월드평면에 align이 되어야 하는데, Cam0를 이 월드평면에 align시켜주는 행렬이 R0_rect이다. R0_rect까지 곱해지고 나면 최종적인 월드좌표가 나오며 이 월드좌표를 각 카메라에 투영하면 카메라의 이미지 좌표가 얻어진다.

 

☞ 위 식에서 R0_rect * Tr_velo_to_cam * (X, Y, Z, 1)까지 계산하면 3 x 1 벡터(변환된 3차원 좌표)가 얻어진다. 여기에 3 x 4 행렬인 P2를 적용하기 위해서는 좌표의 끝에 1을 덧붙인 homogeneous 좌표로 변환한 후에 P2를 곱해야 한다. 또는 아래 Matlab 코드처럼 R0_rect를 4 x 4 행렬로 확장해도 동일한 효과를 얻는다 (확장된 원소값을 모두 0으로 설정하고, 마지막 4행 4열 원소만 1로 설정)

 

Matlab을 이용하여 KITTI 캘리브레이션 파일을 읽고, parsing하며, 이미지에 매핑하는 코드를 아래와 같이 작성해 보았다.

 

clear all; close all;

% read calibration file and parse the matrices
fid = fopen('data_road/training/calib/uu_000024.txt');
P0 = sscanf(fgetl(fid), 'P0: %f %f %f %f %f %f %f %f %f %f %f %f');
P1 = sscanf(fgetl(fid), 'P1: %f %f %f %f %f %f %f %f %f %f %f %f');
P2 = sscanf(fgetl(fid), 'P2: %f %f %f %f %f %f %f %f %f %f %f %f');
P3 = sscanf(fgetl(fid), 'P3: %f %f %f %f %f %f %f %f %f %f %f %f');
R0_rect = sscanf(fgetl(fid), 'R0_rect: %f %f %f %f %f %f %f %f %f');
Tr_velo_to_cam = sscanf(fgetl(fid), 'Tr_velo_to_cam: %f %f %f %f %f %f %f %f %f %f %f %f');
Tr_imu_to_velo = sscanf(fgetl(fid), 'Tr_imu_to_velo: %f %f %f %f %f %f %f %f %f %f %f %f');
Tr_cam_to_road = sscanf(fgetl(fid), 'Tr_cam_to_road: %f %f %f %f %f %f %f %f %f %f %f %f');
fclose(fid);

Tr = [reshape(Tr_velo_to_cam, 4, [])'; 0 0 0 1];
R0 = eye(4);
R0(1:3,1:3) = reshape(R0_rect, 3, [])';
P = reshape(P2, 4, [])';

% read image
img = imread('data_road/training/image_2/uu_000024.png');
imshow(img);

% read LiDAR data
fid = fopen('data_road/training/velodyne/uu_000024.bin', 'r');
data = fread(fid,'single');
fclose(fid);
data = reshape(data,4,[])';
figure;pcshow(data(:,1:3));

% mapping to image
XYZ1 = [data(:,1:3)'; ones(1,size(data,1))];
xy1 = P*R0*Tr*XYZ1;
s = xy1(3,:);
x = xy1(1,:)./s;
y = xy1(2,:)./s;
figure; plot(x,y,'.');
ax = gca;
ax.YDir = 'reverse';
img_h = size(img, 1);
img_w = size(img, 2);
xlim([1 img_w]);
ylim([1 img_h]);

 

실행해 보면 다음과 같이 LiDAR 데이터를 이미지 평면에 투영한 결과를 얻을 수 있는데, 뭔가 조금 이상하다.

그림4. LiDAR 데이터의 이미지 투영 1

원인이 무엇일까 생각해 보니, 후방에 있는 LiDAR 데이터가 이미지 평면 뒷편에서 투영되었기 때문이다. 이 경우는 depth 성분인 s가 음수인 경우이기 때문에, s > 0인 경우로 투영을 한정하면 문제를 해결할 수 있다. 수정된 코드 및 결과는 다음과 같다.

 

% mapping to image
XYZ1 = [data(:,1:3)'; ones(1,size(data,1))];
xy1 = P*R0*Tr*XYZ1;
s = xy1(3,:);
x = xy1(1,:)./s;
y = xy1(2,:)./s;
k = find(s>0);
figure; plot(x(k),y(k),'.');
ax = gca;
ax.YDir = 'reverse';
img_h = size(img, 1);
img_w = size(img, 2);
xlim([1 img_w]);
ylim([1 img_h]);

 

그림5. LiDAR 데이터의 이미지 투영 2

 

이제 정상적으로 매핑된 것을 볼 수 있다. 마지막으로 실제 이미지에 LiDAR를 투영해 보면 아래 그림과 같은 결과를 얻을 수 있다.

 

% mapping to image
img_mapped = img;
img_h = size(img, 1);
img_w = size(img, 2);
XYZ1 = [data(:,1:3)'; ones(1,size(data,1))];
xy1 = P*R0*Tr*XYZ1;
s = xy1(3,:);
x = xy1(1,:)./s;
y = xy1(2,:)./s;
for i=1:length(s)
    ix = int32(x(i) + 0.5);
    iy = int32(y(i) + 0.5);
    if (s(i)<=0 || ix<=0 || ix>img_w || iy<=0 || iy>img_h)
        continue;
    end
    img_mapped(iy, ix, :) = [0 255 0];
end
figure; imshow(img_mapped);

 

그림6. LiDAR 데이터의 이미지 투영 (최종 결과)

☞ 처음에는 LiDAR - 카메라간 매핑 관계만 있으면, 이미지의 모든 픽셀에 대해 depth를 구할 수 있을 것이라 생각했다. 그러나, 그림 6에서 보는 것처럼 LiDAR 데이터는 sparse하기 때문에 LiDAR가 매핑되는 픽셀에 대해서만 depth를 구할 수 있다. 그외 픽셀에 대해서는 보간(interpolation) 등의 방법을 사용할 수 있을 것이다. 그러나, 이미지 윗부분처럼 매핑된 LiDAR 데이터가 아에 없는 영역에 대해서는 depth를 전혀 구할 수 없다.

 

by 다크 프로그래머

'영상처리' 카테고리의 다른 글

Fourier Transform(푸리에 변환)의 이해와 활용  (146) 2017.09.27
색의 항상성(Color Constancy)의 이해  (39) 2017.04.26
precision, recall의 이해  (70) 2017.01.02

수학 과외

수학 이야기 2022. 6. 22. 17:51

큰 아이의 수학 점수가 바닥을 긴다는 아내의 첩보를 접하고 심각한 고민에 빠졌다. 그 동안은 (가만 두면 지가 알아서 다 할거라는) 내 말만 믿고 학원도 보내지 않았는데, 이제 어떡하면 좋냐고 그런다.

 

아내가 아이를 살살 꼬셔서 서점에서 수학 문제집 하나는 사다가 놓았지만, 몇 주째 책상 위에서 먼지만 날리고 있다. 그렇다고 애를 억지로 앉혀놓고 수학을 가르치는 것은 섶을 지고 불에 뛰어드는 격이라 해서는 안된다. 아내의 무언의 눈빛도 있고 왠지 모를 압박감에 며칠 동안 좌뇌와 우뇌를 굴린 결과 한 가지 방안을 생각해 내었다. 아이와 함께 아이의 친한 친구를 불러서 둘을 같이 가르치는 것이다. 아이에게 물어보니 그건 아이도 좋다고 한다. 아이 친구도 OK를 해서 그쪽 부모님께도 확인을 받은 후 수학과외를 시작하게 되었다.

 

교재는 한달 전쯤 아내가 사다 놓았던 그 문제집이다. 당장 이번 주부터 수업이라 빼도 박도 못하고 문제집을 이리 뒤척 저리 뒤척이고 있는데, 갑자기 후회가 물밀듯이 몰려든다. 이제 물 마시러 가기도 귀찮은 나이인데 내가 이걸 왜 한다고 했을까 싶고 애들을 어떻게 지도해야 할지 난감하기만 하다. 옛날에 대학 다닐 때 학생들을 가르치긴 했었지만 수십년도 더 지난 일이다. 그래도 이왕 하기로 한 거 마음을 다잡고 계획표도 짜고 수업 전략도 짜 본다.

 

먼저 수업계획표에서는 수업의 목표와 수업 중 같이 지켜야할 사항을 정해 보았다. (첫날 아이들에게 프린트로 나눠줌)

                                                    XX 수학방

- 목표: 수학이 재밌어지기

- 방훈
  • 아는~척 않기
  • 모르는~척 않기
  • 공부하는~척 하기

방훈은 매 수업 시작할 때 아이들에게 선창하게 한다. 그리고, 아이들에게 말하지 않은 나만의 방훈이 있는데, 그건 '평가하지 않기'이다. 참고로 아이들은 중학생이다.

 

수업 진행은 먼저 지난 시간에 배운 주요 개념을 확인(되새김)한 후 숙제 확인을 한다. 숙제 확인은 각자 숙제로 풀어온 문제들 중에서 틀렸거나 잘 모르겠다고 체크해 온 문제들을 서로 비교하는 것이다. 그래서, 차이가 나는 경우에는 잘 풀어온 친구보고 앞에 나가서 본인이 어떻게 풀었는지 설명해 달라고 한다. 앞에 미니칠판을 하나 놓고 수업을 하는데, 문제 풀이를 알려달라고 하면 자꾸 나에게 설명하려고 한다. 그러면, '아니야, 친구에서 설명해 주는거야.' 하고 정정해 준다. 그리고, 문제를 체크해 온 아이에게는 친구의 설명을 잘 들어보라고 한다. 둘다 모르겠다고 체크한 문제에 대해서는 내가 설명해 준다.

 

숙제 맞춰보고 서로 설명해 주고, 또 오늘 배울 개념 설명하고 한 두 문제 풀어주다 보면 한 시간이 어떻게 가는지 모르게 금방 간다. 수업은 일주일에 딱 1시간만 하기로 해서 수업하다가 1시간이 되면 무조건 멈추고 나머지 문제들은 모두 숙제로 내준다 (ㅋㅋ). 사실 내가 혼자 열심히 설명하고 문제를 풀어준다고 해서 애들에게 얼마나 도움이 되겠는가?

 

이제 수업을 시작한지는 한 달쯤 지났다. 한 달쯤 지켜보니 두 아이의 특성이 확연히 다름이 느껴진다. 한 아이는 학원을 많이 다녔고 지금도 다니고 있다. 그래서인지 대부분의 문제를 이미 알고 있고 문제 풀이도 제법 잘 해낸다. 하지만 개념을 설명해 보라든가 친구에게 문제풀이를 설명해 주라고 하면 당황해하고 어려워한다. 반면에 한 아이는 학원을 다닌 적이 없고 문제를 효과적으로 푸는 방법도 잘 모른다.  하지만 개념을 설명하거나 본인이 이해한 문제에 대해서는 설명을 잘 해낸다. 두 아이 모두 내게는 숙제이다. 첫 번째 아이는 익숙함 속에서 의문을 갖도록 하는 게 숙제이다. 그리고 두 번째 아이에게는 개념만으로도 수학 문제 풀이가 가능하며 그 과정이 수학임을 느끼게 해 주고 싶다.

 

수업을 하면서 애들에게 해 준 말이 있다. '문제 많이 풀고 답 맞추는 것이 수학공부가 아니다. 문제를 풀기 위해서, 그리고 문제를 이해하기 위해서 생각하고 고민하는 시간이 진정한 수학 공부다'.

 

수업시간에 한 두 문제 더 푸는 것보다도 이런 것들을 애들에게 조금씩 느끼게 해 주고 싶다. 그러려면 나 자신부터 조급함을 버리고 여유를 가져야겠다는 생각을 해 본다..

 

다크 프로그래머

'수학 이야기' 카테고리의 다른 글

상관계수와 cross correlation  (6) 2021.09.12
벡터 외적을 이용한 직선의 교점 구하기  (0) 2020.09.10
구구단 암산법  (4) 2018.10.08

내 어깨 위 고양이, 밥

잡기장 2022. 5. 5. 11:56

아침에 일어나서 어제 보다 만 영화를 다시 봤다.

'내 어깨 위 고양이, 밥'

영화를 보고 나서 문득 내가 본 영화들을 블로그에 정리해 놓으면 좋겠다는 생각이 든다.

 

저녁에 특별히 할일 없이 한 두편 영화를 본 게 거진 10년이 된 것 같다. SF, 폭력, 로맨스, 일상, 스포츠, 애니메이션, 코미디, 드라마 가리지 않고 다 본다. 그 중에 어떤 것은 보고 잊어버리고 또 어떤 것은 여운이 남아서 굳이 다른 사람들이 쓴 감상평들을 뒤적여 본다.

 

보다 보니 안목이 생겨서인지 아니면 마음에도 나이가 들어서인지 가슴에 와 닿는 영화들이 많지는 않다. 갈수록 그렇다. 그래도 가끔 기억에 남는 영화들을 여기에 적어본다. 보면서 나도 모르게 빨려들고 보고 나서도 여운이 남는 영화들. 그냥 스스로 기록하는 의미로도 좋고, 누군가가 보고 공감해도 좋겠다.

 

그녀의 취미생활 (2023, 한국)

독립영화. 제작사나 외부 투자 자금 등의 자본이나 지원을 받지 않고 만드는 영화, 즉 독립 자본으로 만들고 싶은 내용을 만든 영화를 말한다고 한다. 섬세한 연출과 깊이있는 내용. 재미있게 보았다. 영화를 보며 ..., 시골 마을에서 젊은 여인이 자신을 지키며 혼자 살아간다는 것은 불가능하지 않을까 하는 생각이 들었다. 집단 사회의 암묵적인 묵인 속에서 공동체의 일원으로 같이 일을 하고 밥을 먹고, 일상을 살고 살아가야 하는 모습이 대비를 일으킨다.

 

로기완 (2024, 한국)

깊이가 있는 영화. 어머니의 죽음을 뒤로하고 벨기에에 난민신청을 한 탈북자 청년 기완. 말도 통하지 않는 낯선 땅 벨기에에서 겪고 살아내야 하는 과정이 그려진다. 영화의 마지막, 기완은 내가 원한 것은 이 땅에서 살 권리가 아니라 이 땅을 떠날 권리였다고 말한다. 영화속 내용과 연기가 영화로만은 느껴지지 않는 완성도가 높은 수작

 

더 써클 (2017, 미국)

두 번째로 본 영화. 인공지능이 일상화된 오늘날에 다시 보는 이 영화는 섬뜩함이 더해진다. 영화 외적으로 영화속 써클의 모든 기술발표 구성이 스티브 잡스의 발표에 견줄만큼 대단하다. 이 영화의 내용을 구성한 사람이 누군지 궁금해진다. 엄청난 천재가 작품을 만들다가 외부의 압력을 고려해 적당한 선에서 마무리한 느낌? 결말이 극적이진 않지만 영화에서 전달하고자 했던 것은 전달되었다고 생각된다.

 

오토라는 남자 (2022, 미국)

삶의 깊이가 있는 영화. 톰 행크스 주연. 그의 상황과 선택이 그대로 이해된다. 오랫동안 기억에 남을 영화

 

사라진 그녀 (Lost in the Stars, 2022, 중국)

결혼기념일 여행 중에 사라진 아내와 자신이 아내라며 나타난 낯선 여자. 영화의 첫 장면은 도시의 불빛을 배경으로 한 거미줄 위의 거미로 시작한다.  영화의 첫 3 ~ 4초를 보면 영화의 깊이가 전달되고, 이 영화 괜찮겠네 하는 느낌이 온다. 역시나 기대를 저버리지 않은 영화. 마지막 자막과 음악까지 여운이 남아서 듣게 되었다. 실화를 바탕으로 한 영화..

 

이미테이션 게임 (2013, 미국)

너무나 유명한 영화. 1938년 2차 세계 대전의 소용돌이 속에서 독일의 에니그마 암호시스템을 해독하기 위해 투입되었던 앨런 튜링과 몇몇 사람들의 실화를 바탕으로 한 영화. 그들의 암호 해독 성공으로 연합국 측 승리의 결정적 기여를 했지만, 그들 개인이 감당해야 했던 짐의 무게와 국가 시스템의 한 부품처럼 사용된 개인의 씁쓸함이 그려진다. 천재들은 단명한다는 것이 여기서도 적용된다. 7~8년 전쯤엔가 한번 보고 어제 다시 봤던 영화인데, 2번째 봤을 때는 완전히 새로운 영화로 느꼈졌다. 뭔가를 조금 알고 보는 것과 그렇지 않은 것은 정말 다르다. 스토리 뿐만 영화 자체로도 완성도가 높은 수작.

 

하이스코어 걸 (2019, 일본 애니)

독특한 일본 애니. 처음부터 끝까지 일본의 격투 게임 얘기밖에 없고 쉴세 없이 떠들어 대는 대사에 귀가 아프지만 전체적으로 깔린 순수한 감성이 좋아서 끝까지 보고 말았다. 예전에 오락실에 자주 갔던 사람들에게는 추억의 드라마가 될 수도 있겠다.

 

다음 소희 (2023, 한국)

2017년 있었던 콜센터 실습생 사건을 배경으로 한 영화. 우리에게 현재와 '다음'에 대해 생각하게 하는 영화.

 

사랑은 비가 갠 뒤처럼 (2018, 일본)

간간히 웃으면서 재미있게 본 영화. 아킬레스건을 다쳐 달리기를 그만둔 기록 보유자 아르바이트생. 나름 꿈은 있었지만 스스로 별볼일 없다고 생각하는 중년의 레스토랑 점주. 그리고 주변 사람들의 이야기. 영화의 디테일이 잘 살아있고 표정이나 상황이 웃음을 터트리게 한다. 가볍게 볼 수 있는 좋은 영화.

 

재키의 링 (2021, 미국)

영화를 보고 나서 여운이 가시질 않지만 어떻게 설명해야 할진 모르겠다. 영화의 모든 장면이 인상적이고 깊이가 있다. 패배로 은퇴한 종합격투기 선수로 묻혀사는 그녀, 문득 삶에 들어온 어린 아들, 어머니, 트레이너, 영화에 나오는 인물 하나 하나가 살아있고 나름의 이야기를 갖는다. 마음을 움직이게 하는 영화. 종합격투기 경기가 이렇게 긴장되는지 몰랐다.

 

마더/안드로이드 (2021, 미국)

S/F 스럴리 영화. 반란을 일으킨 안드로이드가 장악한 세상에서 안전한 곳을 찾아 떠나는 만삭의 젊은 커플의 상황을 그린 영화. 간만에 초집중하면서 영화를 봤다. 개인적으로는 긴장감과 몰입도 최고이다. 커플이 주고받는 대사들도 영화스럽지 않아서 더 좋았다. 영화에 대한 평점은 거의 최악이지만, 나에겐 잘 만들어진 영화이다.

 

반쪽의 이야기 (The Half of It, 2020, 미국)

청춘 영화, 성장 영화. 순수하고 보고 있으면 마음이 따뜻하진다. 가볍게 볼 수 있는 좋은 영화.

 

스위치 (2023, 한국)

패밀리맨의 리메이크작. 모든 것을 이루었지만 행복하지는 않은 탑배우. 크리스마스 이브날 잠이 들었다가 과거의 자신으로 깨어나면서 자신이 놓쳐버린 선택과 삶을 1년 동안 살게 된다. 영화 패밀리맨도 봤지만 개인적으론 스위치가 더 재미있다.

 

소공녀 (2018, 한국)

독특한 영화. 위스키 한잔, 담배 한갑, 그리고 자신과 사람에 대한 한결같은 태도. 올라버린 물가앞에 잠잘 곳도 마땅찮은 그녀가 절대 포기하지 않는 것들이다. 나름 멋있다. 그나저나 물가가 너무 올랐다.

 

죽지않는 인간들의 밤 (2020, 한국)

신혼인 부부. 남편이 외계인이고, 서로가 서로를 없애기 위해 노력한다. 하지만 겉으로는 아무일 없는 척 이야기가 진행된다. B급 감성으로 가볍게 보기 좋다. 재미있다. ㅋㅋ

 

브로커 (2022, 한국)

괜찮은 영화. 베이비박스. 인간에 대한 따뜻함이 묻어있는 영화가 좋다. 태어나줘서 고마워라는 말에 감정이 움직인다. 

 

가버나움 (2018, 레바논)

요즘은 상업영화보다 이런 영화가 더 좋다. 내용에 깊이가 있으면서도 몰입감이 높은 수작이다. 찾아보니 '가버나움'은 신도 버린 마을, 사람이라는 뜻이라 한다. 하지만 영화는 어둡지 않고 따뜻함을 바닥에 깔고 있다.

 

가재가 노래하는 곳 (2022, 미국)

이렇게 아름다운 영화를 극장에서 보지 못한게 아쉽다. 요즘에도 이런 좋은 영화가 나오는구나 싶다.

 

더 스위머스 (2022, 영국)

시리아 난민, 수영, 실화 바탕. 가볍게 볼 수 있는 영화이다.

 

랜드 (land, 2021, 미국)

막 재미있고 그런 영화는 아니다. 잔잔한데, 보다보면 괜찮다. 깊이가 있는 영화이다.

 

코다 (2021, 미국)

청각 장애인 가족, 음악, 한 소녀, 통역, 가족과 자신 사이에서의 선택. 잠시 청각장애인 입장에서 보여준 세상. 음악 영화는 항상 볼만하다.

 

내 어깨 위 고양이, 밥 (2016, 영국)

극적이지 않고 잔잔하지만 지루하지 않고 재미있다. 잘 만들어진 영화이다. 거리 공연, 처음 갖게 된 집, 옆집 아가씨, 고양이 밥을 훔쳐먹는 생쥐, 약물 중독과 치료사, 때로는 지나쳐 가고 때로는 도움을 주는 사람들. 마지막에 아버지를 만나 나누는 대화에서 나도 모르게 눈물이 난다.

 

베이비 드라이버 (2017, 영국)

강렬한 리듬, 음악과 영상이 어우러진 비트가 환상적이다. 내용도 재미있고 잘 만들어진 영화이다. 영국 영화.

 

겨우, 서른 (2020, 중국)

총 43화로 이루어진 중국 드라마이다. 길지만 전혀 지루하지 않고 보고 나서도 여운이 길게 남는다. 절친 사이인 30대의 세 여인을 통해 도시에서의 생활과 그 의미, 결혼 생활과 개인의 꿈, 현재와 미래, 타인과 나에 대해 돌아보게 만든다.

각 나라의 영화나 드라마를 보면서 그들의 문화, 생각을 보는 것도 나름의 재미 중 하나이다. 이 드라마를 보고 중국에 대한 이미지가 바뀌었다.

 

증인 (2019, 한국)

아내와 함께 감명깊게 본 영화이다. 극장에서 봤다. 완성도가 높고 잘 만들어진 영화이다. 이런 영화를 재미있다고 하긴 그렇지만 잘 만들어졌기에 재미있다. 세상의 시선을 받아내며 용기를 내 자신을 드러내는 한 소녀의 영혼이 빛난다.

 

로건 (2017, 미국)

마블 영화에서 드물게 진한 여운이 남는 영화. 구체적인 내용은 잘 기억나지 않지만 울버린의 마지막 힘을 다해가는 모습에 가슴이 먹먹했던 것 같다. 히어로물이라기 보다는 인간적인 영화. 재미있고 잘 만들어졌다.

 

나의 마더 (I am mother, 2019, 호주)

약간은 소름이 돋는 SF 영화. AI와 소녀. AI는 정성을 다해 소녀를 가르치고 키운다. 결말이 섬뜩하며 AI와 사람, 기술에 대해 돌아보게 한다. 재미있고 잘 만들어진 영화이다.

 

엑스 마키나 (2015, 영국)

SF 영화의 수작 중 하나이다. AI가 감정을 가질 수 있는지, 그리고 그러한 AI 앞에서 사람이 느끼는 감정.. 극장에서 봤는데 오싹하면서 봤던 것 같다. 아직까지도 여자 안드로이드의 강렬한 이미지가 남아 있다.

 

옥탑방 고양이 (2003, 한국)

16회의 미니 시리즈 드라마이다. 오래전 드라마이지만 최근에 다시 한번 보게 되었다. 너무 재미있다. 앉은 자리에서 킥킥거리며 끝까지 다 보고 말았다. 요즘 세대가 아닌 내가 젊었을 때의 감성과 잘 맞아서 더욱 재미있었는지도 모르겠다.

 

중경삼림 (1994, 홍콩)

홍콩의 거리에서 살아가는 사람들의 이야기. 자극적인 재미는 없지만 여운이 계속 남는 영화이다. 오랫동안 마음에 두고 있던 남자와 정식으로 만나기로 한 날, 정작 여자는 나타나지 않는다. 1년 후 캘리포니아에서 자기를 찾아달라는 편지 한 장만을 남긴 채.. 그리고 후일 우연히 만나서 하는 말. '나에게 1년 정도 기회를 주고 싶었다'.

 

남자사용설명서 (2013, 한국)

B급 영화이지만 상당히 재미있고 잘 만들어진 영화이다. 사용법 설명서, 처음엔 유치한데 보다보면 설득당한다. 재미있다.

 

내 사랑 (Maudie, 2016, 아일랜드/캐나다)

감명깊게 본 영화이다. 몸이 약하지만 그림에 재능이 있는 한 여인과 무뚝뚝한 시골 사내. 부족함을 떠나 가진 것 속에서 있는 그대로 삶과 행복을 살아간다. 어떻게 설명하기 어려운 아름다운 영화이다. 잘 만들어진 영화이며 당연히 재미있다.

 

휴먼스 (humans, 2015, 영국)

안드로이드를 소재로 한 8부작 드라마이다. 지금 우리가 만들고자 하는 인간과 유사한 능력을 가진 로봇이 실제로 구현되었을 때 얼마나 끔찍할지를 보여주는 영화(드라마)이다. 재미만 따지면 최근의 '그녀, 안드로이드'도 있겠지만 '휴먼스'는 로봇과 과학기술에 대해 많은 생각을 하게 하는 의미깊은 영화(드라마)이다. 물론 재미도 있다.

 

그녀 (her, 2013, 미국)

인공지능에게 사랑을 느끼는 남자. 하지만 인공지능은 진화하여 닿을 수 없는 세계로 사라진다. 그녀(인공지능)와 대화를 주고받으며 외로움을 위로받는 남자. 그런 남자의 모습에 왠지모를 공감을 느끼며 영화 후에도 계속 여운이 남는다. 재미있고 완성도가 높은 잘 만들어진 영화이다.

 

타워링 (1974, 미국)

1974년도 영화라고는 믿기지 않을 정도로 잘 만들어진 영화이다. 고층건물에서 발생한 화재와 화재 속에서의 다양한 군상들의 모습이 그려진다. 지금 개봉해도 최고의 영화 중 하나이다.

 

시크릿 슈퍼스타 (2019, 인도)

인도 영화하면 대표적으로 '당갈'과 이 영화가 떠오른다. 가수가 꿈인 한 소녀가 자신의 꿈을 향해 나아가는 과정을 통해 인도에서의 여성의 삶과 현실의 어려움이 무겁지 않게 그려진다. 인도의 사회와 가정, 가정에서의 남자와 여자의 위치. 인도 영화를 보며 형태만 다를 뿐 우리나라와 정서와 문화가 정말 많이 닮았다는 것을 느낀다. 잘 만들어진 영화이며 재미있다.

 

당갈 (2018, 인도)

아이들과 함께 재미있게 본 인도 영화이다. 아버지에 의해 강제로 레슬러의 길을 걷는 두 소녀. 아버지가 말을 듣지 않는 두 딸의 머리를 삭발하는 장면, 인도에서의 마을 결혼식 풍경. 자기 의지와 관계없이 어린 나이에 결혼을 해야 하는 어린 신부의 눈물이 기억에 남는다. 내용도 재미있고 잘 만들어진 영화이다.

 

대지진 (Aftershock, 2010, 중국)

1976년 27만의 목숨을 앗아간 중국의 당산대지진을 소재로 한 영화이다. 죽은자와 살아남은 자. 그리고 두 아이 중에서 한 명만을 선택해야 했던 어머니. 그들의 한과 아픔을 느끼면서 몰입하며 봤던 영화이다. 지금 다시 한번 봐도 좋을 것 같다. 완성도가 높고 잘 만들어진 영화이다.

 

분노 (Hai Phuong, 2019, 배트남)

내가 본 유일한 배트남 영화. 흔치 않은 기회이기에 얼른 봤지만 영화 자체로도 뛰어나다. 우리나라 영화 '아저씨'를 떠오르게 하지만 상황이나 액션이 훨씬 리얼하다. 배트남을 엿볼 수 있는 영화라서 좋고 뛰어난 영화라서 더 좋다. 재미있고 잘 만들어진 영화이다.

 

다만, 널 사랑하고 있어 (2007, 일본)

15년쯤 전에 봤던 영화. 개인적으로 가장 기억에 남는 일본 영화이다. 아직은(?) 젊었던 시절 풋풋하고 안타깝고 가슴이 설렜던 감정이 지금도 기억에 남아 있다.

 

프로메테우스 (2012, 미국)

에일리언 시리즈 중에서 가장 긴장하면서 봤던 영화이다. 에일리언과 관련된 영화인줄 모르고 보다가 마지막에 깜짝 놀랐던 영화. 재미있고 잘 만들어진 영화이다.

 

나의 아저씨 (2018, 한국)

16회로 구성된 드라마. 아이유의 연기가 인상적인 잘 만들어진 드라마이다. 퇴근하면 어두운 방에서 믹스커피 2개로 끼니를 해결하는 모습, 가게가 끝나면 저녁마다 동네 한바퀴를 돌아서 다시 자기 가게로 퇴근하는 술집 여주인, 사채업자 청년이 방안에 주저앉아 있던 장면 등이 기억에 남는다.

 

아바타 (2009, 미국)

영상미와 그래픽에 경이로움을 느끼면서 봤던 영화. 당시 보면서 그래픽 영화는 아바타 이전과 이후로 구분된다고 생각했을 정도로 환상적인 영상에 감탄했던 기억이 난다. 당시 이 영화를 극장에서 본게 얼마나 다행인지 모른다.

 

추격자 (2008, 한국)

너무나도 잔인한 영화. 이런 영화인지 모르고 아내와 함께 극장에서 봤다가 약간 정신적 충격을 먹었던 영화이다. 완성도가 높고 너무 잘 만들어졌기에 더욱 무서운 영화. 지금 다시 보라고 해도 이 영화는 두 번은 보기 힘들 것 같다.

 

블레이드 러너 2049 (2017, 미국/캐나다/영국)

SF의 명작 중 하나. 전편 '블레이드 러너'(1982)를 보고 보면 더 좋을 영화. 개인적으로 전편보다는 이 영화를 더 인상깊게 보았다. 드물게 두 번을 본 영화이며 두 번째 봤을 때가 좀 더 내용을 곱씹으며 좋았던 영화이다. 전편이 거친 폭풍 같다면 '블레이드 러너 2049'는 만들어진 자들의 아픔이 잘 갈무리된, 장면 하나 하나가 아름다운 영화이다.

 

82년생 김지영 (2019, 한국)

남자와 여자를 떠나서 한 인간으로서 그냥 공감이 되는 영화. 보는 내내 나도 모르게 눈물이 났다. 왠지 아내와 함께 보지 않은게 다행이었던 영화.

 

자토이치 (2003, 일본)

일본영화 하면 떠오르는 선명한 피, 날선 횟감같은 느낌이 잘 드러난 영화이다. 특이하게도 일본 영화에서 삶과 죽음, 생명은 큰 의미가 없다. 시퍼런 칼날에 피가 난무하지만 한편으로는 시 같기도 하다. 자기 민족(일본)의 삶과 애환을 칼잡이를 통해 그려내면서 또한 자국의 전통 문화를 강하게 드러내고 있다. 잘 만들어진 작품.

 

레버넌트: 죽음에서 돌아온 자 (2016, 미국)

대작 중의 하나. 네이티브 어메리칸(인디언)과 영.프 제국의 식민 개척에서 벌어졌던 비극을 한 남자의 생존과 복수의 과정을 통해 중립적인 관점에서 담아낸 영화. 대자연의 영상미와 날것의 영상들이 압권이다.

 

모터싸이클 다이어리 (2004, 아르헨티나)

좋은 영화다. 나를 돌아보게하고 내가 얽매인 것들을 돌아보게 한다. 명작이라고까지 하기는 어렵지만 나름 재미있고 잘 만들어진 영화이다. 체 게바라와 관계된 영화, 흔하지 않은 남미의 영화라는 점에서도 한 범쯤 볼 만하다.

 

히든 피겨스 (Hidden Figures, 2016, 미국)

미국의 뿌리깊은 인종차별과 흑백갈등을 엿볼 수 있는 영화. 재미있고 짜임새 있게 잘 만들어진 영화이다. NASA 책임자(백인 남성)가 유색을 구분하는 화장실 간판을 때려부수는 장면이 인상적이다. 흑인 인종차별을 그린 또 다른 영화들로 '헬프'(2011, 미국), '크래쉬'(2004, 미국) 등도 볼 만하다.

 

나의 해방일지 (2022, 한국)

꽤나 독특한 드라마이다. 작가의 한풀이 드라마 같기도 한데, 평소에 어렴풋이 느끼지만 깊게 생각하지 않았거나 구체화되지 않았던 것들이 언어로 표현되어 나왔을 때, 그렇구나 하면서 저절로 고개가 끄덕여진다. '나는 아직 여기에 있는데, 아직 이것을 좀 더 해야겠는데, 사람들은 다음 단계로 나아간다'. 극중 해방클럽 멤버들이 정한 규칙: 조언하지 않기, 행복한척 하지 않기, 불행한척 하지 않기. 

 

불도저에 탄 소녀 (2021, 한국)

이런 영화 참 좋다. 신선하다. 한쪽 팔에 문신을 새긴 소녀가 있고 평소에는 소매로 문신을 가리고 다닌다. 입도 거칠고 거침이 없어 보이지만 정작 용기를 내야할 때에는 문신을 가린 소매를 걷어올린다.

 

by 다크 프로그래머

'잡기장' 카테고리의 다른 글

디지털 피아노 건반소음 없애기  (9) 2022.04.12
글쓰기에 대해  (3) 2021.02.05
아래한글(hwp) 멈춤 현상과 파워포인트(ppt)  (36) 2018.12.22