我想在一些个体的(x,y)点上使用与我在使用cv2.warpAffine处理图像时相同的仿射矩阵M。看起来cv2.transform是正确的方法。但当我尝试发送一个Nx2点矩阵时,它被否定了。
src = np.array([
[x1,y1],[x2,y2],[x3,y3],[x4,y4]], dtype = "float32")
print('source shape '+str(src.shape))
dst=cv2.transform(src,M)
cv2.error: /home/jeremy/sw/opencv-3.1.0/modules/core/src/matmul.cpp:1947: error: (-215) scn == m.cols || scn + 1 == m.cols in function transform
我可以只使用numpy算术运算得到所需的变换:
dst = np.dot(src,M[:,0:2]) +M[:,2]
print('dest:{}'.format(dst))
但是我希望理解正在发生的事情。文档说cv2.transform想要的通道数等于M中列数,但我不清楚通道将是什么 - 可能是“x”通道和“y”通道,但是第三个将会是什么,不同的行代表什么?
np.array([[[x1, y1]], [[x2, y2]],...])
的形式出现。他们通常希望在点变换中使用这种形式——一个单列或行向量,其长度为点数,通道数等于坐标数。第三个坐标可能是第三个维度中的坐标——毕竟,变换矩阵不仅适用于2D变换。 - alkasm(np.dot(M[:,:2], a.T)+M[:,2].reshape(2,1)).T
。 - thisisbhavin