Я совершенно новичок в OpenCV, и я начал в него погружаться. Но мне нужна небольшая помощь.
Итак, я хочу объединить эти 2 изображения:
Я хотел бы, чтобы 2 изображения совпадали по краям (сейчас игнорируя самую правую часть изображения)
Может ли кто-нибудь указать мне правильное направление? Я попытался использовать функцию findTransformECC
. Вот моя реализация:
cv::Mat im1 = [imageArray[1] CVMat3];
cv::Mat im2 = [imageArray[0] CVMat3];
// Convert images to gray scale;
cv::Mat im1_gray, im2_gray;
cvtColor(im1, im1_gray, CV_BGR2GRAY);
cvtColor(im2, im2_gray, CV_BGR2GRAY);
// Define the motion model
const int warp_mode = cv::MOTION_AFFINE;
// Set a 2x3 or 3x3 warp matrix depending on the motion model.
cv::Mat warp_matrix;
// Initialize the matrix to identity
if ( warp_mode == cv::MOTION_HOMOGRAPHY )
warp_matrix = cv::Mat::eye(3, 3, CV_32F);
else
warp_matrix = cv::Mat::eye(2, 3, CV_32F);
// Specify the number of iterations.
int number_of_iterations = 50;
// Specify the threshold of the increment
// in the correlation coefficient between two iterations
double termination_eps = 1e-10;
// Define termination criteria
cv::TermCriteria criteria (cv::TermCriteria::COUNT+cv::TermCriteria::EPS, number_of_iterations, termination_eps);
// Run the ECC algorithm. The results are stored in warp_matrix.
findTransformECC(
im1_gray,
im2_gray,
warp_matrix,
warp_mode,
criteria
);
// Storage for warped image.
cv::Mat im2_aligned;
if (warp_mode != cv::MOTION_HOMOGRAPHY)
// Use warpAffine for Translation, Euclidean and Affine
warpAffine(im2, im2_aligned, warp_matrix, im1.size(), cv::INTER_LINEAR + cv::WARP_INVERSE_MAP);
else
// Use warpPerspective for Homography
warpPerspective (im2, im2_aligned, warp_matrix, im1.size(),cv::INTER_LINEAR + cv::WARP_INVERSE_MAP);
UIImage* result = [UIImage imageWithCVMat:im2_aligned];
return result;
Я пробовал играть с termination_eps
и number_of_iterations
и увеличивать/уменьшать эти значения, но на самом деле это не имело большого значения.
Итак, вот результат:
Что я могу сделать, чтобы улучшить свой результат?
РЕДАКТИРОВАТЬ: я отметил проблемные края красными кружками. Цель состоит в том, чтобы деформировать нижнее изображение и сделать так, чтобы оно совпадало с линиями на изображении выше:
Я провел небольшое исследование и боюсь, что функция findTransformECC
не даст мне желаемого результата :-(
Важно добавить: на самом деле у меня есть массив этих «полос» изображения, в данном случае 8, все они похожи на изображения, показанные здесь, и все они должны быть обработаны, чтобы соответствовать линии. Я пробовал экспериментировать с функцией stitch
OpenCV, но результаты были ужасны.
РЕДАКТИРОВАТЬ:
Вот 3 исходных изображения:
Результат должен быть примерно таким:
Я трансформировал каждое изображение по линиям, которые должны совпадать. Линии, находящиеся слишком далеко друг от друга, можно игнорировать (тень и участок дороги в правой части изображения).