C++ 如何使用Map类实现图像配准?

C++ 如何使用Map类实现图像配准?,c++,opencv,C++,Opencv,实际上,我已经阅读了opencv中有关classMap的官方文档,试图使用模块reg。这是我的测试图像: 这是我的代码: #include<opencv.hpp> #include "opencv2/reg/mapshift.hpp" #include "opencv2/reg/mappergradshift.hpp" #include "opencv2/reg/mapperpyramid.hpp" using namespace cv; using namespace std;

实际上,我已经阅读了opencv中有关class
Map
的官方文档,试图使用模块
reg
。这是我的测试图像:

这是我的代码:

#include<opencv.hpp>
#include "opencv2/reg/mapshift.hpp"
#include "opencv2/reg/mappergradshift.hpp"
#include "opencv2/reg/mapperpyramid.hpp"

using namespace cv;
using namespace std;
using namespace cv::reg;

Mat highlight1(const Mat src, const Mat t_mask) {
    Mat srcImg = src.clone(), mask = t_mask.clone();
    threshold(mask, mask, 0, 255, THRESH_BINARY_INV + THRESH_OTSU);
    cvtColor(mask, mask, COLOR_GRAY2BGR);
    cvtColor(srcImg, srcImg, COLOR_GRAY2BGR);
    dilate(mask - Scalar(0, 0, 255), mask, Mat(), Point(-1, -1), 1);
    return srcImg - mask;
}

int main() {
    Mat img1 = imread("img.jpg", 0);
    Mat img2;

    // Warp original image
    Vec<double, 2> shift(5., 5.);
    MapShift mapTest(shift);
    mapTest.warp(img1, img2);

    // Register
    Ptr<MapperGradShift> mapper = makePtr<MapperGradShift>();
    MapperPyramid mappPyr(mapper);
    Ptr<Map> mapPtr = mappPyr.calculate(img1, img2);
    MapShift* mapShift = dynamic_cast<MapShift*>(mapPtr.get());

    // Display registration result
    Mat result;
    mapShift->inverseWarp(img2, result);
    Mat registration_before = highlight1(img1, img2);
    Mat registration_after = highlight1(img1, result);
    return 0;
}
#包括
#包括“opencv2/reg/mapshift.hpp”
#包括“opencv2/reg/mappergradshift.hpp”
#包括“opencv2/reg/mapperpyramid.hpp”
使用名称空间cv;
使用名称空间std;
使用名称空间cv::reg;
Mat highlight1(恒定Mat src、恒定Mat t_遮罩){
Mat srcImg=src.clone(),mask=t_mask.clone();
阈值(掩模,掩模,0,255,阈值二元值+阈值大津);
CVT颜色(遮罩,遮罩,颜色为灰色2BGR);
CVT颜色(srcImg、srcImg、COLOR_GRAY2BGR);
放大(掩码-标量(0,025),掩码,Mat(),点(-1,-1),1);
返回srcImg-mask;
}
int main(){
Mat img1=imread(“img.jpg”,0);
Mat-img2;
//扭曲原始图像
向量移位(5,5.);
MapShift mapTest(shift);
mapTest.warp(img1、img2);
//登记册
Ptr mapper=makePtr();
映射器金字塔映射器(映射器);
Ptr mappptr=mappyr.calculate(img1,img2);
MapShift*MapShift=dynamic_cast(mapPtr.get());
//显示注册结果
Mat结果;
mapShift->inverseWarp(img2,结果);
Mat registration_before=高亮度1(img1、img2);
Mat registration_after=高亮度1(img1,结果);
返回0;
}
但正如我们所看到的,在之后的注册比之前的注册更糟糕。我错过了什么

这是
之前的注册\u

这是之后的注册:


我们能看一下前后的图片吗?@t非常感谢您的关心。我刚刚更新了帖子。您能独立于高亮显示步骤显示
img1
result
的输出吗?。我怀疑问题就在那里。@Voltaire对不起,我错过了你的消息,这是,这是。如果你仔细看,结果会更糟。。