Python 如何在图像旋转后获得新的坐标?

Python 如何在图像旋转后获得新的坐标?,python,opencv,image-processing,Python,Opencv,Image Processing,我正在尝试在图像旋转后获得新的坐标。但是,我有一个相对坐标。所有四个坐标都由0到1之间的值组成。例如(x1,y1)=[0.15,0.15](x2,y2)=[0.8,0.15](x3,y3)=[0.8,0.8](x4,y4)=[0.15,0.8] 当我旋转图像n度时,我想得到新的x,y坐标 image=image.open(os.path.join('./AlignImages',image\u name)) labels=np.array(list(map(float,a.split(“”[1:

我正在尝试在图像旋转后获得新的坐标。但是,我有一个相对坐标。所有四个坐标都由0到1之间的值组成。例如(x1,y1)=[0.15,0.15](x2,y2)=[0.8,0.15](x3,y3)=[0.8,0.8](x4,y4)=[0.15,0.8] 当我旋转图像n度时,我想得到新的x,y坐标

image=image.open(os.path.join('./AlignImages',image\u name))
labels=np.array(list(map(float,a.split(“”[1:]))).astype('float32'))
#如果标签==[0.1 0.1 0.5 0.1 0.5 0.5 0.1 0.5][x1 y1 x2 y2 x3 y3 x4 y4]
labels=np.vstack((标签[0::2],标签[1::2]))
#[0.1 0.5 0.5 0.1][x1 x2 x3 x4]
#[0.1 0.1 0.5 0.5][y1 y2 y3 y4]
打印(标签)
labels=np.数组([[labels[0][0]-0.5,labels[0][1]-0.5,labels[0][2]-0.5,labels[0][3]-0.5],[0.5-labels[1][0],0.5-labels[1][1],0.5-labels[1][2],0.5-labels[1][3]]))
#这是为了移动图像的中心点。
#调整要旋转的值,因为图像的左上角是(0,0)
图像=图像.旋转(旋转\缩放,展开=真)
#我提供了展开图像的选项,这样旋转后的图像就不会被裁剪。
image.show()
旋转=np.数组([[np.cos(旋转刻度),[np.sin(旋转刻度))],[-1*np.sin(旋转刻度),np.cos(旋转刻度)])
#我定义了一个变换矩阵。
src=np.matmul(旋转、标签)
#将变换矩阵乘以坐标以获得新坐标。
src=np.数组([[src[0][0]+0.5,src[0][1]+0.5,src[0][2]+0.5,src[0][3]+0.5],[0.5+src[1][0],0.5+src[1][1],0.5+src[1][2],0.5+src[1][3]]))
#让左上角为0,再次为0。
打印(src)
但是,此代码似乎不起作用。 我以为我可以在源代码中得到旋转图像的四个相对坐标,但事实并非如此。 我想得到展开图像(旋转图像)中四个顶点的相对坐标。 这些值都应介于0和1之间。
如何获得所需的四个坐标?

问题可能来自旋转点的中心点。根据我在上一个项目中的经验,你需要知道中心点和度

例如:图像围绕中心点(图像的中点)向右旋转90度,现在需要围绕中心点向后旋转90度。C++中的代码(很抱歉我只熟悉C++,但是你可以很容易地把它移植到Python上)
//中心点
点2F中心=(宽度/2,高度/2)
//要旋转的角度,以辐射为单位
//你的情况是-90度
双θ度=角度梯度*180/M_π;
//让矩阵旋转
Mat rotateMatrix=getRotationMatrix2D(中心,θu度,1.0);
//获取地标点的向量
std::矢量输入;
std::矢量输出;
//我们使用相同的旋转矩阵和变换
cv::transform(inputLandmark、outputLandmark、rotateMatrix);

问题可能来自旋转点的中心点。根据我在上一个项目中的经验,你需要知道中心点和度

例如:图像围绕中心点(图像的中点)向右旋转90度,现在需要围绕中心点向后旋转90度。C++中的代码(很抱歉我只熟悉C++,但是你可以很容易地把它移植到Python上)
//中心点
点2F中心=(宽度/2,高度/2)
//要旋转的角度,以辐射为单位
//你的情况是-90度
双θ度=角度梯度*180/M_π;
//让矩阵旋转
Mat rotateMatrix=getRotationMatrix2D(中心,θu度,1.0);
//获取地标点的向量
std::矢量输入;
std::矢量输出;
//我们使用相同的旋转矩阵和变换
cv::transform(inputLandmark、outputLandmark、rotateMatrix);

我在您的代码中没有看到明显的异常。为什么您认为这是错误的?转换后的值必须根据原始坐标系(左上坐标系(0,0))进行适当计算。但是,输出的值超出了0到1之间的范围。这不是异常。我在代码中没有看到明显的异常。为什么您认为这是错误的?转换后的值必须根据原始坐标系(左上坐标系(0,0))进行适当计算。但是,输出的值超出了0到1之间的范围。这不是异常。
[[ 0.24779222  1.00296445  0.7265248  -0.05902794]
 [ 0.8065444   0.41615766  0.2350563   0.60667523]]
// the center point 
Point2f center=(width/2,height/2)

//the angle to rotate, in radiant 
// in your case it is -90 degree
double theta_deg= angleInDegree * 180 /M_PI;

// get the matrix to rotate
Mat rotateMatrix = getRotationMatrix2D(center, theta_deg, 1.0);

// the vector to get landmark points
std::vector<cv::Point> inputLandmark;
std::vector<cv::Point> outputLandmark;

// we use the same rotate matrix and use transform
cv::transform(inputLandmark, outputLandmark, rotateMatrix);