【opencv】示例-image_alignment.cpp 利用ECC 算法进行图像对齐

4c10ad6b13fdc94a8674ef9ad9f5cbb9.png

444d4e512471b5f4232917db04381d54.png

affine

imshow("image", target_image);
imshow("template", template_image);
imshow("warped image", warped_image);
imshow("error (black: no error)", abs(errorImage) * 255 / max_of_error);

2778b45db8f3be9d9fb6bf48f672c073.png

homography

这段代码是一个利用ECC (Enhanced Correlation Coefficient) 算法进行图像对齐的示例。代码首先包含了OpenCV库的头文件,并且使用了OpenCV和标准库的命名空间。然后定义了几个函数和宏进行图像变换矩阵的操作,定义了一些用于解析命令行参数的关键字。

main 函数中,首先使用CommandLineParser解析命令行参数,之后加载输入图像和模板图像。如果只给出了输入图像,代码会生成一个随机的模板图像。如果给定了输入变换矩阵,则会使用该矩阵初始化。若变换类型为仿射或相似变换等,会初始化对应的变换矩阵。

代码接着执行findTransformECC函数来计算图像间的几何变换。计算完成后,保存变换矩阵和变换后的图像,并对结果进行显示(根据具体的verbose参数决定是否显示)。

整个过程包括了对图像的读取、几何变换矩阵的初始化与读取、使用ECC算法进行图像对齐、结果的保存与显示。通过这个示例,可以了解到图像处理中图像对齐的基本流程和方法

/*
* 本示例展示了使用findTransformECC函数实现图像对齐的ECC算法
* 
* Demo加载一个图像(默认为fruits.jpg),并基于给定的运动类型人工创建一个模板图像。
* 当给出两幅图像时,第一幅是输入图像,第二幅定义模板图像。在后一种情况下,
* 您还可以解析warp的初始化。
* 
* 输入和输出的warp文件由原始的warp(变换)元素组成。
* 
* 作者: G. Evangelidis, 法国国家信息与自动化研究所(INRIA), Grenoble,
*       M. Asbach, 德国Fraunhofer IAIS, St. Augustin
*/


// 导入opencv库的各个模块
#include <opencv2/imgcodecs.hpp> // 图像编解码
#include <opencv2/highgui.hpp>   // 图像显示
#include <opencv2/video.hpp>     // 视频处理
#include <opencv2/imgproc.hpp>   // 图像处理
#include <opencv2/core/utility.hpp> // OpenCV实用函数


#include <stdio.h>  // 包含基本输入输出函数
#include <string>   // 包含字符串相关功能
#include <time.h>   // 包含处理时间相关功能
#include <iostream> // 包含输入输出流功能
#include <fstream>  // 包含文件流操作功能


using namespace cv;  // 使用OpenCV命名空间
using namespace std; // 使用标准库命名空间


// 向前声明函数(函数将在下面定义)
static void help(const char** argv);
static int readWarp(string iFilename, Mat& warp, int motionType);
static int saveWarp(string fileName, const Mat& warp, int motionType);
static void draw_warped_roi(Mat& image, const int width, const int height, Mat& W);




// 用于向齐次变换矩阵赋值的宏定义(x和y是坐标,H是变换矩阵)
#define HOMO_VECTOR(H, x, y)\
    H.at<float>(0,0) = (float)(x);\
    H.at<float>(1,0) = (float)(y);\
    H.at<float>(2,0) = 1.;


//  用于从齐次坐标中读取值的宏定义(X是齐次坐标,x和y是提取的坐标)
#define GET_HOMO_VALUES(X, x, y)\
    (x) = static_cast<float> (X.at<float>(0,0)/X.at<float>(2,0));\
    (y) = static_cast<float> (X.at<float>(1,0)/X.at<float>(2,0));


// 定义命令行参数,用于程序运行时接收用户输入或默认值
const std::string keys =
    "{@inputImage    | fruits.jpg    | input image filename }" // 输入图像文件名,默认为fruits.jpg
    "{@templateImage |               | template image filename (optional)}" // 模板图像文件名,可选参数
    "{@inputWarp     |               | input warp (matrix) filename (optional)}" // 输入变换矩阵(文件名),可选参数
    "{n numOfIter    | 50            | ECC's iterations }" // ECC算法迭代次数,默认值为50
    "{e epsilon      | 0.0001        | ECC's convergence epsilon }" // ECC算法收敛阈值,默认为0.0001
    "{o outputWarp   | outWarp.ecc   | output warp (matrix) filename }" // 输出变换矩阵的文件名,默认为outWarp.ecc
    "{m motionType   | affine        | type of motion (translation, euclidean, affine, homography) }" // 变换类型,默认为仿射变换(affine)
    "{v verbose      | 1             | display initial and final images }" // 是否显示处理前后的图像,默认为1(显示)
    "{w warpedImfile | warpedECC.png | warped input image }" // 输出变形后图像的文件名,默认为warpedECC.png
    "{h help | | print help message }" // 显示帮助信息
;


//该文件演示了 ECC 图像对齐算法的使用。 当给定一张图像时,
//模板图像是通过随机扭曲人为形成的。当给出两个图像时,可以
//通过命令行解析来初始化扭曲。如果缺少 inputWarp,则恒等变换
//会初始化算法。
// 提供程序帮助信息和命令行示例的函数
static void help(const char** argv)
{
    // 输出ECC图像对齐算法使用说明
    cout << "\nThis file demonst
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值