반응형
서로 다른 이미지를 정렬할 때 사용.
Motion Model
- Translation (MOTION_TRANSLATION)
- 이미지를 (x, y) 이동(translated)한 변환 모델 - Euclidean (MOTION_EUCLIDEAN)
- 이미지를 (x, y) 이동 및 angle 회전한 변환 모델 - Affine (MOTION_AFFINE)
- Affine 변환은 회전, 평행이동(shift), 배율 및 shear의 조합
- 정사각형이 Affine 변환을 거치면 평행선은 평행을 유지하지만 직각으로 만나는 선은 직교를 유지하지 않음 - Homography (MOTION_HOMOHRAPHY)
- 위에서 설명한 모든 변환은 2D 변환이지만, 호모그래피 변환은 일부 3D 효과를 설명할 수 있음(전부x)
- 호모그래피를 사용하여 변환된 정사각형은 어떤 사변형으로도 바뀔 수 있음

- OpenCV에서 Affine 변환은 2x3 행렬에 저장할 수 있다. (Translation 및 Euclidean 변환은 Affine 변환에 포함 가능)
- Homography 변환은 3x3 행렬로 저장된다.
Enhanced Correlation Coefficient(ECC)
- 유사성을 측정하는 상관 계수.
- 픽셀 강도의 차이를 측정하는 전통적인 유사성 측정과 달리 ECC는 대비와 밝기의 왜곡에 강하다.
cv::findTransformECC 예제
bool AlignToReference(const cv::Mat& org_image,
const cv::Mat& dst_image,
cv::Mat& aligned_image,
double& dx, double& dy)
{
// 입력 유효성 검사
if (org_image.empty() || dst_image.empty()) {
std::cerr << "Error: One or both images are empty!" << std::endl;
return false;
}
// 그레이스케일 변환
cv::Mat org_gray, dst_gray;
if (org_image.channels() == 3)
cv::cvtColor(org_image, org_gray, cv::COLOR_BGR2GRAY);
else
org_gray = org_image.clone();
if (dst_image.channels() == 3)
cv::cvtColor(dst_image, dst_gray, cv::COLOR_BGR2GRAY);
else
dst_gray = dst_image.clone();
// 초기 변환 행렬 (2x3)
cv::Mat warp_matrix = cv::Mat::eye(2, 3, CV_32F);
// ECC 기반 정합 설정
int number_of_iterations = 100;
double termination_eps = 1e-6;
cv::TermCriteria criteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS,
number_of_iterations, termination_eps);
try {
// ECC 정합 (이동만)
double cc = cv::findTransformECC(
dst_gray, // 기준 이미지
org_gray, // 정렬할 이미지
warp_matrix, // 결과 변환 행렬
cv::MOTION_TRANSLATION,
criteria
);
// 변환 적용
cv::warpAffine(org_image, aligned_image, warp_matrix,
dst_image.size(),
cv::INTER_LINEAR + cv::WARP_INVERSE_MAP);
// x, y offset 추출
dx = warp_matrix.at<float>(0, 2);
dy = warp_matrix.at<float>(1, 2);
std::cout << "Alignment success. Offset (dx, dy): "
<< dx << ", " << dy << std::endl;
return true;
}
catch (cv::Exception& e) {
std::cerr << "Alignment failed: " << e.what() << std::endl;
return false;
}
}
- cv::findTransformECC 함수를 통해 dst_gray와 org_gray 사이의 변환 행렬을 찾음.
- cv::warpAffine 함수를 사용하여 찾아낸 변환 행렬을 기반으로 org_image를 dst_image 기준으로 정렬.



<참고>
https://docs.opencv.org/3.4/dc/d6b/group__video__track.html#ga1aa357007eaec11e9ed03500ecbcbe47
OpenCV: Object Tracking
cv.calcOpticalFlowPyrLK(prevImg, nextImg, prevPts, nextPts[, status[, err[, winSize[, maxLevel[, criteria[, flags[, minEigThreshold]]]]]]]) -> nextPts, status, err
docs.opencv.org
https://learnopencv.com/image-alignment-ecc-in-opencv-c-python/
Image Alignment (ECC) in OpenCV ( C++ / Python ) | LearnOpenCV #
See example code for using OpenCV ECC image alignment on mis-aligned color channels of historic images.
learnopencv.com
반응형
'Computer Vision > OpenCV' 카테고리의 다른 글
| [OpenCV] cv::VideoCapture RTSP open failed. (0) | 2022.06.14 |
|---|---|
| [OpenCV] Optical Flow (0) | 2022.04.11 |
| [OpenCV] Histogram Equalization (히스토그램 평활화) (0) | 2022.02.25 |
| [OpenCV] Gamma Correction(감마 보정) (0) | 2021.05.14 |
| [OpenCV] Canny Edge (0) | 2021.04.05 |