错误:(210)在函数cv::findTransformECC中,warpMatrix必须是单通道浮点矩阵

2024-04-28 14:41:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我很确定我的图像是在灰度,这应该是单通道,但我得到了这个错误,不知道如何解决它。在

>>> 
=============== RESTART: C:/Users/310293649/Desktop/resize.py ===============
Traceback (most recent call last):
  File "C:/Users/310293649/Desktop/resize.py", line 64, in <module>
    alignment(criteria, warp_mode, warp, nol)
  File "C:/Users/310293649/Desktop/resize.py", line 47, in alignment
    warp = cv2.findTransformECC(im_gray, im1_gray, warp, warp_mode, criteria)
cv2.error: D:\Build\OpenCV\opencv-3.3.0\modules\video\src\ecc.cpp:347: error: (-210) warpMatrix must be single-channel floating-point matrix in function cv::findTransformECC

>>> 

下面是我的代码:我正在通过为每个图像创建图像金字塔来加速我的代码。将图像缩放到最小得到粗略估计并放大。在

^{pr2}$

Tags: inpy图像modelinecv2usersfile
1条回答
网友
1楼 · 发布于 2024-04-28 14:41:40

看起来你的warp矩阵最初是np.float32类型的,但是你用np.dot与另一个不属于np.float32的矩阵进行进一步的矩阵乘法-不指定类型默认为np.float64-因此结果被提升为类型np.float64。您需要确保第二个矩阵也是np.float32类型。这就是findTransformECC抱怨的原因,因为它期望warp矩阵是np.float32类型,因此会出现错误消息。解决此问题最简单的方法是首先创建第二个矩阵,以确保使用np.float64保持精度,然后在将其传递给np.dot时,在乘法之前将其转换为np.float32

# ....
# ....
nol = 3
warp_mode = cv2.MOTION_EUCLIDEAN
if warp_mode == cv2.MOTION_HOMOGRAPHY :
    warp = np.eye(3, 3, dtype=np.float32)
else :
    warp = np.eye(2, 3, dtype=np.float32)

# New - Create temporary placeholder for new matrix
tmp = np.array([[1, 1, 2], [1, 1, 2], [1/2, 1/2, 1]])**(1-nol)

# Matrix multiply with it but ensuring it's of type np.float32
warp = np.dot(warp, tmp.astype(np.float32))

# ....
# ....
# Rest of your code follows

相关问题 更多 >