Проблема вращения изображения в C++
всем привет ;-)
Я пытаюсь повернуть изображение в C++ с помощью пользовательского ввода
мне не разрешается использовать какую-либо библиотеку, кроме импорта изображения
я действительно перепробовал все и искал в интернете в течение нескольких дней, но либо он не вращается правильно, либо есть пиксельные ошибки
Очень надеюсь, что вы сможете мне помочь
Заранее спасибо
Что я уже пробовал:
#include <opencv2 core="" core.hpp=""> #include <opencv2 highgui="" highgui.hpp=""> #include <opencv2 imgproc="" imgproc.hpp=""> #include <iostream> #include <math.h> #define PI 3.14159265 using namespace std; using namespace cv; int main() { int rotateAmount = 90; Mat image = imread("/Users/Documents/Media/OpenCvProjects/mini/Final_Graphic_Square.jpg", CV_LOAD_IMAGE_COLOR); Mat imageRotated = imread("/Users/Documents/Media/OpenCvProjects/mini/Final_Graphic_Square.jpg", CV_LOAD_IMAGE_COLOR); double sinus = abs(sin(rotateAmount*PI/180)); double cosinus = abs(cos(rotateAmount*PI/180)); for (int y=0; y<image.rows; y++) { for (int x = 0; x< image.cols; x++) { int tempX = round((x*cosinus + y*sinus)); //x*(cos(rotateAmount) - sin(rotateAmount)); int tempY = round((y*cosinus + x*sinus)); //y*( sin(rotateAmount) - cos(rotateAmount)); imageRotated.at<vec3b>(y, x) = image.at<vec3b>(tempY, tempX); } } if (image.data && !image.empty()){ namedWindow("Original Image"); imshow("Original Image", image); } if (imageRotated.data && !imageRotated.empty()){ namedWindow("Rotated Image"); imshow("Rotated Image", imageRotated); } cvWaitKey(0); }
[no name]
Я не проверял тщательно, но одна проблема, которую я вижу, - это происхождение. Вы должны подумать о том, чтобы повернуть к "виртуальному источнику", который является центром вашего изображения. В данный момент Вы вращаетесь вокруг левой/верхней части вашего изображения. Имейте в виду, что в этом случае также используетсяabs(....)
должно быть, устарело, но нужно добавить некоторую проверку диапазона.
Посмотрите также здесь, Решение №3 от Стефана Ланга: проблема с вращением изображения c++[^]
@Stefan63
Member 13595241
Большое вам спасибо за ваш ответ ;-) ... Я попробую это сделать... Я заставил его правильно вращаться, изменив
int tempX = round((x*cosinus + y*sinus)); to int tempX = round((x*cosinus - y*sinus)); теперь он правильно вращается на 90 градусов и 45 градусов, но ничего не происходит, когда я набираю 180 градусов.. Поэтому я постараюсь заставить его вращаться от центра
[no name]
Это завещание должно дать вам также некоторые идеи: Матрица вращения - Википедия[^]
Не беспокойтесь о куче теорий. Это действительно стоит понять, но на самом деле не нужно разбираться в деталях, чтобы идти дальше. Сконцентрируйтесь на:
x'=x cos(тета) - y sin(тета)
y'=x sin(тета) + y cos(тета)
[no name]
Хорошая статья здесь на CP: Матричное преобразование изображений с использованием .NET GDI+[^]