차이 연산을 이용하면 두 개의 영상에서 변화가 있는 영역을 쉽게 찾을 수 있습니다. 그림 6-4는 차이 연산을 이용하여 움직임이 있는 영역을 추출하는 예입니다. 그림 6-4의 왼쪽 영상은 움직임이 없는 정적인 배경 영상이고, 가운데 영상은 한 대의 자동차가 지나가고 있을 때 촬영된 영상입니다. 이 두 영상에 대해 차이 연산을 수행하면 그림 6-4의 오른쪽에 나타난 영상처럼 움직이는 자동차 영역에서만 픽셀 값 차이가 두드러지게 나타납니다. 두 입력 영상에서 큰 변화가 없는 영역은 픽셀 값이 0에 가까운 검은색으로 채워지게 됩니다.
▲ 그림 6-4 영상의 차이 연산2
영상도 일종의 행렬이므로 두 입력 영상을 행렬로 생각하여 행렬의 곱셈을 수행할 수도 있습니다.3 그러나 영상을 이용하여 행렬의 곱셈을 수행하는 경우는 거의 없습니다. 다만 두 영상에서 같은 위치에 있는 픽셀 값끼리 서로 곱하거나 나누는 연산을 수행할 수 있으며, 이를 위해 OpenCV에서는 multiply() 함수와 divide() 함수를 제공합니다.
void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1); |
|
• src1 |
첫 번째 입력 행렬 |
• src2 |
두 번째 입력 행렬. src1과 크기와 타입이 같아야 합니다. |
• dst |
출력 행렬. src1과 같은 크기, 같은 타입 dst(x, y)=saturate(scale·src1(x, y)·src2(x, y)) |
• scale |
추가적으로 확대/축소할 비율 |
• dtype |
출력 행렬의 깊이 |
void divide(InputArray src1, InputArray src2, OutputArray dst, double scale = 1, int dtype = -1); |
|
• src1 |
첫 번째 입력 행렬 |
• src2 |
두 번째 입력 행렬. src1과 크기와 타입이 같아야 합니다. |
• dst |
출력 행렬. src1과 같은 크기, 같은 타입 dst(x, y)=saturate(scale·src1(x, y)·src2(x, y)) |
• scale |
추가적으로 확대/축소할 비율 |
• dtype |
출력 행렬의 깊이 |
3 일반적인 행렬의 곱셈 연산은 gemm() 함수를 사용합니다. gemm() 함수에 대해서는 OpenCV 문서 사이트를 참고하기 바랍니다.