【问题标题】:Failure to use adaptiveThreshold: CV_8UC1 in function adaptiveThreshold未能使用adaptiveThreshold:函数adaptiveThreshold中的CV_8UC1
【发布时间】:2015-01-16 19:34:24
【问题描述】:

我用过openCV python,遇到了一个错误。

img_blur = cv2.medianBlur(self.cropped_img,5)
img_thresh_Gaussian = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

plt.subplot(1,1,1),plt.imshow(img_thresh_Gaussian, cmap = 'gray')
plt.title("Image"), plt.xticks([]), plt.yticks([])
plt.show()

但我收到了:

cv2.error: /home/phuong/opencv_src/opencv/modules/imgproc/src/thresh.cpp:1280: error: (-215) src.type() == CV_8UC1 in function adaptiveThreshold

我必须安装其他东西吗?

【问题讨论】:

  • 输入必须是8bit,单通道。您可能甚至在应用中值模糊之前就忘记了转换为灰度。
  • CV_8UC1 是源类型,而您的 img_blur 类型必须不同(即需要更改)。目标需要是相同的类型,即 CV8UC1 或更大的类型,如 CV16UC1,以覆盖可能的精度损失。我在 C++ API 中有类似的问题。

标签: python opencv


【解决方案1】:

问题是您正在尝试对非灰度图像使用自适应阈值处理。该功能仅适用于灰度图像。

因此,您必须将图像转换为documentation 中所述的灰度格式。

他们以灰度格式读取图像:img = cv2.imread('dave.jpg',0)。您还可以使用以下命令将其转换为灰度:img_grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

【讨论】:

  • 优秀。我会随时对正确的代码做出很好的解释......
  • 我建议使用命名常量cv2.IMREAD_GRAYSCALE 而不是文字0 作为imread 的第二个参数。它们是相等的,但使用常量更能自我记录。
【解决方案2】:

你应该像这样加载你的文件

src.create(rows, cols, CV_8UC1);
src = imread(your-file, CV_8UC1);

然后

adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 75, 10);

【讨论】:

  • 什么是src type
  • -1;这只是巧合。 imread docs 规定传递给imreadflags 应该是ImreadModes - 以IMREAD_ 开头的常量。您传递的标志CV_8UC1 不是这样的常量,将其用作imread() 标志并不是特别有意义 - 但它恰好起作用,因为CV_8UC1IMREAD_GRAYSCALE 都定义为0 .
【解决方案3】:

你可以把代码稍微改成这样:

img_blur = cv2.medianBlur(self.cropped_img,5).astype('uint8')
img_thresh_Gaussian = cv2.adaptiveThreshold(img_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

只需在模糊时添加 ('uint8') 即可解决我的问题。

【讨论】:

  • 这个解决了我的问题,谢谢!
【解决方案4】:

您必须以灰度读取您的图像,因此请使用以下代码:

image = imread('address', 0)

0 将图像的通道转换为灰度

【讨论】:

    【解决方案5】:

    尝试在imread的第二个参数中加入cv2.IMREAD_GRAYSCALE

    img = cv2.imread(File_path, cv2.IMREAD_GRAYSCALE)

    【讨论】:

      【解决方案6】:

      在阈值化之前将图像转换为灰度:

      img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      img_blur = cv2.medianBlur(img_gray,5)
      img_thresh_Gaussian = cv2.adaptiveThreshold(img_blur, 255,
              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
      

      【讨论】:

        【解决方案7】:

        要解决此问题,您需要使用 0(零)作为图像路径以外的另一个参数来加载灰度图像。
        img = cv2.imread(imagepath, 0)

        img = cv2.imread(imagepath, cv2.IMREAD_GRAYSCALE)

        【讨论】:

        • 我尝试了您的解决方案以及其他人在此线程上提供的解决方案。似乎没有任何工作。我在 cv2.HoughLines(cdst, 1, np.pi / 180, 150, None, 0, 0) 调用时遇到错误,并带有相同的错误消息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-07
        • 1970-01-01
        • 1970-01-01
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多