报错:cv2.error: OpenCV(4.2.0) C:projectsopencv-pythonopencvmodules......in function ‘cv::remap‘

    技术2022-07-13  75

    报错整体情况是这样的

    Traceback (most recent call last): File "I:\pycharm\PyCharm Community Edition 2018.3.4\helpers\pydev\pydevd.py", line 1741, in <module> 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 <module> 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_<bit_depth>(S|U|F)C<number_of_channels>

         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<number_of_channels>----代表---一张图片的通道数,比如:                     1--灰度图片--grayImg---是--单通道图像                     2--RGB彩色图像---------是--3通道图像                     3--带Alph通道的RGB图像--是--4通道图像

    而在Numpy中

    numpy.float32:单精度浮点型

    numpy.float64:双精度浮点型

    所以按照上述情况来讲,就不能使用float64来创建mapx, 所以应该统一改为float32.

    Processed: 0.014, SQL: 9