【问题标题】:OpenCV Remap parameters and How to use it?OpenCV Remap 参数以及如何使用?
【发布时间】:2017-06-04 22:50:16
【问题描述】:

我对opencv不熟悉,但是我需要使用'remap'函数来校正图像。 我有一个 960x1280 的图像,还有一个名为“remap.bin”的重映射文件,大小为 9.8MB(等于 960x1280x4x2,这意味着两个浮点数在一个位置(x,y));

Applies a generic geometrical transformation to an image.

C++: void remap(InputArray src, OutputArray dst, InputArray map1, InputArray map2, int interpolation, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())

map1 – The first map of either (x,y) points or just x values having the type CV_16SC2 , CV_32FC1 , or CV_32FC2 . See convertMaps() for details on converting a floating point representation to fixed-point for speed.
map2 – The second map of y values having the type CV_16UC1 , CV_32FC1 , or none (empty map if map1 is (x,y) points), respectively.

根据解释, 我的代码是这样的:

int main(int argc, char* argv[]){
    if(argc != 3){
        printf("Please enter one path of image and one path of mapdata!\n");
        return 0;
    }
    std::string image_path = argv[1];
    char* remap_path = argv[2];

    cv::Mat src = cv::imread(image_path); 
    cv::Mat dst;
    dst.create( src.size(), src.type());

    cv::Mat map2;
    map2.create( src.size(), CV_32FC1);
    map2.data = NULL;

    cv::Mat mapXY;
    mapXY.create( src.rows, src.cols, CV_64FC1);

    FILE *fp;
    fp = fopen(remap_path, "rb");
    fread(mapXY.data, sizeof(float), mapXY.cols*mapXY.rows*2, fp);
    fclose(fp);


    imshow("src", src);
    printf("remap!\n");
    cv::remap(src, dst, mapXY, map2, cv::INTER_LINEAR);
    imshow("dst", dst);

    cv::waitKey(0);
    return 0;

但是当我运行程序时出现这个错误:

OpenCV 错误:断言失败 (((map1.type() == CV_32FC2 || map1.type() == CV_16SC2) && !map2.data) || (map1.type() == CV_32FC1 && map2. type() == CV_32FC1)) 在重新映射,文件 /home/liliming/opencv-2.4.13/modules/imgproc/src/imgwarp.cpp,第 3262 行终止在抛出“cv::Exception”实例后调用什么( ): /home/liliming/opencv-2.4.13/modules/imgproc/src/imgwarp.cpp:3262: 错误: (-215) ((map1.type() == CV_32FC2 || map1.type() == CV_16SC2) && !map2.data) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1) in function remap Aborted (core dumped)

我对此一无所知。 谁能帮帮我?或者给一些示例代码? 非常感谢!

【问题讨论】:

  • 可以看到THIS SO ANSWER
  • 谢谢,我可以使用带有两个参数(mapX和mapY)的remap,但是我不知道如何使用带有一个参数(mapXY)的remap。

标签: c++ opencv image-processing ubuntu-14.04 remap


【解决方案1】:

我把remap表分成两个表remapX,remapY。 像这样:

float *data_xy = (float *)malloc(sizeof(float)*960*1280*2);

FILE *fp;
fp = fopen(remap_path, "rb");
fread(data_xy, sizeof(float), 960*1280*2, fp);
fclose(fp);

for(int y=0; y<1280; ++y){
    for(int x=0; x<960; ++x){
        map_x.at<float>(y, x) = data_xy[(y*960+x)*2];
        map_y.at<float>(y, x) = data_xy[(y*960+x)*2+1];
    }
}

然后使用

cv::remap(src, dst, map_x, map_y, cv::INTER_LINEAR);

效果很好。 但是我不知道如何使用一个参数 map1 来完成重映射。

【讨论】:

    【解决方案2】:

    OpenCV 3.1 的文档说:

    map1    The first map of either (x,y) points or just x values having the type 
    CV_16SC2 , CV_32FC1, or CV_32FC2.
    

    断言说 map1 没有 CV_32FC2 的类型 这是因为您正在使用 CV_64FC1 类型创建和阅读它。

    您需要将其转换为正确的类型:CV_32FC2 类型的二维数组(每个元素两个 32 位浮点数。)

    文档接着说:

    See `convertMaps` for details on converting a 
    floating point representation to fixed-point for speed.
    

    文档可以在这里找到:https://docs.opencv.org/3.1.0/da/d54/group__imgproc__transform.html#gab75ef31ce5cdfb5c44b6da5f3b908ea4

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-18
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-26
      • 2018-03-23
      • 2016-09-09
      • 1970-01-01
      相关资源
      最近更新 更多