Учитывая это изображение:
Я хотел бы сделать так, чтобы он вращался и растягивался, чтобы полностью поместиться в ограничительной рамке без пробелов на внешней сторонесамая большая прямоугольная коробка. Это также должно учитывать худшую перспективу, как в приведенных ниже ссылках.
По сути, хотя это не заметно, прямоугольник немного поворачивается, и я хотел бы исправить это искажение.
Однако при попытке получить четыре точки контура я получил ошибку. Я проверил и использовал аппроксимацию контуров, чтобы изолировать и получить только релевантные контуры, и как вы можете видеть на изображении, это успешно, хотя я не могу использовать перспективную деформацию на нем.
Я уже пробовалссылки здесь:
И следовал за ними, только с небольшими изменениями (например, не уменьшая масштаб изображения, а затем увеличивая его масштаб) и другим входным изображением.
Существует аналогичная ошибка, с которой сталкивается читательв комментариях, но автор только что сказал использовать контурное приближение. Я сделал это, но все еще получаю ту же ошибку.
Я уже извлек контур (который вместе с его ограничительной рамкой - изображение, показанное ранее), и использовал этот код для попытки перцептивной деформации:
def warp_perspective(cnt):
# reshape cnt to get tl, tr, br, bl points
pts = cnt.reshape(4, 2)
rect = np.zeros((4, 2), dtype="float32")
s = pts.sum(axis=1)
rect[0] = pts[np.argmin(s)]
rect[2] = pts[np.argmin(s)]
diff = np.diff(pts, axis=1)
rect[1] = pts[np.argmin(diff)]
rect[2] = pts[np.argmax(diff)]
# solve for the width of the image
(tl, tr, br, bl) = rect
widthA = np.sqrt(((br[0] - bl[0]) ** 2) + ((br[1] - bl[1]) ** 2))
widthB = np.sqrt(((tr[0] - tl[0]) ** 2) + ((tr[1] - tl[1]) ** 2))
# solve for the height of the image
heightA = np.sqrt(((tr[0] - br[0]) ** 2) + ((tr[1] - br[1]) ** 2))
heightB = np.sqrt(((tl[0] - bl[0]) ** 2) + ((tl[1] - bl[1]) ** 2))
# get the final dimensions
maxWidth = max(int(widthA), int(widthB))
maxHeight = max(int(heightA), int(heightB))
# construct the dst image
dst = np.array([
[0, 0],
[maxWidth - 1, 0],
[maxWidth - 1, maxHeight - 1],
[0, maxHeight - 1]], dtype="float32")
# calculate perspective transform matrix
# warp the perspective
M = cv2.getPerspectiveTransform(rect, dst)
warp = cv2.warpPerspective(orig, M, (maxWidth, maxHeight))
cv2.imshow("warped", warp)
return warp
Функция принимает cnt
в качестве одного контура.
При запуске я столкнулся с этой ошибкой, о которой упоминал ранее:
in warp_perspective
pts = cnt.reshape(4, 2)
ValueError: cannot reshape array of size 2090 into shape (4,2)
Что я совсем не понимаю,Я успешно выделил и восстановил правильный контур и ограничивающую рамку, и единственное, что я сделал по-другому, это пропустил уменьшение масштаба ..