gpt4 book ai didi

c++ - 使用 cv::warpAffine 旋转 cv::Mat 偏移目标图像

转载 作者:IT老高 更新时间:2023-10-28 21:49:34 26 4
gpt4 key购买 nike

我正在尝试使用 OpenCV 的 C++ API1296x968 图像90 度旋转我面临一些问题。

输入: input

轮换: output

如您所见,旋转后的图像存在一些问题。首先,它的大小与原始大小相同,尽管我专门创建了目标 Mat与原件的倒置尺寸。结果,目标图像被裁剪。

我怀疑发生这种情况是因为我正在调用 warpAffine()并传递原始 Mat 的大小而不是目的地的大小 Mat .但我这样做是因为 我关注了 this answer ,但现在我怀疑答案可能是错误的。所以这是我的第一个疑问/问题。

第二个,是warpAffine()正在在某个偏移量处写入目的地(可能是将旋转后的数据复制到图像的中间)并且此操作会在图像周围留下可怕的黑色大边框 .

如何解决这些问题?

我在下面分享源代码:

#include <cv.h>
#include <highgui.h>
#include <iostream>

using namespace cv;
using namespace std;

void rotate(Mat& image, double angle)
{
Point2f src_center(image.cols/2.0F, image.rows/2.0F);

Mat rot_matrix = getRotationMatrix2D(src_center, angle, 1.0);

Mat rotated_img(Size(image.size().height, image.size().width), image.type());

warpAffine(image, rotated_img, rot_matrix, image.size());
imwrite("rotated.jpg", rotated_img);
}

int main(int argc, char* argv[])
{
Mat orig_image = imread(argv[1], 1);
if (orig_image.empty())
{
cout << "!!! Couldn't load " << argv[1] << endl;
return -1;
}

rotate(orig_image, 90);

return 0;
}

最佳答案

找到了一个不涉及 warpAffine() 的解决方案 .

但在此之前,我需要说明(供将来引用)我的怀疑是正确的,您需要在调用 warpAffine() 时传递目的地的大小:

warpAffine(image, rotated_img, rot_matrix, rotated_img.size());

据我所知,这个函数绘制的黑色边框(由偏移量引起)似乎是它的标准行为。我注意到 C 接口(interface)以及在 Mac 和 Linux 上运行的 OpenCV 的 C++ 接口(interface),使用版本 2.3.1a 和 2.3.0。

我最终使用的解决方案比所有这些 扭曲的东西简单得多。您可以使用cv::transpose()cv::flip()将图像旋转 90 度。这里是:

Mat src = imread(argv[1], 1);

cv::Mat dst;
cv::transpose(src, dst);
cv::flip(dst, dst, 1);

imwrite("rotated90.jpg", dst);

----我>

关于c++ - 使用 cv::warpAffine 旋转 cv::Mat 偏移目标图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7813376/

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