问题描述
在试图找到一种快速的方法来“骨架化”边缘时,我遇到了包含在 OpenCV Contrib 中的 thinning
函数。输入是具有不同大小但在 np.shape(originalEdges) == (200,200)
范围内的梯度的图像。
我尝试了两种实现该功能的方法。首先,使用命令 thinnedImg = cv2.ximgproc.thinning(originalEdges)
将函数的输出分配给一个新变量。使用它,程序会抛出以下错误:(-209:Sizes of input arguments do not match) The operation is neither 'array op array'(where arrays have the same size and type),nor 'array op scalar',nor 'scalar op array' in function 'binary_op'
.
我尝试了另一种方法 cv2.ximgproc.thinning(originalEdges,thinnedImg)
,其中我将新变量初始化为 thinnedImg = np.zeros( np.shape(originalEdges).astype(int)
。通过这种方式,我确保尺寸正确。通过使用 print('Type1 :',type(originalEdges[0,0]),',type 2:',type(thinnedImg[0,0]) )
,我确保两者都具有相同的数据类型,即 <class 'numpy.int64'>
。此方法会引发 TypeError:Expected Ptr<cv::UMat> for argument 'dst'
。请注意,它专门针对目标对象(这是函数的第二个参数)引发错误,这意味着源对象(第一个参数)最初得到了很好的处理。
正如我在网上发现的 cv::UMat
等价于 float32
类型,我相应地修改了代码并制作了这种类型的两个输入。这次我再次收到错误信息,告诉我 Sizes of input arguments do not match
。但是,上面的代码使用源对象的形状来创建目标对象。使用 np.shape()
确认大小相等。令人惊讶的是,如果我使用 float32
和 float64
的组合不会生成类型错误,但再次抛出大小错误。
我尝试的最后一件事是(对于两个对象的 float 和 int 数据类型),并将其与使用 cv2.UMat(thinnedImage)
用于目标对象和 cv2.UMat(originalEdges)
用于源对象,分别和同时为两者。这仍然会增加尺寸误差。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)