Axa*_*diw 6 opencv crop rotation homography ios
我正在检测我的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));
Run Code Online (Sandbox Code Playgroud)
这给出了我的这些结果(查看右下角的结果warpPerspective):

您可能会看到结果图像在结果图像的左上角包含已识别的标记.我的问题是我想捕捉整个图像(没有裁剪),所以我可以在以后检测到该图像上的其他标记.
我怎样才能做到这一点?也许我应该使用solvePnP函数的旋转/平移向量?
编辑:
不合适地改变扭曲图像的大小并没有多大帮助,因为图像仍然被翻译,因此标记的左上角位于图像的左上角.
例如,当我使用以下尺寸加倍时:
cv::warpPerspective(*_image, *_undistortedImage, M, cv::Size(2*_image->cols, 2*_image->rows));
Run Code Online (Sandbox Code Playgroud)
我收到了这些图片:

你的代码似乎不完整,所以很难说问题出在哪里。
在任何情况下,与输入图像相比,扭曲图像可能具有完全不同的尺寸,因此您必须调整用于 warpPerspective 的尺寸参数。
例如尝试将大小加倍:
cv::warpPerspective(*_image, *_undistortedImage, M, 2*cv::Size(_image->cols, _image->rows));
Run Code Online (Sandbox Code Playgroud)
编辑:
为了确保整个图像位于该图像内部,原始图像的所有角都必须变形以位于结果图像内部。因此,只需计算每个角点的扭曲目标并相应地调整目标点即可。
为了更清楚一些示例代码:
// 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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4422 次 |
| 最近记录: |