Я протестировал openCV и его функцию cv :: warpAffine, позволяющую переводить с точностью до субпикселя (см. MWE ниже).
После того, как на qtcentre.org были обнаружены некоторые старые неотвеченные темы, мне кажется, что Qtпросто не позволяет перевод с точностью до субпикселя.Пожалуйста, исправьте меня, если я ошибаюсь.
Для Qt я нашел только обходные пути, чтобы сначала масштабировать изображение, переводить с точностью до пикселя и снова уменьшать.К сожалению, этот подход слишком дорогой для моего случая использования.
MWE с opencv:
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
int main(int argc, char** argv) {
// parameters
std::string PATH_IMG_IN = "../img_test_rect.jpg";
std::string PATH_IMG_OUT = "../img_out.jpg";
// load image
cv::Mat img = cv::imread(PATH_IMG_IN, CV_LOAD_IMAGE_GRAYSCALE);
if (!img.data) // Check for invalid input
{
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
// rotate image
cv::Mat img_new = cv::Mat::ones(img.size(), img.type()) * 0.5; // another type = CV_8U
cv::Mat mat_transform = (cv::Mat_<float>(2, 3) << 1, 0, 0.5, 0, 1, 0);
cv::warpAffine(img, img_new, mat_transform, img_new.size());
// show image
cv::imshow("Display window", img_new);
// save image
cv::imwrite(PATH_IMG_OUT, img_new);
// wait for the user to press any key:
cv::waitKey(0);
return 0;
}