2015-09-14 31 views
3

经过多次实验,我发现,在C阅读彩色JPG文件++(OpenCV的):读取JPG文件在OpenCV中对C#位图

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

是使用C#位图读同一个文件的不同:

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

结果是不同的。如果我在它们上应用了一些算法,就像GoodFeatureToTrack一样,这是值得注意的差异。

问题是: 如何在OpenCV中调用C#位图加载的方式。所以,如果我直接在本机部分或从C#包装器加载图像,我会得到相同的结果。

由于

编辑:

此码是采取一些结构包含该装填在manged程序(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(); 

} 

the thresholded diffrences image

+1

什么类型的图像?灰度?颜色?你有没有尝试将不同的标志传递给'imread'? –

+0

彩色图像 “不同的标志”为什么? –

+1

您可以对16或32位图像使用'CV_LOAD_IMAGE_ANYDEPTH',或将'CV_LOAD_IMAGE_GRAYSCALE'转换为灰度。默认值是'CV_LOAD_IMAGE_COLOR',这将导致3通道图像。你的图片是否有alpha通道? –

回答

3

也许你可以使用getImage()代替getMat()

类似的问题正在
http://www.emgu.com/forum/viewtopic.php?t=188

+0

你的意思是在我的c#应用程序中包含EMGU并使用它的图像加载器?这是possibe的解决方案,但我不想添加EMGU到我的c#应用程序只是为了这个目的。 –

+0

Opencv包含在本地部分,但它不在托管部分 –

+0

您可以单独安装emgu,包括标题和链接反对它。你(可能)没有在你的项目中包含OpenCV?请参阅http://www.emgu.com/wiki/index.php/Main_Page#Architecture_Overview - 对于许多您称之为OpenCV的内容(请参阅http://www.emgu.com/wiki/index.php/Tutorial ) –

2

(在C#中没有C++使用OpenCV的),正如其他人所指出的,如果你想读在OpenCV中未修改的形象在这里解决,设置标志在为-1 C++ function,如:

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

或使用定义的值enum

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

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

+0

我厌倦了-1,但它是相同的... –

+0

@HumamHelfawi:看到我关于有损JPEG解码的说明 – Amro

+0

是的,我做了...但改变整个编码是不是一种选择,甚至我没有被授权在我目前的项目 –