Python 根据坐标裁剪图像(考虑比例因子)

Python 根据坐标裁剪图像(考虑比例因子),python,numpy,python-3.7,cv2,Python,Numpy,Python 3.7,Cv2,我有一个简单的图像文件,如下所示,我定义了一组坐标,我想裁剪 裁剪选择发生在前端,这意味着用户看到的图像将缩小以适合用户的屏幕。以下是图像的信息: imageWidth:965 图像高度:1365.46875 基于上述宽度和高度,您在图像中看到的框的坐标为: “x”:405.5, “y”:130, “高度”:36 “宽度”:129 (所有数字均以像素为单位) 在我的后端,在我的Python代码中,我希望确保我的裁剪与用户看到的一样。所以我想,我必须计算x,y比例因子: 将numpy导入为n

我有一个简单的图像文件,如下所示,我定义了一组坐标,我想裁剪

裁剪选择发生在前端,这意味着用户看到的图像将缩小以适合用户的屏幕。以下是图像的信息:

imageWidth:965
图像高度:1365.46875
基于上述宽度和高度,您在图像中看到的框的坐标为:

“x”:405.5,
“y”:130,
“高度”:36
“宽度”:129
(所有数字均以像素为单位)

在我的后端,在我的Python代码中,我希望确保我的裁剪与用户看到的一样。所以我想,我必须计算x,y比例因子:

将numpy导入为np
进口cv2
#打开原始图像并获取宽度/高度
image=cv2.imread(图像文件)
高度,宽度=图像。形状[0:2]
原始图像的高度和宽度为:
H:3508,W:2479

然后,我计算比例因子:

#设置比例因子
缩放系数x=宽度/图像宽度
缩放工厂=高度/图像高度
这等于:缩放X:2.5689119170984456,缩放Y:2.569081130564138

计算比例因子后,我将原始坐标转换为相应的比例:

crop_x=scalingFactorX*框['x']
裁剪y=缩放工厂*框['y']
裁剪w=缩放系数x*框['width']
裁剪高度=缩放工厂*框['height']
最后,我裁剪图像并保存它:

crop = image[int(crop_y):int(crop_y)+int(crop_h),
             int(crop_x): int(crop_x) + int(crop_w)]
cv2.imwrite("cropped_image.png", crop)
但是,裁剪区域不正确。它只是一个空白图像(我猜坐标有点偏离,这意味着它最终会裁剪页面的另一部分):

结果是331 x 92像素的空白图像

我不确定我做错了什么

编辑:
可以找到原始图像。

@martineau这是转换后的坐标(
crop=
):
333:425、1041:1372
-我不太确定如何再次检查原始图像的坐标,以便在视觉上看到,如果我做得太差了?用手计算-这似乎不太难-并将其与实际得到的结果进行比较。我在excel表格中进行了计算,得到了相同的结果(相同的比例因子和相同的坐标),那么您使用信息裁剪图像的方式似乎是错误的。对不起,我不是cv2的专家,但也许你应该仔细看看它的文档和/或看看你是否能在某处找到一些示例代码。为什么你的问题中有一个实际的图像和一个指向原始图像的链接?只要正确的图像就更好了-我们不需要两个,谢谢。@martineau这是转换后的坐标(
crop=
):
333:425、1041:1372
-我不太确定如何再次检查原始图片的坐标,以便在视觉上看到,如果我做得太差了?用手计算-这似乎不太难-并将其与实际得到的结果进行比较。我在excel表格中进行了计算,得到了相同的结果(相同的比例因子和相同的坐标),那么您使用信息裁剪图像的方式似乎是错误的。对不起,我不是cv2的专家,但也许你应该仔细看看它的文档和/或看看你是否能在某处找到一些示例代码。为什么你的问题中有一个实际的图像和一个指向原始图像的链接?正确的图像会更好-我们不需要两个,谢谢。