Montag, Januar 20, 2020

OpenCV Error: Größen von input-Argumente nicht übereinstimmen (Die operation ist weder ‚array op array‘)

Arbeite ich an einem Projekt, das mit opencv auf dem raspberry pi. Ich habe laufen in einem Hindernis, das sieht einfach aus, aber ich bin nicht in der Lage, das Problem zu lösen.
Zunächst, hier ein Teil von meinem code:

    {
        gray=cvarrToMat(py);
        ///cvShowImage("camcvWin", py); //display only gray channel
        if(img_num%2 == 1)
        {
            cv::imwrite("/home/pi/test/Gray_2Image1.jpg",gray);
        }
        else if (img_num%2 == 0)
        {
            cv::imwrite( "/home/pi/test/Gray_2Image2.jpg", gray );  
            cv::Mat img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0);
            cv::Mat img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0);
            diffImage = abs(img1-img2);
            imshow("diffImage", diffImage);
            cv::imwrite( "/home/pi/test/Diffimage.jpg", diffImage );

        }          
        img_num++;

Dieser code ist kein problem.
Allerdings, wenn ich den code Bearbeiten, um eine leichte Veränderung wie folgt:

    {
        gray=cvarrToMat(py);
        ///cvShowImage("camcvWin", py); //display only gray channel
        if(img_num%2 == 1)
        {
            cv::imwrite("/home/pi/test/Gray_2Image1.jpg",gray);
            cv::Mat img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0);
        }
        else if (img_num%2 == 0)
        {
            cv::imwrite( "/home/pi/test/Gray_2Image2.jpg", gray );  
            cv::Mat img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0);
            diffImage = abs(img1-img2);
            imshow("diffImage", diffImage);
            cv::imwrite( "/home/pi/test/Diffimage.jpg", diffImage );

        }          
        img_num++;

Bekomme ich die folgende Fehlermeldung:

OpenCV Error: Größen von input-Argumente nicht übereinstimmen (Die operation ist weder „array-op-array‘ (wo-arrays haben die gleiche Größe und die gleiche Anzahl von Kanälen), noch ‚array op scalar‘, noch ‚Skalare op array‘) in arithm_op, file /home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp, Zeile 1253
kündigen, genannt nach dem werfen einer Instanz von „cv::Exception‘
was (ist): /home/pi/OpenCV-2.3.1/modules/core/src/arithm.cpp:1253: Fehler: (-209) Der Betrieb ist weder „array-op-array‘ (wo-arrays haben die gleiche Größe und die gleiche Anzahl von Kanälen), noch ‚array op scalar‘, noch ‚Skalare op array‘ in der Funktion arithm_op

Ich bin nicht wirklich in der Lage zu verstehen, was Los ist. img1 und img2 werden Global definiert, als Matte.
Dies könnte ein einfaches Problem, aber ich bin noch ein Neuling. Bitte helft mir das Problem zu lösen.
Vielen Dank für Ihre Zeit.

InformationsquelleAutor Dead-coder | 2013-07-15

2 Kommentare

  1. 3

    In der ersten code-block, img1 und img2 deklariert werden und enthalten zwei graue gültige Bilder (da Sie nicht imread). Beachten Sie, dass diese img1 und img2 sind nicht Globale Variablen, sondern lokal. Wenn Sie Globale Variablen mit dem gleichen Namen, die einheimischen Schatten.

    Im zweiten block legen Sie img2 im else und später img1 - img2, aber Sie zeigen nicht, um uns den Wert der img1 (in diesem Fall die Globale variable). Die img1 ist in der if lokalen if und ist nicht sichtbar in der else. Wahrscheinlich, Sie definiert cv::Mat img1 im globalen Bereich, aber du hast nicht geben Sie einen beliebigen Wert. Dies würde einen Fehler verursachen, in img1-img2 denn Sie sind von unterschiedlicher Größe (img1 leer wäre).

    Update: so Etwas sollte es beheben.

    //global scope
    cv::Mat img1, img2, diffImage;
    
    void yourFunction()
    {
       ...
       img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0);
       img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0);
       diffImage = abs(img1-img2);
       ...
    }

    Wieder ein Update: Sie können das laden der Bilder in den verschiedenen if-else-Blöcke als lange wie Ihre Deklaration sichtbar ist.

    Dies ist ok:

    //global scope
    cv::Mat img1, img2, diffImage;
    
    void yourFunction()
    {
       ...
       if(condition)
       {
          img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0);
       }
       else
       {
          img2 = cv::imread("/home/pi/test/Gray_2Image2.jpg", 0);
       }
       ...
       diffImage = abs(img1-img2); //make sure img1 and img2 are loaded first
       ...
    }

    Und das ist falsch:

    //global scope
    cv::Mat img1, img2, diffImage;
    
    void yourFunction()
    {
       ...
       if(condition)
       {
          //wrong: you are creating a local variable that shadows the global one
          cv::Mat img1 = cv::imread("/home/pi/test/Gray_2Image1.jpg", 0);
       }
       ...
       diffImage = abs(img1-img2); //img1 is the global variable and not the local one in the previous if block!
       ...
    }
    Jetzt bekomme ich den Punkt. Gibt es eine Möglichkeit, um dieses problem zu beheben? Wie kann man erklären, img1 und img2 in zwei verschiedenen Bedingungen und verwenden Sie noch ohne diesen Fehler. Ich habe erklärt img1 und img2 als Globale variable, und es gibt keine lokalen Variablen namens img1 und img2.
    Ich bearbeitet meine Antworten, um Ihren Kommentar. Beachten Sie, dass Sie keine Variablen deklarieren, die in einem Rahmen und verwenden Sie Sie in ein anderes, wo der eine ist nicht sichtbar. Es zu sagen, Sie kann nicht deklarieren Sie eine variable im if-block und im else-block, der die Deklaration muss gut sichtbar sein, aus dem block, wo du die variable benutzen. In meinem Beispiel habe ich den globalen scope, so dass Sie können verwenden Sie die Variablen in jedem if-oder else-block. Allerdings sollten Sie Variablen deklarieren, mit den minimalen Spielraum, den Sie brauchen. In dem Beispiel, wenn Sie nicht brauchen, img1 oder img2 außerhalb yourFunction, Sie sollten lokale besser.
    Wie Sie gesagt haben, es scheint, dass der einzige Weg, es zu tun, ist die Art, wie oben erwähnt, das beinhaltet das Lesen der zwei Bilder in der gleichen Zeit in der gleichen if-oder else. Vielen Dank, dass du mich verstehen, wie es funktioniert.
    Gut, es ist nicht genau so. Laden Sie die Bilder in jedem Teil des Codes, aber Sie müssen sicherstellen, dass Sie es tun in der sichtbaren cv::Mat und nicht lokal. Überprüfen Sie die zwei neue Beispiele.
    Danke für deine Zeit 🙂

    InformationsquelleAutor ChronoTrigger

  2. 0

    In der else if block – img1 ist nicht definiert oder leer – geben Sie eine bessere Diagnostik, mehr code erforderlich ist.

    Außerdem: warum willst du speichern gray auf der Festplatte nur in Ordnung, es erneut zu Lesen?

    InformationsquelleAutor drahnr

Kostenlose Online-Tests