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