2015-07-24 11 views
10

Ich habe ein Problem mit der Funktion imread() in Matlab (2014) und OpenCV (3.0) auf Windows 7 mit JPG-Dateien festgestellt.OpenCV vs Matlab: Unterschiedliche Werte auf Pixeln mit imread

Ich habe nicht die gleichen Werte durch das Lesen der gleichen Datei JPG und das gleiche Pixel.

Hier sind meine 2-Codes: (OpenCV-Code durch den Code Matlab gefolgt), und die Werte, die ich habe (Modus debug in OpenCV, Tastatur in Matlab zu sehen)

#include <opencv2\opencv.hpp> 
#include <cstdio> 

using namespace cv; 
using namespace std; 

int main() 
{ 
    Mat img = imread("test.jpg"); 

    uchar pb = img.at<Vec3b>(0, 0).val[0]; 
    uchar pg = img.at<Vec3b>(0, 0).val[1]; 
    uchar pr = img.at<Vec3b>(0, 0).val[2]; 

    int d = img.depth(); 

    int t = img.type(); 
} 

Werte:

 pixel [0,0] = (147,174,204); // = index(1,1) in the image. 
    d = 0; 
    t = 16; 

-Code Matlab:

img = imread('test.jpg'); 

img(1,1,:) 

whos img 

Werte:

ans(:,:,1) = 
148 

ans(:,:,2) = 
174 

ans(:,:,3) = 
201 

Name   Size     Bytes Class Attributes 
img  1920x2560x3   14745600 uint8  

Haben Sie eine Idee, warum Werte anders sind?

Ich habe in einem anderen Beitrag ein Problem wie dieses gesehen, aber die Person hatte nicht die gleiche Tiefe durch Lesen eines TIFF. Hier, wie Sie sehen können, habe ich die gleiche Tiefe!

Vielen Dank im Voraus und Entschuldigung für einen englischen Fehler.

PS: Ich habe auch mit anderen Pixeln testen, gleiche Ergebnisse: geschlossene Ergebnisse, aber nicht genau gleich.

+4

Können Sie die fragliche JPEG-Datei für weitere Untersuchungen zur Verfügung stellen? – ypnos

+1

auch den gesamten openCV-Code, wo Sie das Bild speichern. –

+0

sind Matlab-Code und C++ - Anwendung ich im selben Verzeichnis? Sind Sie sicher, dass beide Dateien identisch sind? z.B. Sie haben das Bild nicht geöffnet und speichern Sie das Bild an der anderen Stelle (möglicherweise mit zusätzlichen JPEG-Komprimierungseffekten)? – Micka

Antwort

4

Für Menschen, die dieses Thema lesen würde dies die letzte Erklärung ist:

Aus der Version von libjpeg kommt. Die Version 6b (OpenCV verwendet diese vor 2.4.11) funktioniert genauso wie Matlab 2014b. Ab Version 8 von libjpeg hatte ich die anderen oben erwähnten Ergebnisse.

Um mein Problem zu lösen (Ich benutzte einen Unterschied zwischen Bild und Hintergrund, um eine Maske zu erstellen und mein Problem war, dass ich OpenCV (ohne libjeg Version 6b) im Bild hatte), kompilierte ich OpenCV 3.0 mit libjpeg 6b. (Ich musste auch 2 Laufzeitbibliotheken importieren und in mein Projekt legen, frei im Internet gefunden.)

Ich habe keinen Fehler auf OpenCV gemeldet.Um ehrlich, ich habe es nicht geschafft, ich habe nicht verstanden, wie tun in ihrer Website sogar ich versuchte ...

+0

Ich habe das gleiche genaue Problem, aber Ihre Erklärung ist irgendwie nicht verständlich. Muss ich zum Beispiel eine Maske erstellen, wenn ja, wie? Könnten Sie bitte etwas ausführlicher erklären? – smttsp

+0

Nein, ich sprach über eine Maske, weil es in meiner Anwendung war. Es gibt keine Beziehung mit dem Problem. Mit openCV 2.4.11 und 3.0 haben Sie nicht die gleichen Ergebnisse mit Matlab wegen der Bibliothek, die openCV verwenden. Wenn Sie dieselben Ergebnisse (durch Lesen eines JPEG-Bildes) wie Matlab haben möchten, können Sie openCV 2.4.10 und vorher verwenden oder versuchen, openCV 2.4.11 (oder 3.0) mit libjpeg 6b anstelle von 8 zu kompilieren, das standardmäßig verwendet wird . Ich weiß nicht, welche Version die gute ist, aber ich denke, es ist die 6b, weil meine Ergebnisse mit meiner Anwendung besser waren. – Nablast

2

Dieser Code gibt die richtigen Werte für Ihr Beispiel Bild test2.jpg:

#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

int main() 
{ 
    auto img = cv::imread("test2.jpg"); 
    auto pixel = img.at<cv::Vec3b>(85, 85); 
    std::cout << (int)pixel[0] << "\t" << (int)pixel[1] 
       << "\t" << (int)pixel[2] << std::endl; 
} 

Ausgang:

118  105  91 

Die OpenCV Version hier ist 2.4.10. Ich bekomme das gleiche Ergebnis, wenn Sie Ihren Code verwenden. Ich nehme an, irgendwo gibt es einen Fehler, den du nicht beeinflussen kannst.

+0

Vielen Dank! Ich habe deinen Code kopiert und in der Tat habe ich nicht die gleichen Ergebnisse ... Ich habe gerade OpenCV 2.4.10 herunterladen und ich bekomme die guten Werte. Wir können also sagen, dass das Problem von der Version 3.0 herrührt. – Nablast

+0

Auf OpenCV 2.4.11 bekomme ich '[118, 104, 92]' bei '(85,85)'. Kannst du auch teilen, welche Plattform du benutzt? Ich bin auf Mac OS X Yosemite - 10.10.4. Ich vermute, es ist nicht einfach nur die Version ... es kann auch plattformabhängig sein. – rayryeng

+0

@rayryend Ich habe versucht mit openCV 2.4.10 (und ich habe den gleichen Wert: 118, 105, 91), aber nicht mit 2.4.11! Auf Visual Studio 2013 und MSI GP70 (Windows 7)! – Nablast