Python 预期Ptr<;cv::UMat>;用于rgb图像的参数

Python 预期Ptr<;cv::UMat>;用于rgb图像的参数,python,opencv,Python,Opencv,我试图找出图像中有多少像素的颜色范围是不同图像中相同像素的颜色范围。我使用的两个图像都是rgb。我想用这样的东西来做,但我坚持 获取参数的预期Ptr difference = cv2.absdiff(imageA, imageB) b, g, r = cv2.split(difference) 我曾尝试将这些图像分类为numpy数组,但随后我得到了错误值error:没有足够的值为split函数解包(预期为3,得到1)。有更好的方法吗 确保imageA和imageB共享相同数量的频道以及相同的宽

我试图找出图像中有多少像素的颜色范围是不同图像中相同像素的颜色范围。我使用的两个图像都是rgb。我想用这样的东西来做,但我坚持 获取参数的预期Ptr

difference = cv2.absdiff(imageA, imageB)
b, g, r = cv2.split(difference)
我曾尝试将这些图像分类为numpy数组,但随后我得到了错误值error:没有足够的值为split函数解包(预期为3,得到1)。有更好的方法吗

  • 确保
    imageA
    imageB
    共享相同数量的频道以及相同的宽度和高度:

    assert(imageA.shape == imageB.shape)
    
  • 确保图像的类型彼此相等:

    assert(imageA.dtype == imageB.dtype)
    
  • 我怀疑(1)或(2)是
    False
    。要计算OpenCV中的绝对差异,数据类型和大小应该完全相同。在调用
    cv2.absdiff
    之前,确保(1)和(2)都是
    True
    cv2.split
    与传入数据类型无关,因此问题不应该存在

    另外,鉴于您在使用NumPy阵列时的错误消息,这使我相信一个图像是灰度图像,另一个是彩色图像。这很有意义,因为当您尝试执行
    cv2.split
    时,它只提供一个通道,而不是三个通道。您需要确保您正在比较苹果和苹果,以便检查图像是否为灰度,并在必要时转换为颜色。只需复制通道,即可从灰度图像创建“彩色”图像。这可以在引擎盖下使用并提供正确的标志来完成。在这种情况下,这将是b
    cv2.COLOR\u bgr2 gray
    (假设您使用
    cv2.imread
    读取图像,我怀疑是这样的)

    因此:

    如果len(imageA.shape)==2:
    imageA=cv2.CVT颜色(imageA,cv2.COLOR_GRAY2BGR)
    如果len(imageB.shape)==2:
    imageB=cv2.CVT颜色(imageB,cv2.COLOR_GRAY2BGR)
    差值=cv2.absdiff(图像A、图像B)
    b、 g,r=cv2.分割(差异)
    
    在absdiff()之前检查imageA和imageB的形状和数据类型我相信这在大多数情况下都能解决问题。我的错是我太傻了,忘了在测试其他东西时,我把它放在了另一个部分,而没有把它拆下来。@Nikitablooussov啊-我没有看到你代码的那一部分!很高兴你明白了!