【问题标题】:Pass numpy array to opencv function inputarray result in array changed将 numpy 数组传递给 opencv 函数 inputarray 导致数组更改
【发布时间】:2020-06-19 01:50:44
【问题描述】:

我向cv2.findContours()传递了一个二进制图像(掩码),我发现mask虽然是一个输入参数,但它会改变。

    print('scale: [{} , {}]'.format(np.amin(mask),np.amax(mask)))
    contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    print('scale: [{} , {}]'.format(np.amin(mask),np.amax(mask)))

将输出:

scale: [0,255]
scale: [0,130]

同时:


    print('scale: [{} , {}]'.format(np.amin(mask),np.amax(mask)))
    contours = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
    print('scale: [{} , {}]'.format(np.amin(mask),np.amax(mask)))

将工作,并打印

scale: [0, 255]
scale: [0, 255]

我想这可能类似于通过引用传递,但我不太擅长 python 并且对python-opencv bind 很陌生。谁能告诉我原因?

提前致谢!

【问题讨论】:

  • 我无法使用 opencv 4.1.2 重现此行为。你能提供你的opencv版本吗?
  • 我猜你使用的OpenCV早于3.2,并且没有正确阅读findContours的文档:“该函数在提取轮廓时修改图像。”

标签: python arrays numpy opencv


【解决方案1】:

doc 中提到:

Python: cv.FindContours(image, storage, mode=CV_RETR_LIST, method=CV_CHAIN_APPROX_SIMPLE, offset=(0, 0)) → 轮廓 参数:
image – 源,8 位单通道图像。非零像素是 视为 1。零像素保持为 0,因此图像被视为 二进制 .您可以使用 compare() , inRange() , threshold() , AdaptiveThreshold() 、 Canny() 等创建二值图像 出灰度或彩色之一。 函数修改图像同时 提取轮廓。如果模式等于 CV_RETR_CCOMP 或 CV_RETR_FLOODFILL,输入也可以是32位整数图像 标签 (CV_32SC1)。

【讨论】:

  • 是的,我错过了这个声明。谢谢
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多