报错整体情况是这样的
Traceback (most recent call last):
File "I:\pycharm\PyCharm Community Edition 2018.3.4\helpers\pydev\pydevd.py", line 1741, in
main()
File "I:\pycharm\PyCharm Community Edition 2018.3.4\helpers\pydev\pydevd.py", line 1735, in main
globals = debugger.run(setup['file'], None, None, is_module)
File "I:\pycharm\PyCharm Community Edition 2018.3.4\helpers\pydev\pydevd.py", line 1135, in run
pydev_imports.execfile(file, globals, locals) # execute the script
File "I:\pycharm\PyCharm Community Edition 2018.3.4\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "I:/20200529ini/open_cv_one.py", line 513, in
rst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\imgproc\src\imgwarp.cpp:1815: error: (-215:Assertion failed) ((map1.type() == CV_32FC2 || map1.type() == CV_16SC2) && map2.empty()) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1) in function 'cv::remap'
源代码如下所示:
img = np.random.randint(0, 256, size=[4, 5], dtype=np.uint8)
rols, cols = img.shape
mapx = np.ones(img.shape, np.float64) * 3
mapy = np.ones(img.shape, np.float32) * 0
mapz = np.zeros(img.shape, np.float32)
rst = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
这个报错的原因是,在使用Opencv中的重映射remap函数时,内部参数格式不对。
从报错的后半部分可以看出是map1和map2的问题:
((map1.type() == CV_32FC2 || map1.type() == CV_16SC2) && map2.empty()) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1)
in function 'cv::remap'
remap函数 “语法格式” 如下所示:
dst = cv2.remap(src, map1, map2, interpolation[, borderMode[, borderValue]])
- dst 代表目标图像,和src具有相同的大小和类型
- src 代表原始图像
- map1 参数有两种可能的值:
- 表示(x, y)点的一个映射
- 表示 CV_16SC2, CV_32FC1, CV_32FC2类型(x, y)点的x值
- map2 参数同样有两种可能的值:
- 当map1表示(x, y)时,该值为空
- 当map1表示(x, y)中的x时,该值是CV_16UC1, CV_32FC1类型(x, y)点的y值
- interpolation代表插值方式,这里不支持INTER_AREA方法。(其中INTER_AREA方法是适合缩小图像的插值方法)
- borderMode代表边界模式。当该值为BORDER_TRANSPARENT时,表示目标图像内的对应源图像奇异点(outliers)的像素不会被更改。
- borderValue代表边界值,默认值为0
很明显此处代码都是使用了map1和map2的第二种可能的值
那么CV_32FC2这类参数是什么含义?详情如下所示
CV_
(S|U|F)C
1--bit_depth---比特数---代表8bite,16bites,32bites,64bites
如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张
灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对
应的就是CV_8
2--S|U|F--S--代表---signed int---有符号整形
U--代表--unsigned int--无符号整形
F--代表--float---------单精度浮点型
3--C----代表---一张图片的通道数,比如:
1--灰度图片--grayImg---是--单通道图像
2--RGB彩色图像---------是--3通道图像
3--带Alph通道的RGB图像--是--4通道图像
而在Numpy中
numpy.float32:单精度浮点型
numpy.float64:双精度浮点型
所以按照上述情况来讲,就不能使用float64来创建mapx, 所以应该统一改为float32.