【OpenCV错误】error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'threshold'

1. 问题描述

使用threshold进行阈值处理,遇到下面的错误:

opencv-4.0.1/modules/imgproc/src/thresh.cpp:1389: error: (-215:Assertion failed) src.type() == CV_8UC1 in function ‘threshold’

自己的调用代码为:threshold(src, dest, threshold_value, threshold_max, THRESH_OTSU | type_value);

2. solution

Threshold的输入是单通道,但是自己在这里给出了3通道的图像,将src转为单通道图像即可解决该问题。

cvtColor(src, gray_src, CV_RGB2GRAY);
threshold(gray_src, dest, threshold_value, threshold_max, THRESH_OTSU | type_value);

3. other

看到这里提示src.type() == CV_8UC1,以为是类型不一致。

同时查看src.type(),发现是16,所以进行了img.convertTo(src, CV_8UC1);转换,转换后使用src.type()查看还是16,但仍未解决问题。

这里为什么是16?自己找到了下面这些代码,但仍未弄清楚,需要后续解决。

inline
int Mat::type() const
{
    return CV_MAT_TYPE(flags);
}

#define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)
#define CV_MAT_TYPE(flags)      ((flags) & CV_MAT_TYPE_MASK)

#define CV_CN_MAX     512
#define CV_CN_SHIFT   3
#define CV_DEPTH_MAX  (1 << CV_CN_SHIFT)

type函数的作用为:Returns the type of a matrix element.,即返回mat中的元素类型。

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
问题中的错误信息"error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'cv::distanceTransform'"是由OpenCV库中的distanceTransform函数引起的。这个错误是断言失败,意味着输入图像的类型不符合函数的期望类型CV_8UC1CV_8UC1表示一个无符号8位单通道图像。要解决这个问题,你需要确保输入图像的类型是CV_8UC1。 引用中提到了一个类似的错误信息,在threshold函数中断言失败,断言条件是src.type() == CV_8UC1。这意味着在调用distanceTransform函数之前,你可能需要先进行类似的图像阈值化操作,将图像转换为CV_8UC1类型。 引用中提到了一个尝试将图像类型转换为CV_8UC1的方法,使用了img.convertTo(src, CV_8UC1)。然而,这种方法并没有解决问题,可能是因为转换操作没有成功。 解决这个问题的一种方法是确保在调用distanceTransform函数之前,图像已经是CV_8UC1类型。你可以使用cv2.cvtColor函数将图像转换为灰度图像,然后使用cv2.threshold函数进行阈值化操作,确保图像的类型是CV_8UC1。然后再调用distanceTransform函数。 另外,还有可能是在调用distanceTransform函数之前没有正确加载图像或者图像路径不正确导致的错误。你可以检查图像是否正确加载并且路径是否正确。 综上所述,为了解决错误"error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'cv::distanceTransform'",你可以按照以下步骤进行处理: 1. 确保正确加载图像并且图像路径正确。 2. 使用cv2.cvtColor函数将图像转换为灰度图像。 3. 使用cv2.threshold函数进行阈值化操作,将图像转换为CV_8UC1类型。 4. 然后再调用distanceTransform函数进行距离变换操作。 这样应该能够解决这个错误并正确执行distanceTransform函数。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【OpenCV错误error: (-215:Assertion failed) src.type() == CV_8UC1 in function 'threshold'](https://blog.csdn.net/donaldsy/article/details/102078401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [opencv bug 处理](https://download.csdn.net/download/rechard_han/10562169)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值