gpt4 book ai didi

c++ - 如何在opencv中使用Multi-band Blender

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:45 27 4
gpt4 key购买 nike

我想使用 multiband blending 混合两个图像但我不清楚这个函数的输入参数:

void detail::Blender::prepare(const std::vector<Point>& corners, const std::vector<Size>& sizes)

在我的例子中,我只是输入了两张带有黑色间隙的扭曲图像,并且所有蒙版都是白色的。(请原谅我不能添加图片......)

我设置了两个角(0.0,0.0),因为扭曲的图像已经被注册。

但我的结果不够好,结果有明显的缝隙

谁能告诉我为什么?我该如何解决这个问题?

最佳答案

我不确定您说“我的结果不够好”是什么意思。最好看那个结果,但我会尝试猜测。我制作全景图的主要代码部分如下所示:

void makePanorama(Rect bounding_box, vector<Mat> images, vector<Mat> homographies, vector<vector<Point>> corners) {
detail::MultiBandBlender blender;
blender.prepare(bounding_box);

Mat mask, bigImage, curImage;
for (int i = 0; i < (int)images.size(); ++i) {
warpPerspective(images[i], curImage, homographies[i],
bounding_box.size(), INTER_LINEAR, ORDER_TRANSPARENT);

mask = makeMask(curImage.size(), corners[i], homographies[i]);
blender.feed(curImage.clone(), mask, Point(0, 0));
}

blender.blend(bigImage, mask);
bigImage.convertTo(bigImage, (bigImage.type() / 8) * 8);
imshow("Result", bigImage);
waitKey();
}

因此,准备blender 然后循环:扭曲图像,在扭曲图像和喂入搅拌器后制作蒙版。最后,打开这个 blender 就可以了。我遇到了两个问题,严重影响了我的结果。可能你有其中之一或两者都有。

首先是类型。我的图像有 CV_16SC3,混合后您需要将混合图像类型转换为 unsigned 类型。像这样

  bigImage.convertTo(bigImage, (bigImage.type() / 8) * 8);

否则,结果图像将是灰色的。

第二个是边框。一开始,我的函数 makeMask 计算的是扭曲图像的非黑色区域。结果,人们可以在混合图像上看到扭曲图像的边界。解决方案是使蒙版小于非黑色扭曲图像区域。所以,我的函数 makeMask 看起来像这样:

Mat makeMask(Size sz, vector<Point2f> imageCorners, Mat homorgaphy) {
Scalar white(255, 255, 255);
Mat mask = Mat::zeros(sz, CV_8U);
Point2f innerPoint;
vector<Point2f> transformedCorners(4);

perspectiveTransform(imageCorners, transformedCorners, homorgaphy);
// Calculate inner point
for (auto& point : transformedCorners)
innerPoint += point;
innerPoint.x /= 4;
innerPoint.y /= 4;

// Make indent for each corner
vector<Point> corners;
for (int ind = 0; ind < 4; ++ind) {
Point2f direction = innerPoint - transformedCorners[ind];
double normOfDirection = norm(direction);
corners[ind].x += settings.indent * direction.x / normOfDirection;
corners[ind].y += settings.indent * direction.y / normOfDirection;
}

// Draw borders
Point prevPoint = corners[3];
for (auto& point : corners) {
line(mask, prevPoint, point, white);
prevPoint = point;
}

// Fill with white
floodFill(mask, innerPoint, white);
return mask;
}

我从我的真实代码中提取了这段代码,所以我可能会忘记指定一些东西。但我希望,关于如何使用 MultiBandBlender 的想法是清楚的。

关于c++ - 如何在opencv中使用Multi-band Blender,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30044477/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com