OpenCV Python поворачивает изображение на X градусов вокруг определенной точки - PullRequest
36 голосов
/ 28 января 2012

Мне трудно найти примеры поворота изображения вокруг определенной точки на определенный (часто очень маленький) угол в Python с использованием OpenCV.

Это то, что я имею до сих пор, но в результате получается очень странное изображение, но оно несколько повернуто:

def rotateImage( image, angle ):
    if image != None:
        dst_image = cv.CloneImage( image )

        rotate_around = (0,0)
        transl = cv.CreateMat(2, 3, cv.CV_32FC1 )

        matrix = cv.GetRotationMatrix2D( rotate_around, angle, 1.0, transl )
        cv.GetQuadrangleSubPix( image, dst_image, transl )
        cv.GetRectSubPix( dst_image, image, rotate_around )

    return dst_image

Ответы [ 9 ]

43 голосов
/ 28 января 2012
import numpy as np

def rotateImage(image, angle):
  image_center = tuple(np.array(image.shape[1::-1]) / 2)
  rot_mat = cv2.getRotationMatrix2D(image_center, angle, 1.0)
  result = cv2.warpAffine(image, rot_mat, image.shape[1::-1], flags=cv2.INTER_LINEAR)
  return result

Предполагается, что вы используете версию cv2, этот код находит центр изображения, которое вы хотите повернуть, вычисляет матрицу преобразования и применяется к изображению.

27 голосов
/ 08 сентября 2013

или намного проще в использовании SciPy

from scipy import ndimage

#rotation angle in degree
rotated = ndimage.rotate(image_to_rotate, 45)

см здесь для более подробной информации.

8 голосов
/ 27 апреля 2014

Функция cv2.warpAffine принимает параметр формы в обратном порядке: (столбец, строка), о котором в ответах выше не упоминается.Вот что у меня сработало:

import numpy as np

def rotateImage(image, angle):
    row,col = image.shape
    center=tuple(np.array([row,col])/2)
    rot_mat = cv2.getRotationMatrix2D(center,angle,1.0)
    new_image = cv2.warpAffine(image, rot_mat, (col,row))
    return new_image
7 голосов
/ 04 октября 2015
def rotate(image, angle, center = None, scale = 1.0):
    (h, w) = image.shape[:2]

    if center is None:
        center = (w / 2, h / 2)

    # Perform the rotation
    M = cv2.getRotationMatrix2D(center, angle, scale)
    rotated = cv2.warpAffine(image, M, (w, h))

    return rotated
4 голосов
/ 24 сентября 2018

У меня были проблемы с некоторыми из вышеперечисленных решений, с получением правильного "bounding_box" или нового размера изображения.Поэтому вот моя версия

def rotation(image, angleInDegrees):
    h, w = image.shape[:2]
    img_c = (w / 2, h / 2)

    rot = cv2.getRotationMatrix2D(img_c, angleInDegrees, 1)

    rad = math.radians(angleInDegrees)
    sin = math.sin(rad)
    cos = math.cos(rad)
    b_w = int((h * abs(sin)) + (w * abs(cos)))
    b_h = int((h * abs(cos)) + (w * abs(sin)))

    rot[0, 2] += ((b_w / 2) - img_c[0])
    rot[1, 2] += ((b_h / 2) - img_c[1])

    outImg = cv2.warpAffine(image, rot, (b_w, b_h), flags=cv2.INTER_LINEAR)
    return outImg
4 голосов
/ 21 апреля 2016
import imutils

vs = VideoStream(src=0).start()
...

while (1):
   frame = vs.read()
   ...

   frame = imutils.rotate(frame, 45)

Подробнее: https://github.com/jrosebr1/imutils

3 голосов
/ 02 сентября 2013

Быстрая настройка @ alex-rodrigues answer ... имеет дело с формой, включая количество каналов.

import cv2
import numpy as np

def rotateImage(image, angle):
    center=tuple(np.array(image.shape[0:2])/2)
    rot_mat = cv2.getRotationMatrix2D(center,angle,1.0)
    return cv2.warpAffine(image, rot_mat, image.shape[0:2],flags=cv2.INTER_LINEAR)
1 голос
/ 27 апреля 2019

Вы можете легко вращать изображения, используя opencv python-

def funcRotate(degree=0):
    degree = cv2.getTrackbarPos('degree','Frame')
    rotation_matrix = cv2.getRotationMatrix2D((width / 2, height / 2), degree, 1)
    rotated_image = cv2.warpAffine(original, rotation_matrix, (width, height))
    cv2.imshow('Rotate', rotated_image)

Если вы думаете о создании трекбара, просто создайте трекбар с помощью cv2.createTrackbar() и вызовите функцию funcRotate() изосновной сценарийТогда вы можете легко повернуть его в любой степени, которую вы хотите.Полную информацию о реализации можно также найти здесь - Поворот изображения на любую степень с помощью трекбаров в opencv

0 голосов
/ 04 июля 2019

Вы можете просто использовать пакет imutils для вращения.у него есть два метода

  1. поворот : поворот изображения на заданный угол.однако недостатком является то, что изображение может быть обрезано, если оно не является квадратным изображением.
  2. Rotate_bound : оно преодолевает проблему, возникшую с поворотом.Он соответствующим образом корректирует размер изображения при повороте изображения.

Более подробную информацию вы можете получить в этом блоге: https://www.pyimagesearch.com/2017/01/02/rotate-images-correctly-with-opencv-and-python/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...