在 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, ...)。
经过多次实验,我发现在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, ...)。