Emgu Opencv C# ConvertTo разные результаты - PullRequest
3 голосов
/ 27 марта 2020

У меня проблемы с получением 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 бит / с) изображений они идентичны, но после вызова convertTo получаются разные изображения:

C ++ C ++ output

C# C# вывод

Есть идеи, что может быть не так?

Спасибо!

1 Ответ

0 голосов
/ 27 марта 2020

Благодаря Дэну Масеку в комментариях - неправильный порядок высоты и ширины для кода C#

...