记opencv resize函数的一个坑
因为传的时候用了无符号短整型(H)对图片数据进行了打包,想着[0, 255]刚好能满足数据的大小需求,但这样解包得到的数据是无符号短整型,转为numpy array后的数据类型是。没办法直接打开cpp,于是想着找一下报错的那个cpp文件来查一下,搜了“opencv 4.10.0 resize.cpp:4030 代码”,结果反而找到了类似的报错。直接到geometric.py中报错的函数位置打印函数
将图片传到服务器进行物品检测的时候,出现了如下报错:
File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmengine/dataset/base_dataset.py", line 60, in __call__
data = t(data)
File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmcv/transforms/base.py", line 12, in __call__
return self.transform(results)
File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmdet/structures/bbox/box_type.py", line 267, in wrapper
return func(self, results)
File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmdet/datasets/transforms/transforms.py", line 154, in transform
self._resize_img(results)
File "/home/zzy/mmyolo/mmyolo/datasets/transforms/transforms.py", line 112, in _resize_img
image = mmcv.imresize(
File "/home/zzy/.conda/envs/yolo-world3.8/lib/python3.8/site-packages/mmcv/image/geometric.py", line 116, in imresize
resized_img = cv2.resize(
cv2.error: OpenCV(4.10.0) /io/opencv/modules/imgproc/src/resize.cpp:4030: error: (-215:Assertion failed) func != 0 in function 'resize'
但直接在服务器用opencv读取相同图片进行检测确实是没有问题的。
想着可能是struct打包再解包时导致了数据不一致,于是比较了传过来的图片和本地读取的图片,类型都是numpy.array,shape也都相同,利用numpy.array_equal比较也是相等的。
直接到geometric.py中报错的函数位置打印函数的所有输入(最终的resize.cpp文件没办法直接跳转打开),看起来也是一样。
这就真的很奇怪。
用必应查,直接查报错信息error: (-215:Assertion failed) func != 0 in function 'resize'竟然查不到相近的问题。
没办法直接打开cpp,于是想着找一下报错的那个cpp文件来查一下,搜了“opencv 4.10.0 resize.cpp:4030 代码”,结果反而找到了类似的报错一个很奇怪的 OpenCV出错:resize的坑、cv2.resize函数报错:error: (-215:Assertion failed) func != 0 in function ‘cv::hal::resize‘。
竟然是图片的numpy array的类型设错了。因为传的时候用了无符号短整型(H)对图片数据进行了打包,想着[0, 255]刚好能满足数据的大小需求,但这样解包得到的数据是无符号短整型,转为numpy array后的数据类型是<class 'numpy.dtype[uint8]'>,而直接imread读取图像得到的数据类型是<class 'numpy.dtype[int64]'>。resize处理numpy.uint8就会报上述错误。
额外将解包得到的numpy array通过astype转为numpy.int16终于是正常运行了。
opencv的这个报错信息真的让人莫名其妙。两个array又都是整形,直接print或者保存为文件都看不出差异,怎么也想不到竟然是不同的整型。。。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)