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
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der ersten code-block,
img1
undimg2
deklariert werden und enthalten zwei graue gültige Bilder (da Sie nichtimread
). Beachten Sie, dass dieseimg1
undimg2
sind nicht Globale Variablen, sondern lokal. Wenn Sie Globale Variablen mit dem gleichen Namen, die einheimischen Schatten.Im zweiten block legen Sie
img2
imelse
und späterimg1 - img2
, aber Sie zeigen nicht, um uns den Wert derimg1
(in diesem Fall die Globale variable). Dieimg1
ist in derif
lokalenif
und ist nicht sichtbar in derelse
. Wahrscheinlich, Sie definiertcv::Mat img1
im globalen Bereich, aber du hast nicht geben Sie einen beliebigen Wert. Dies würde einen Fehler verursachen, inimg1-img2
denn Sie sind von unterschiedlicher Größe (img1
leer wäre).Update: so Etwas sollte es beheben.
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:
Und das ist falsch:
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
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