gpt4 book ai didi

c++ - 不裁剪图像旋转

转载 作者:行者123 更新时间:2023-11-30 03:15:21 32 4
gpt4 key购买 nike

亲爱的,使用下面的代码,我旋转了我的 cv::Mat 对象(我没有使用任何 Cv 的函数,除了 load/save/convertionColor..,因为这是一个学术项目)并且我收到了一个裁剪过的图像

旋转函数:

float rads = angle*3.1415926/180.0;
float _cos = cos(-rads);
float _sin = sin(-rads);
float xcenter = (float)(src.cols)/2.0;
float ycenter = (float)(src.rows)/2.0;

for(int i = 0; i < src.rows; i++)
for(int j = 0; j < src.cols; j++){

int x = ycenter + ((float)(i)-ycenter)*_cos - ((float)(j)-xcenter)*_sin;
int y = xcenter + ((float)(i)-ycenter)*_sin + ((float)(j)-xcenter)*_cos;
if (x >= 0 && x < src.rows && y >= 0 && y < src.cols) {
dst.at<cv::Vec4b>(i ,j) = src.at<cv::Vec4b>(x, y);
}
else {
dst.at<cv::Vec4b>(i ,j)[3] = 0;
}
}

before

after

我想知道,如何在每次旋转时保持完整图像。我可能在我的功能中遗漏了什么吗?提前致谢

最佳答案

旋转后的图像通常必须比旧图像大才能存储所有像素值。

每个点(x,y)被翻译成

(x', y') = (x*cos(rads) - y*sin(rads), x*sin(rads) + y*cos(rads))

高度为 h 的图像和宽度 w , 以 (0,0) 为中心,以

(h/2, w/2)
(h/2, -w/2)
(-h/2, w/2)
(-h/2, -w/2)

有一个新的高度

h' = 2*y' = 2 * (w/2*sin(rads) + h/2*cos(rads))

和新的宽度

w' = 2*x' = 2 * (w/2*cos(rads) + h/2*sin(rads))

0 <= rads <= pi/4 .是x * y <= x' * y'rads != k*pi/2k = 1, 2, ...它是 x * y < x' * y'

在任何情况下,旋转图像的区域与旧图像的区域大小相同或更大。

如果您使用旧尺寸,则会切掉边角。

例子:

您的图片有 h=1 , w=1rads=pi/4 .您需要一个新图像 h'=sqrt(2)=1.41421356237w'=sqrt(2)=1.41421356237存储所有像素值。来自 (1,1) 的像素被转换为 (0, sqrt(2))。

关于c++ - 不裁剪图像旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57097521/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com