Member 13595241 Ответов: 1

Проблема вращения изображения в 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(тета)

1 Ответов

Рейтинг:
2

KarstenK

Вы должны установить пиксели другим способом:

imageRotated.at<vec3b>(tempY, tempX) = image.at<vec3b>(y, x);
Это гарантирует, что каждый исходный пиксель переводится. Из-за округления вы также должны иметь дело с пикселями в imageRotated, которые никогда не устанавливаются. Заполните рисунок цветом фона.

Передовое решение состоит в том, чтобы использовать цвет strang (128,128,128) и проверить после поворота, какие точки не окрашены, и смешать цвет от соседа.

Взгляните на мою любимую статью CxImage что делает много манипуляций с изображениями. По крайней мере, вы можете получить несколько хорошо повернутых изображений.


Member 13595241

Спасибо за ваш ответ :-) я действительно благодарен, что это также позаботится о обратном отображении? Заранее спасибо