C++ 如何使用Map类实现图像配准?
实际上,我已经阅读了opencv中有关classC++ 如何使用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;
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对不起,我错过了你的消息,这是,这是。如果你仔细看,结果会更糟。。