OpenCv contrib函数“细化”不工作

2024-10-06 16:13:38 发布

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

在试图找到一种快速“骨架化”边的方法时,我遇到了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'>。此方法引发类型错误:Expected Ptr<cv::UMat> for argument 'dst'。请注意,它会特别在目标对象(函数的第二个参数)上引发错误,这意味着源对象(第一个参数)最初处理得很好

当我在网上发现cv::UMat将等同于float32类型时,我相应地修改了代码并进行了这两种类型的输入。这一次,我再次得到了错误,告诉我Sizes of input arguments do not match。但是,上面的代码使用源对象的形状来创建目标对象。使用np.shape()确认大小相等。令人惊讶的是,如果使用float32float64的组合,则不会生成类型错误,但会再次抛出大小错误

我尝试的最后一件事是(对于这两个对象的float和int数据类型),并将其与目标对象使用cv2.UMat(thinnedImage)和源对象使用cv2.UMat(originalEdges)相结合,分别使用和同时使用。这仍然会引起大小错误

如何修改此函数的参数以确保其工作


Tags: 对象方法函数类型type错误nparray