【opencv】cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function ‘imshow‘

简介: 【opencv】cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function ‘imshow‘

一、问题描述

今天在实现sobel算子时,用了cv的filter2D函数以后,报了如下错误

cv2.error: OpenCV(4.5.5) :-1: error: (-5:Bad argument) in function 'imshow'
> Overload resolution failed:
>  - mat data type = 23 is not supported
>  - Expected Ptr<cv::cuda::GpuMat> for argument 'mat'
>  - Expected Ptr<cv::UMat> for argument 'mat'

报错代码段:

v = cv.filter2D(img_i, -1, G_x)
h = cv.filter2D(img_i, -1, G_y)
img = np.sqrt(v**2 + h**2)
# 此处省略阈值处理
cv.namedWindow("Image_Sobel", cv.WINDOW_NORMAL)
cv.imshow("Image_Sobel", img)
cv.waitKey(0)
cv.destroyAllWindows()

二、解决

看到报错里面有 data type = 23 ,猜测是图像的数据类型有问题,输出一看发现img中元素的数据类型是float16,现在看看imshow的要求。
opencv的官方注释指出:根据图像的深度,imshow函数会自动对其显示灰度值进行缩放,规则如下:

  1. 如果图像数据类型是8U(8位无符号),则直接显示。
  2. 如果图像数据类型是16U(16位无符号)或32S(32位有符号整数),则imshow函数内部会自动将每个像素值除以256并显示,即将原图像素值的范围由[0~ 255*256]映射到[0~255]
  3. 如果图像数据类型是32F(32位浮点数)或64F(64位浮点数),则imshow函数内部会自动将每个像素值乘以255并显示,即将原图像素值的范围由[0~ 1]映射到[0~255](注意:原图像素值必须要归一化)

可以发现,16F是非法的,因此 需要将其转化为32F或者64F,如以下代码中的第4行所示(转成了64F)

v = cv.filter2D(img_i, -1, G_x)
h = cv.filter2D(img_i, -1, G_y)
img = np.sqrt(v**2 + h**2)
img = img.astype(float)
# 此处省略阈值处理
cv.namedWindow("Image_Sobel", cv.WINDOW_NORMAL)
cv.imshow("Image_Sobel", img)
cv.waitKey(0)
cv.destroyAllWindows()

至此,已经不会报错了,但是图像经过阈值化处理,输出是全黑的,开方应该是没有问题的,猜测是cv.filter2D的问题。直接说结论,cv.filter2D函数的第二个参数是ddepth,英文是 desired depth,即期望深度,值为-1说明输出的数据类型和输入相同,问题就出在这,输入的图像是uint8的,所以原本卷积之后是负值的全被抹掉了,后面第三行平方相加也会溢出,,,所以应该把ddepth设为CV_32F,ddepth取值表如下所示(来自官方文档)
ddepth取值表
最终的代码:

v = cv.filter2D(img_i, cv.CV_32F, G_x)
h = cv.filter2D(img_i, cv.CV_32F, G_y)
img = np.sqrt(v**2 + h**2)
# 此处省略阈值处理
cv.namedWindow("Image_Sobel", cv.WINDOW_NORMAL)
cv.imshow("Image_Sobel", img)
cv.waitKey(0)
cv.destroyAllWindows()

最后的输出的图像:
sobel算子输出

目录
相关文章
|
11月前
|
Java 关系型数据库 数据库连接
java中调用postgis的函数找不到,报错[42883] ERROR: function st_area(public.geometry) does not exis,Navicat里面正常
今天在postgresql数据库中对一个图层表使用st_area()函数,获取图层中geometry字段的面积。
|
1月前
|
Go
Error: Package awesomeProject contains more than one main function Consider using File kind instead
Goland编辑器运行时出现“edit configuration”窗口,阻碍代码执行。解决方法:右键点击源文件运行。问题源于Go语言不支持函数重载,同一包内不能有两个同名函数,导致多入口冲突。初学者在main包中使用了多个Go源文件,应改为仅有一个源码文件来避免此问题。
|
7月前
Fatal error: Call to undefined function openssl_pkey_get_private()
Fatal error: Call to undefined function openssl_pkey_get_private()
43 0
|
11月前
error C2449: found ‘{‘ at file scope (missing function header?)和error C2059: syntax error : ‘}‘
error C2449: found ‘{‘ at file scope (missing function header?)和error C2059: syntax error : ‘}‘
82 0
|
1月前
|
计算机视觉 Python
error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
73 0
|
8月前
|
JavaScript Cloud Native Go
Error: Cannot find module ‘webpack/bin/config-yargs‘ at Function.Module._resolveFilename (intern
Error: Cannot find module ‘webpack/bin/config-yargs‘ at Function.Module._resolveFilename (intern
45 0
|
11月前
|
Linux
error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)
83 0
|
关系型数据库 MySQL C++
Error:error C2601: ‘b‘ : local function definitions are illegal error C2063: ‘b‘ : not a function
Error:error C2601: ‘b‘ : local function definitions are illegal error C2063: ‘b‘ : not a function
135 0
|
计算机视觉
cv2.error: OpenCV(4.5.2) : -1 : error: (-5:Bad argument) in function ‘rectangle‘
cv2.error: OpenCV(4.5.2) : -1 : error: (-5:Bad argument) in function ‘rectangle‘
285 0
|
计算机视觉
【在虚拟环境下完美解决】1698: error: (-215:Assertion failed) empty() in function cv::CascadeClassifier
首先我们要找到那个分类器所在的路径,我们可以在Cmd中直接输入【若是虚拟环境的话,则需要切换到对于虚拟环境中,再去查找对应的opencv版本与位置信息】
304 0

热门文章

最新文章