将打开的CV的重映射功能与类型CV_8SC1的源图像一起使用
Using open CV's remap function with a source image of a type CV_8SC1
使用开放式CV的重新映射功能与不同类型的源图像给了我一些有趣的结果。
以下类型可以按预期工作:CV_8UC1,CV_16UC1,CV_16SC1,CV_32FC1,CV_64FC1。
给我一个错误的两种类型是:CV_8SC1,CV_32SC1。
有趣的部分是CV_16SC1在CV_8SC1不是。
有人有任何见解,为什么会发生这种情况?
这是我使用的代码:
cv::Mat remapX, remapY;
remapX.create(output_cv_mat.rows, output_cv_mat.cols, CV_32FC1);
remapY.create(output_cv_mat.rows, output_cv_mat.cols, CV_32FC1);
for(int x = 0; x < remapX.cols; x++) //Column iteration
{
for(int y = 0; y < remapX.rows; y++) //Row iteration
{
remapX.at<float>(y, x) = (float)(x);
remapY.at<float>(y, x) = (float)(remapX.rows - y);
}
}
cv::remap(source_cv_mat, output_cv_mat, remapX, remapY, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0, 0, 0));
代码使用源CV :: MAT(我正在尝试的类型)和输出CV :: MAT。我创建地图x和y,将它们用于循环,然后完成重新映射功能。
我在这两种类型中收到的错误是:
丢弃了" cv ::异常"的实例后终止了调用 what():openCV(4.0.1-dev)/home/aljaz/opencv_build/opencv/modules/imgproc/src/src/imgwarp.cpp.cpp:1805:error:(-215:assertion fafored fafered)ifunc!= 0'
如果您查看CV :: Remap的代码,则可以看到以下检查具有插值类型的兼容数据类型:
static RemapNNFunc nn_tab[] =
{
remapNearest<uchar>, remapNearest<schar>, remapNearest<ushort>, remapNearest<short>,
remapNearest<int>, remapNearest<float>, remapNearest<double>, 0
};
static RemapFunc linear_tab[] =
{
remapBilinear<FixedPtCast<int, uchar, INTER_REMAP_COEF_BITS>, RemapVec_8u, short>, 0,
remapBilinear<Cast<float, ushort>, RemapNoVec, float>,
remapBilinear<Cast<float, short>, RemapNoVec, float>, 0,
remapBilinear<Cast<float, float>, RemapNoVec, float>,
remapBilinear<Cast<double, double>, RemapNoVec, float>, 0
};
因此,尽管签名的char类型是最近的邻居插值,但双线性插值并非如此。所有组合均未实现。
ipp(用于图像处理的英特尔库)可以与OpenCV一起使用,也不允许签名的char操作:https://software.intel.com/en-us/ipp/ipp-dev-reference-remap。就我的理解而言,当英特尔在性能方面没有意义时没有提供此类实现(即它们没有提供一个将8s转换为16s的函数,在功能中转换为16s,计算某些内容并以8s为单位)。此外,支持数据类型的所有组合,插值类型,频道数量肯定需要一些工作,因此专注于最常用的类型也很好。
如果您没有绝对需要与整数合作的性能瓶颈,我建议将其转换为float。另外,对于整数,您必须照顾量化。
当您获得"断言"错误时,通常是因为您不符合预期/实现的输入数据类型或形状(图像大小/通道数)。
希望这会有所帮助!
- 将"打开的CV图像"中的"颜色"转换为整数格式
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 使用 cv::不扭曲不失真和居中图像
- 如何在OpenCV 3.4.7中计算CV_32FC1 cv::GpuMat图像的(范围)直方图
- 如何在 dlib 的 array2d 图像上从 dlib::rectangle 创建 cv::Mat<rgb_pixel> ?
- 如何从C 中的CV :: MAT图像中有效提取某些像素
- C++/openCV - 为什么显示图像会产生 Linux 分割错误?(打开CV错误?
- 循环浏览捕获的图像 vector<cv::Mat>
- 将打开的CV的重映射功能与类型CV_8SC1的源图像一起使用
- 表示RGB图像的浮点数组的初始CV::MAT
- 将 cv::Mat 转换为穿山甲::图像
- 无法使用cv :: imwrite保存垫子图像在JNI本机代码OPENCV中
- 使用Open CV和Java单击Android时,获取图像尺寸
- 为什么CV :: MAT的向量总是返回第一个图像
- 图像打开时出错(使用打开的 CV C++代码)
- 使用16位签名格式打开CV不起作用..裁剪图像并重新调整图像大小
- 使用 cv::P oint 作为参数访问图像
- 将拜耳RGGB转换为CV图像(RGB)
- 如何在打开的cv c ++中单击鼠标右键时从视频中捕获图像
- 打开CV图像保存以较小的尺寸,无需压缩