我不熟悉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行终止在抛出&#的实例后调用39; CV ::异常' 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 :(得分: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来完成重映射。
答案 1 :(得分:0)
OpenCV 3.1的文档说:
var addSourceBuffer = MediaSource.prototype.addSourceBuffer;
MediaSource.prototype.addSourceBuffer = function() {
var sourceBuffer = addSourceBuffer.apply(this, arguments);
sourceBuffer.abort = function() {}; // Stub out for buggy implementations.
return sourceBuffer;
};
断言说map1的类型不是map1 The first map of either (x,y) points or just x values having the type
CV_16SC2 , CV_32FC1, or CV_32FC2.
这是因为您正在使用CV_64FC1类型创建和读取它。
您需要将其转换为正确的类型:CV_32FV2类型的两个维度的数组(每个元素两个32位浮点数。)
文档继续说:
CV_32FC2