2016-03-31 9 views
1

Hallo Ich möchte 3 Histogramme (rgb) in eine .xml-Datei exportieren, dann aus .xml lesen und in einer anderen Matrix speichern.OpenCV Filestorage Fehler

Code:

int main(int argc, char** argv) 
{ 
    Mat org,cmp, dst; 

    /// Load image 
    org = imread("arrowr.png"); 
    cmp = imread("cat.jpg"); 

    if (!org.data) 
    { 
     return -1; 
    } 
    /// Separate the image in 3 places (B, G and R) 
    Mat bgr_planes_org[3] = {};   //zmena z vector<Mat> bgr_planes; 
    split(org, bgr_planes_org); 

    /// Establish the number of bins 
    int histSize = 256; 

    /// Set the ranges (for B,G,R)) 
    float range[] = { 0, 256 }; 
    const float* histRange = { range }; 

    bool uniform = true; bool accumulate = false; 

    Mat b_hist_org, g_hist_org, r_hist_org; 


    /// Compute the histograms: 
    calcHist(&bgr_planes_org[0], 1, 0, Mat(), b_hist_org, 1, &histSize, &histRange, uniform, accumulate); 
    calcHist(&bgr_planes_org[1], 1, 0, Mat(), g_hist_org, 1, &histSize, &histRange, uniform, accumulate); 
    calcHist(&bgr_planes_org[2], 1, 0, Mat(), r_hist_org, 1, &histSize, &histRange, uniform, accumulate); 

    // Draw the histograms for B, G and R 
    int hist_w = 512; int hist_h = 400; 
    int bin_w = cvRound((double)hist_w/histSize); 

    Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0)); 

    /// Normalize the result to [ 0, histImage.rows ] 
    normalize(b_hist_org, b_hist_org, 0, histImage.rows, NORM_MINMAX, -1, Mat()); 
    normalize(g_hist_org, g_hist_org, 0, histImage.rows, NORM_MINMAX, -1, Mat()); 
    normalize(r_hist_org, r_hist_org, 0, histImage.rows, NORM_MINMAX, -1, Mat()); 

    Mat mat_r, mat_g, mat_b; 
    string filename = "test.xml"; 
    FileStorage fs(filename, FileStorage::WRITE); 
    fs << "blu" << b_hist_org; 
    fs << "grn" << g_hist_org; 
    fs << "red" << r_hist_org; 
    fs.release(); 

    FileStorage fs(filename, FileStorage::READ); 
    fs["blu"] >> mat_b; 
    fs["red"] >> mat_r; 
    fs["grn"] >> mat_g; 
    fs.release(); 

     cout << mat_r << endl; 
     cout << mat_g << endl; 
     cout << mat_b << endl; 

     system("pause"); 

    return 0; 
} 

Wenn ich versuche, es führen Sie es wirft mich um dieses "Nicht behandelte Ausnahme bei 0x00007FF96ECA8A5C in ConsoleApplication2.exe: Microsoft C++ Ausnahme:. Cv :: Exception an Speicherplatz 0x000000A4D911BF40"

Ich denke, es ist etwas mit FileStorage::READ. Wenn ich den Abschnitt kommentiere, in dem ich von .xml gelesen habe, funktioniert es ohne Fehler. Es funktioniert auch, wenn ich nur eine Matrix einfüge und dann lese.

Ich habe auch bemerkt, dass in der XML-Datei i die exportierten Daten wie dieses:

<blu type_id="opencv-matrix"> 
<rows>256</rows> 
<cols>1</cols> 
<dt>f</dt> 
<data> 
"blue matrix data" 
</data></blu> 
<blu>grn</blu> 
<blu type_id="opencv-matrix"> 
<rows>256</rows> 
<cols>1</cols> 
<dt>f</dt> 
<data> 
"green matrix data"  
</data></blu> 
<red type_id="opencv-matrix"> 
<rows>256</rows> 
<cols>1</cols> 
<dt>f</dt> 
<data> 
"red matrix data" 
</data></red> 
</opencv_storage> 

Warum gibt es diese <blu>grn</blu>? Ich möchte meine grüne Matrix mit dem Header <grn>. Warum ist die grn unter der <blu> Header?

Laut openCV sollte ich drei Header für jede Matrix haben. http://docs.opencv.org/2.4/doc/tutorials/core/file_input_output_with_xml_yml/file_input_output_with_xml_yml.html

Jede Hilfe/Link zur Lösung wäre cool.

+0

Das funktioniert ok für mich (außer dass Sie den Namen von 'fs' zum zweiten Mal ändern müssen). Bitte achten Sie darauf, den genauen Code zu veröffentlichen, der den Fehler verursacht. Sehen Sie sich an, wie man [mcve] – Miki

+0

macht. Solche Fehler sind normalerweise auf die Verwendung von debug libs in release oder umgekehrt zurückzuführen. Oder Bibliotheken, die mit einem anderen Compiler kompiliert wurden. Bitte zeigen Sie Ihren lib-Pfad, und Sie VS-Version – Miki

+0

Wow Miki, Sie hatten Recht! Ich hatte beide libs in debug und release auch. Lösung explorer> Rechte> Linker> Eingabe> Zusätzliche Abhängigkeiten und in release ich nur die opencv_world310.lib, in der debug opencv_world310d.lib. (Visual Studio 2015) Keine Fehler und die .xml erzeugt auch gut. Danke. –

Antwort

0

Ihr Code ist korrekt (abgesehen davon, dass Sie FileStorage fs... neu definieren, ändern Sie einfach den Namen).

Normalerweise, wenn Sie einen Unhandled exception Fehler in OpenCV haben, bedeutet das, dass Sie Debug-Bibliotheken in Release oder umgekehrt verwenden.


Aus den Kommentaren stellt sich heraus, dass dies in der Tat das Problem war. Stellen Sie sicher, dass Sie in Release nur mit opencv_world310.lib und im Debug mit opencv_world310d.lib verlinken.