Параметры OpenCV Remap и как их использовать?

Я не знаком с opencv, но мне нужно использовать функцию «remap» для исправления изображения.
У меня есть изображение с разрешением 960×1280, и файл переназначения, называемый «remap.bin» с 9,8 МБ (равен 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)) в remap, файл /home/liliming/opencv-2.4.13/modules/imgproc/src/imgwarp.cpp, строка 3262 завершается, вызывается после создания экземпляра cv :: Exception what (): /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) в переназначении функции Прервано (ядро сброшено)

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

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

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

По вопросам рекламы [email protected]