2014-12-20 2 views
2

Я пытаюсь применить преобразование перспективы ко всему изображению с помощью OpenCV. Для этого я сначала вычислил начальное преобразование на основе выбранных мной точек, а затем попытаюсь преобразовать углы изображения и перевести их, чтобы получить окончательное оптимальное преобразование. Я получаю преобразование успешно, но затем применяя cv2.perspectiveTransform() функция всегда подбрасывает эту ошибку:Python Open CV overviewTransform()

OpenCV Error: Assertion failed (scn + 1 == m.cols && (depth == CV_32F || depth == CV_64F)) in perspectiveTransform, file /tmp/opencv-PEaA0A/opencv-2.4.9/modules/core/src/matmul.cpp, line 1936 

Оба Numpy массивы я обеспечиваю функцию имеют float64 DTYPE поэтому я полагаю, ошибка составляет от SCN + 1 == m.cols. Вот мой код:

initTransform = cv2.getPerspectiveTransform(pointsIn,pointsOut) 
imgCorners = np.array([[0,0],[self.image.size/float(self.image.shape[0]),0]],dtype=np.float64) 
outputCorners = cv2.perspectiveTransform(corners,initTransform) 

Спасибо за вашу помощь!

ответ

5

Попробуйте следующий код, то первый аргумент perspectiveTransform является объектом Mat, который соответствует 3 тусклом массива в NumPy:

import cv2 
import numpy as np 

w, h = 512, 512 
src = np.array(
    [[0, 0], [w - 1, 0], [w - 1, h - 1], [0, h - 1]], dtype=np.float32) 
dst = np.array(
    [[300, 350], [800, 300], [900, 923], [161, 923]], dtype=np.float32) 

m = cv2.getPerspectiveTransform(src, dst) 
result = cv2.perspectiveTransform(src[None, :, :], m) 
+1

Спасибо, что определенно не для меня ясно из документации и любой другой момент этого вопрос был задан, люди сосредоточились на части с плавающей запятой ошибки. – user1549912

+2

Почему ввод 'перспективаTransform()' is 'src [None,:,:]' не просто 'src'? Каждый элемент должен быть 2D-матрицей вместо вектора? @ user1549912 – nn0p

Смежные вопросы