2015-09-14 47 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

是的,我做了...但改變整個編碼是不是一種選擇,甚至我沒有被授權在我目前的項目 –