2017-01-20 14 views
0

Я не знаком с opencv, но мне нужно использовать функцию «remap» для исправления изображения. У меня есть изображение с 960x1280 и файл переназначить под названием «remap.bin» с 9.8Mb (приравнивается к 960x1280x4x2, что означает, что два поплавка в одном положении (х, у));Параметры OpenCV Remap и как его использовать

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 Error: Assertion failed (((map1.type() == CV_32FC2 || map1.type() == CV_16SC2) && !map2.data) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1)) in remap, file /home/liliming/opencv-2.4.13/modules/imgproc/src/imgwarp.cpp, line 3262 terminate called after throwing an instance of 'cv::Exception' what(): /home/liliming/opencv-2.4.13/modules/imgproc/src/imgwarp.cpp:3262: error: (-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)

Я понятия не имею об этом. Может ли кто-нибудь помочь мне или дать код? Спасибо большое!

+0

Вы можете видеть [ЭТО ТАК ОТВЕТ] (http://stackoverflow.com/questions/10364201/image-transformation-in-opencv) –

+0

Спасибо, я могу использовать переназначение с двумя параметрами (mapX и mapY), но я не знаю, как использовать re карту с одним параметром (mapXY). –

ответ

0

Отделите таблицу переназначения на две таблицы 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 для завершения переназначения.

0

Документация 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_32FV2

документация продолжает говорить (два 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