c# - Emgu Opencv C# ConvertTo 不同的结果

标签 c# c++ opencv emgucv

我在让 C# Emgu.NET (opencv) 生成与类似 C++ 代码相同的结果时遇到问题。这非常简单,我只是打开一个 16UC1 图像并转换为 32FC1。这是 C++ 代码:

inImg = imread(inPath.c_str(), -1);
cv::Mat fltImg;
inImg.convertTo(fltImg, CV_32FC1  );

我将原始数据字节保存到如下文件中:

std::ofstream fout;
fout.open(filename, std::ios::binary | std::ios::out);

fout.write((char*)img.data, img.rows * img.cols * bytesPerPixel);

fout.close();

我保存 inImg 和 fltImg 用于调试目的(分别为 2 和 4 bytesPerPixel)

在 Emgu.NET 端:

var handle = GCHandle.Alloc(pixelValues, GCHandleType.Pinned);
try
{
    var ptr = handle.AddrOfPinnedObject();
    var mat = new Mat(new Size(height, width), DepthType.Cv16U, 
                    1, ptr, width * 2);

   var convMat = new Mat();
   mat.ConvertTo(convMat, DepthType.Cv32F);
}
finally
{
    if (handle.IsAllocated)
    {
        handle.Free();
    }
}

我通过以下方式保存原始文件:

private void SaveDebugImage(string filename, Mat img, int depth)
{
    byte[] data = MatData(img, depth);
    File.WriteAllBytes(filename, data);
}

private byte[] MatData(Mat img, int pixelBytes)
{
    var ptr = img.DataPointer;
    int size = img.Rows * img.Cols * pixelBytes;
    var outBytes = new byte[size];
    Marshal.Copy(ptr, outBytes, 0, size);
    return outBytes;
}

比较前一个 (16 bpp) 图像,它们是相同的,但调用 ConvertTo 后的图像会产生不同的图像:

C++ C++ output

C# C# output

对于可能出现的问题有什么想法吗?

谢谢!

最佳答案

感谢评论中的 Dan Masek - 我发现 C# 代码的高度和宽度顺序不正确

关于c# - Emgu Opencv C# ConvertTo 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60891926/

相关文章:

c++ - 从模板类的实例继承

c++ - 移动到Qt5 : 'Type' has not been declared 时出现编译错误

opencv - 如何使用 SIFT 进行图像比较

c++ - 不能在opencv C++中扭曲背面图像

c# - 无法对 C# 中的数组值进行算术运算

c# - Alexa 技能签名验证失败

c++ - 绑定(bind)通用成员函数

c# - 获取 ASP.NET 开发服务器使用的所有端口的代码

c# - 如何创建一个 "Processing"页面?

opencv - 使用 OpenCV 的动态(移动)手势