2012-01-27 38 views
20

Tôi đang gặp khó khăn khi tìm các ví dụ để xoay hình ảnh xung quanh một điểm cụ thể theo góc cụ thể (thường rất nhỏ) trong Python bằng cách sử dụng OpenCV.OpenCV Python xoay hình ảnh theo độ X xung quanh điểm cụ thể

Đây là những gì tôi có cho đến nay, nhưng nó tạo ra một hình ảnh kết quả rất lạ, nhưng nó có thể xoay một chút:

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 

Trả lời

23
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 

Giả sử bạn đang sử dụng phiên bản CV2, mã mà tìm trung tâm của hình ảnh bạn muốn xoay, tính toán ma trận chuyển đổi và áp dụng cho hình ảnh.

+0

Thanks for the help, tuy nhiên tôi đang sử dụng "cv" mô-đun và bạn đang sử dụng "CV2", do đó phàn nàn của nó đặc biệt về "image.shape" không tồn tại. Tôi đã chỉ được sử dụng mô-đun "cv" cho đến bây giờ, vì vậy tôi không hoàn toàn nhận được tất cả các thay đổi với "cv2" được nêu ra. Tôi biết hình ảnh của tôi là (140.140), vì vậy tôi đã cố gắng mã hóa cứng thay cho image.shape, nhưng nó cũng không giống như vậy. – Mike

+1

Tôi nghĩ rằng tôi có thể đã thực hiện một số tiến bộ, nhưng vẫn gặp sự cố. Đây là mã mới nhất: result = cv2.warpAffine (hình ảnh, rot_mat, cv.GetSize (hình ảnh), cờ = cv2.INTER_LINEAR) Traceback (gần đây nhất gọi cuối cùng): result = cv2.warpAffine (hình ảnh , rot_mat, cv.GetSize (hình ảnh), cờ = cv2.INTER_LINEAR) Lỗi Loại: không phải là một mảng numPy – Mike

+14

tôi có một vấn đề chạy cv2.getRotationMatrix2D (trung tâm = image_center, góc = góc, quy mô = 1) TypeError: function lấy chính xác 2 đối số (3 đã cho) – Hani

2

Chỉnh sửa nhanh câu trả lời @ alex-rodrigues ... đề cập đến hình dạng bao gồm số lượng kênh.

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) 
18

Hoặc sử dụng dễ dàng hơn nhiều SciPy

from scipy import ndimage 

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

thấy here để biết thêm thông tin cách sử dụng.

+0

Tôi đang lặp qua một thư mục png và làm điều này nhưng tôi nhận được một RuntimeError: mặt phẳng xoay không hợp lệ được chỉ định. Mọi bản sửa lỗi? –

+0

Bạn có vượt qua hình ảnh cv mở không? như từ: img = cv2.imread ('messi5.jpg', 0) – fivef

+3

điều này khá chậm đối với tôi –

4

Hàm cv2.warpAffine lấy tham số hình dạng theo thứ tự ngược lại: (col, hàng) mà các câu trả lời ở trên không đề cập đến. Đây là những gì làm việc cho tôi:

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
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 
1
import imutils 

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

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

    frame = imutils.rotate(frame, 45) 

thêm: https://github.com/jrosebr1/imutils

+0

cái này sẽ không cắt bất kỳ hình ảnh nào: 'imutils.rotate_bound (frame, 90)' –

Các vấn đề liên quan