在 OpenCV 与 C# 位图中读取 jpg 文件

Reading jpg file in OpenCV vs C# Bitmap

经过多次实验,我发现在C++(OpenCV)中读取彩色jpg文件:

auto temp(cv::imread("xxx.jpg");

不同于使用C#位图读取同一个文件:

var temp=new bitmap("xxx.jpg");

结果不同。如果我对它们都应用一些算法,比如 GoodFeatureToTrack,会有显着的差异。

问题是: 如何在OpenCV中采用C#加载位图的方式。因此,如果我直接在本机部分或从 C# Wrapper 加载图像,我会得到相同的结果。

谢谢

编辑:

此代码是一个 c++ 函数,它采用一些结构,该结构包含在托管程序 (c#) 中加载的图像,然后在 opencv 中加载相同的图像并比较它们。有一个不同的!

    extern "C" _declspec (dllexport) void test_diff(authenticator_reference_structure* referecnces){
    auto image(cv::imread("white.jpg"));

    cv::imshow("opencv", image);
    auto wrpped(referecnces->references->images->image.getMat());

    cv::imshow("C#", wrapped);
    cv::Mat ss;
    cv::absdiff(image, wrapped, ss);

    cv::threshold(ss, ss, 1, 255, CV_THRESH_BINARY);
    cv::imshow("Diff", ss);
    cv::waitKey();

}

也许你可以使用 getImage() 而不是 getMat()

这里解决了一个类似的问题(在 C# 而不是 C++ 中使用 openCV)
http://www.emgu.com/forum/viewtopic.php?t=188

正如其他人指出的那样,如果您想在 OpenCV 中读取未修改的图像,请在 C++ function 中将标志设置为 -1,如:

cv::Mat img = cv::imread("xxx.jpg", -1);

或使用定义的 enum 值:

cv::Mat img = cv::imread("xxx.jpg", cv::IMREAD_UNCHANGED);

另请注意,不能保证 JPEG 图像在不同解码器中的解码位完全相同!最好使用像 PNG 这样的无损格式(参见 #4148, #4046, ...)。