Я пытаюсь поворачивать изображение 1296x968 90 градусов с помощью С++ API OpenCV и Я столкнулся с несколькими проблемами.
Ввод:
повернутого:
Как вы можете видеть, у повернутого изображения есть несколько проблем. Во-первых, он имеет тот же размер оригинала, хотя я специально создаю пункт назначения 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;
}