【发布时间】:2017-11-06 18:25:08
【问题描述】:
我想在某些单独的 (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”通道,但第三个通道会是,不同的行表示什么?
【问题讨论】:
-
OpenCV 通常会以
np.array([ [[x1, y1]], [[x2, y2]], ... ])的形式期望他们喜欢的点。他们通常希望将其用于点变换——单个列或行向量,其长度为点数,通道数等于坐标数。第三个坐标可以是三维坐标——变换矩阵毕竟不只是用于二维变换。 -
谢谢你成功了,我在心里把维度顺序倒过来了,chw 而不是 hwc,caffe 太多了跨度>
-
与问题本身无关,但 numpy 等效代码可以正常运行,但不是您想要的正确转换。 cv2.transform 的 numpy 等效值为
(np.dot(M[:,:2], a.T)+M[:,2].reshape(2,1)).T
标签: python opencv numpy affinetransform