当前位置: 首页 > 知识库问答 >
问题:

在照片上鲁棒地裁剪旋转边界框

令狐辉
2023-03-14

我正在尝试鲁棒地提取轮廓的旋转边界框。我想拍一张图像,找到最大的轮廓,得到它旋转的边界框,旋转图像使边界框垂直,并裁剪到大小。

为了演示,这里有一个原始图像链接在下面的代码中。我想最终把那只鞋旋转到垂直方向,裁剪成合适的尺寸。这个答案中的以下代码似乎适用于opencv行等简单图像,但不适用于照片。

最终得到这个,旋转和裁剪错误:

编辑:将阈值类型更改为cv2后。THRESH_BINARY_INV,它现在已正确旋转,但裁剪错误:

import cv2
import matplotlib.pyplot as plt
import numpy as np
import urllib.request
plot = lambda x: plt.imshow(x, cmap='gray').figure


url = 'https://i.imgur.com/4E8ILuI.jpg'
img_path = 'shoe.jpg'

urllib.request.urlretrieve(url, img_path)
img = cv2.imread(img_path, 0)
plot(img)


threshold_value, thresholded_img = cv2.threshold(
    img, 250, 255, cv2.THRESH_BINARY)
_, contours, _ = cv2.findContours(thresholded_img, 1, 1)
contours.sort(key=cv2.contourArea, reverse=True)

shoe_contour = contours[0][:, 0, :]
min_area_rect = cv2.minAreaRect(shoe_contour)

def crop_minAreaRect(img, rect):

    # rotate img
    angle = rect[2]
    rows, cols = img.shape[0], img.shape[1]
    M = cv2.getRotationMatrix2D((cols / 2, rows / 2), angle, 1)
    img_rot = cv2.warpAffine(img, M, (cols, rows))

    # rotate bounding box
    rect0 = (rect[0], rect[1], 0.0)
    box = cv2.boxPoints(rect)
    pts = np.int0(cv2.transform(np.array([box]), M))[0]
    pts[pts < 0] = 0

    # crop
    img_crop = img_rot[pts[1][1]:pts[0][1],
                       pts[1][0]:pts[2][0]]

    return img_crop


cropped = crop_minAreaRect(thresholded_img, min_area_rect)
plot(cropped)

如何获得正确的裁剪?

共有1个答案

仲元凯
2023-03-14

经过一些研究,这就是我得到的:

我是这样得到它的:

    < li >在每一面填充原始图像(在我的例子中为500像素) < li >找到鞋子的四个角点(这四个点应该形成一个包围鞋子的多边形,但不需要正好是矩形) < li >使用此处的代码裁剪鞋子:

img = cv2.imread("padded_shoe.jpg")
# four corner points for padded shoe
cnt = np.array([
    [[313, 794]],
    [[727, 384]],
    [[1604, 1022]],
    [[1304, 1444]]
])
print("shape of cnt: {}".format(cnt.shape))
rect = cv2.minAreaRect(cnt)
print("rect: {}".format(rect))

box = cv2.boxPoints(rect)
box = np.int0(box)
width = int(rect[1][0])
height = int(rect[1][1])

src_pts = box.astype("float32")
dst_pts = np.array([[0, height-1],
                    [0, 0],
                    [width-1, 0],
                    [width-1, height-1]], dtype="float32")
M = cv2.getPerspectiveTransform(src_pts, dst_pts)
warped = cv2.warpPerspective(img, M, (width, height))

干杯,希望有帮助。

 类似资料:
  • 我正在用Java制作简单的图像编辑器。我的问题是,当我旋转被裁剪的图像时,我将尝试在图像上显示它: 轮换前http://i.imgur.com/KjtHslb.jpg 经过45度http://i.imgur.com/SKOEFP7.jpg 旋转90度后,i[dot]imgur[dot]com/4NrABIA.jpg 看起来 JPanel 将旋转图像裁剪为原始图像的大小,我不知道为什么:/所以我在寻

  • 问题内容: 我有一个div,其border-radius设置为某个值(比方说10px),还有一个嵌套的div,它是其父级的完整宽度和高度。 我注意到,尽管溢出被设置为隐藏,但父母并没有将孩子夹在圆角上。另一个stackoverflow线程指示此行为是“设计使然”: …我不禁注意到“拐角裁剪”部分中的以下描述: 剪切到边框或填充边缘的其他效果(例如“可见”以外的“溢出”)也必须剪切到曲线。替换元素的

  • 问题内容: 我想用PHP裁剪图像并保存文件。我知道您应该使用GD库,但我不确定如何使用。有任何想法吗? 谢谢 问题答案: 您可以用来裁剪图像的必需部分。该命令如下所示: 来自PHP.net的代码- 从源图像中裁剪出一个80x40像素的图像

  • 裁剪是移去部分照片以打造焦点或加强构图效果的过程。在 Photoshop 中使用裁剪工具裁剪并拉直照片。裁剪工具是非破坏性的,您可以选择保留裁剪的像素以便稍后优化裁剪边界。裁剪工具还提供直观的方法,可让您在裁剪时拉直照片。 对于所有操作,可视化指南都提供了交互式预览。在您裁剪或拉直照片时,实时反馈可帮助您以可视的方式呈现最终结果。 裁剪照片 在工具栏中,选择裁剪工具。裁剪边界显示在照片的边缘上。

  • 本文向大家介绍iOS实现裁剪框和图片剪裁功能,包括了iOS实现裁剪框和图片剪裁功能的使用技巧和注意事项,需要的朋友参考一下 图片处理中经常用的图片剪裁,就是通过剪裁框确定图片剪裁的区域,然后剪去该区域的图片,今天实现了一下,其实图片剪裁本身不难,主要剪裁框封装发了点时间,主要功能可以拖动四个角缩放,但不能超出父视图,拖动四个边单方向缩放,不能超出父视图,拖动中间部分单单移动,不改变大小,不能超出父

  • 本文向大家介绍python实现对图片进行旋转,放缩,裁剪的功能,包括了python实现对图片进行旋转,放缩,裁剪的功能的使用技巧和注意事项,需要的朋友参考一下 先说明下,我这是对某个目录下的图片名称进行操作,该目录下的图片名称为1.jpg,2.jpg。。。。。这样类似的图片名。 1.旋转 2.放缩 3.裁剪 以上这篇python实现对图片进行旋转,放缩,裁剪的功能就是小编分享给大家的全部内容了,希