我正在尝试使用OpenCV的C++ API将一个1296x968像素的图像逆时针旋转90度,但是遇到了一些问题。
输入:
旋转后结果:
如您所见,旋转后的图像存在一些问题。首先,它与原始图像具有相同的大小,即使我明确地使用反向大小创建目标
我怀疑这是由于我调用
第二个问题是,
Mat
。因此,目标图像被裁剪。我怀疑这是由于我调用
warpAffine()
并传递原始Mat
的大小而不是目标Mat
的大小。但是我这样做是因为我遵循了这个答案,但现在我怀疑这个答案可能是错误的。所以这是我的第一个疑问/问题。第二个问题是,
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;
}
cv::warpAffine
的文档中:dst-目标图像;将具有大小dsize和与src相同的类型。 - znkr