报错:cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules......in function ‘cv::remap‘

报错整体情况是这样的

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.

你可能感兴趣的:(Numpy,OpenCV)