gpt4 book ai didi

ios - OpenCV : wrapPerspective on whole image

转载 作者:可可西里 更新时间:2023-11-01 03:57:04 25 4
gpt4 key购买 nike

我正在检测 iPad 拍摄的图像上的标记。因此,我想计算它们之间的平移和旋转,我想改变这些图像的视角,所以看起来我是在标记正上方捕获它们。

我现在正在用

points2D.push_back(cv::Point2f(0, 0));
points2D.push_back(cv::Point2f(50, 0));
points2D.push_back(cv::Point2f(50, 50));
points2D.push_back(cv::Point2f(0, 50));

Mat perspectiveMat = cv::getPerspectiveTransform(points2D, imagePoints);
cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(_image->cols, _image->rows));

这给出了我的这些结果(查看右下角的 warpPerspective 结果):

photo 1 photo 2 photo 3

您可能会看到结果图像在结果图像的左上角包含已识别的标记。我的问题是我想捕获整个图像(不裁剪),以便稍后检测该图像上的其他标记。

我该怎么做?也许我应该使用 solvePnP 函数中的旋转/平移向量?

编辑:

不幸的是,改变扭曲图像的大小并没有多大帮助,因为图像仍在翻译,所以标记的左上角位于图像的左上角。

例如,当我使用以下方法将尺寸翻倍时:

cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(2*_image->cols, 2*_image->rows));

我收到了这些图片:

photo 4 photo 5

最佳答案

你的代码好像不完整,所以很难说是什么问题。

在任何情况下,变形图像与输入图像相比可能具有完全不同的尺寸,因此您必须调整用于 warpPerspective 的尺寸参数。

例如尝试将大小加倍:

cv::warpPerspective(*_image, *_undistortedImage, M, 2*cv::Size(_image->cols, _image->rows));

编辑:

为确保整个图像都在该图像内,原始图像的所有角都必须变形以位于生成的图像内。因此,只需计算每个角点的变形目的地并相应地调整目的地点。

为了更清楚一些示例代码:

// calculate transformation
cv::Matx33f M = cv::getPerspectiveTransform(points2D, imagePoints);

// calculate warped position of all corners

cv::Point3f a = M.inv() * cv::Point3f(0, 0, 1);
a = a * (1.0/a.z);

cv::Point3f b = M.inv() * cv::Point3f(0, _image->rows, 1);
b = b * (1.0/b.z);

cv::Point3f c = M.inv() * cv::Point3f(_image->cols, _image->rows, 1);
c = c * (1.0/c.z);

cv::Point3f d = M.inv() * cv::Point3f(_image->cols, 0, 1);
d = d * (1.0/d.z);

// to make sure all corners are in the image, every position must be > (0, 0)
float x = ceil(abs(min(min(a.x, b.x), min(c.x, d.x))));
float y = ceil(abs(min(min(a.y, b.y), min(c.y, d.y))));

// and also < (width, height)
float width = ceil(abs(max(max(a.x, b.x), max(c.x, d.x)))) + x;
float height = ceil(abs(max(max(a.y, b.y), max(c.y, d.y)))) + y;

// adjust target points accordingly
for (int i=0; i<4; i++) {
points2D[i] += cv::Point2f(x,y);
}

// recalculate transformation
M = cv::getPerspectiveTransform(points2D, imagePoints);

// get result
cv::Mat result;
cv::warpPerspective(*_image, result, M, cv::Size(width, height), cv::WARP_INVERSE_MAP);

关于ios - OpenCV : wrapPerspective on whole image,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19695702/

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