【问题标题】:Emgu Opencv C# ConvertTo different resultsEmgu Opencv C# ConvertTo 不同的结果
【发布时间】:2020-07-08 13:00:30
【问题描述】:

我在让 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

对可能出现的问题有任何想法吗?

谢谢!

【问题讨论】:

  • new Size(height, width) - 这不是System.Drawing.Size,它以相反的顺序(先宽后高)获取参数?
  • :facepalm: 是的 - 就在钱上。感谢丹的第二双眼睛!

标签: c# c++ opencv emgucv


【解决方案1】:

感谢 cmets 中的 Dan Masek - 我得到的 C# 代码的高度和宽度顺序不正确

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多