Speicherzugriffsfehler (Speicherabzug geschrieben) mit opencv

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wrench139
User
Beiträge: 17
Registriert: Mittwoch 16. März 2022, 15:45

Nabend zusammen,

ich probiere mich zur Zeit mit openCV aus und bin gerade bei Histogrammen. Mein Code sieht wie folgt aus:

Code: Alles auswählen

import cv2
from matplotlib import pyplot as plt

img = cv2.imread("lena.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# cv2.imshow("original", img)
# cv2.waitKey()

histo = cv2.calcHist([img], [0], None, histSize=[255], ranges=[0, 255])

plt.figure
plt.title("grayscalehistogram of original image")
plt.xlabel("bins")
plt.ylabel("Number of Pixels")
plt.plot(histo)
plt.show()

imgEqualizied = cv2.equalizeHist(img)
histoEqualized = cv2.calcHist([imgEqualizied], [0], None, histSize=[255], ranges=[0, 255])

plt.figure
plt.title("grayscalehistogram of equalized image")
plt.xlabel("bins")
plt.ylabel("Number of Pixels")
plt.plot(histoEqualized)
plt.show()

cv2.imshow("original", img)
cv2.imshow("equalized image", imgEqualizied)
cv2.waitKey()

Der Code läuft in dieser Form durch. Im Terminal erhalte ich jedoch abschließend die (Fehler-)Meldung "Speicherzugriffsfehler (Speicherabzug geschrieben)".
Sofern ich die Zeilen 7 und 8 nicht auskommentiere, läuft das Skript nur noch bis zu eben jenen Zeilen 7 & 8 durch.

Kann mir jemand erklären was genau da schiefläuft und was ich tun muss damit der Fehler nicht mehr auftritt?

Danke schon mal :)
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

wrench139 hat geschrieben: Donnerstag 19. Mai 2022, 18:31
Der Code läuft in dieser Form durch. Im Terminal erhalte ich jedoch abschließend die (Fehler-)Meldung "Speicherzugriffsfehler (Speicherabzug geschrieben)".
Sofern ich die Zeilen 7 und 8 nicht auskommentiere, läuft das Skript nur noch bis zu eben jenen Zeilen 7 & 8 durch.
Ich denke dir würde es sehr helfen, wenn du klar sagen kannst, wann der Speicherzugriffsfehler kommt, Zeile 7 oder 8 ist nicht hilfreich.
Auch die Formulierung „Der Code läuft in dieser Form durch. Im Terminal erhalte ich jedoch abschließend…" macht es nicht einfach zu verstehen, was dein Code wirklich macht. Ich deute das mal so, dass vielleicht cv2.waitKey() denn Speicherfehler auslöst. Das kannst du damit überprüfen, indem du nur die Zeile 8 aus kommentierst und in der Zeile 9 ein Breakpoint setzt. Wenn der Breakpoint erreicht wird Bingo, wenn nicht weiter suchen.

Außerdem hilft es, wenn du dein Environment für solche Untersuchungen so einstellst, dass du englische Fehlermeldungen produzierst, zum Beispiel mit LANG=C bei Linux/Unix, das macht es viel leichter nach der entsprechenden Fehlermeldung zu googeln. Spontan könnte das dein Problem sein https://github.com/opencv/opencv/issues/20311

Ein Speicherzugriffsfehler deutet im Allgemeinen auf ein fehlerhaftes Ressource-Management der zugrunde liegenden C++ Bibliotheken hin. Es könnte hilfreich sein, wenn du ein System so einstellst, dass es Coredumps schreibt, dann hättest du eine wertvolle Information, was schief geht. Der Coredump, mit dem Quellcode deiner Bibliotheken und ein Debugger, verraten dir die exakte Zeile in der C++ Bibliothek wo das Problem auftritt. Das setzt aber voraus, dass du C++ verstehen kannst! Wichtig so ein Coredump nicht einfach aus der Hand geben, der Dump enthält alle Informationen welche der Prozess im Speicher (RAM) gehabt hat. Da können durchaus sensible Informationen wie API-keys oder Passwörter drin sein, das ist einer der Gründe, warum die Coredumps heutzutage nicht mehr automatisch erzeugt werden.
wrench139
User
Beiträge: 17
Registriert: Mittwoch 16. März 2022, 15:45

OK, Danke schon mal. Die Antwort ist für mich als "Programmierneuling" jedoch viel zu komplex um ehrlich zu sein.

Mit
"Der Code läuft in dieser Form durch. Im Terminal erhalte ich jedoch abschließend die (Fehler-)Meldung "Speicherzugriffsfehler (Speicherabzug geschrieben)".
meine ich folgendes:
Ich erhalte mein gewünschtes Resultat. Heißt: es werden zwei Histogramme von Schwarz-Weiß-Bildern erstellt, grafisch ausgegeben und die beiden Bilder werden korrekt grafisch angezeigt. Am Ende steht dann jedoch der "Speicherzugriffsfehler" im Terminal.

Nehme ich die Codezeile Nr. 7 mit rein (also ich lösche die Raute), wird durch cv2.imshow("original", img) das Bild noch für einen kurzen Moment korrekt grafisch angezeigt (soweit normal, weil Zeile 8 noch auskommentiert ist). und das Skript läuft nicht weiter durch (es bricht ab/ der Rest wird nicht ausgeführt) und ich erhalte ebenfalls "Speicherzugriffsfehler (Speicherabzug geschrieben)" im Terminal.
Selbiges tritt ein, wenn ich Codezeile 8 auch noch mit rein nehme.

Vielleicht könnte von euch ja einmal jemand probieren den Code bei sich laufen zu lassen ( eventuell ein mal mit den auskommentierten Zeilen 7 & 8 und ein mal mitsamt Zeile 7 & 8 )?
Wenn der Fehler bei anderen nicht auftritt, wüsste ich zumindest mal, dass es an meinem System liegt.
wrench139
User
Beiträge: 17
Registriert: Mittwoch 16. März 2022, 15:45

Update meinerseits:

es liegt wohl an meinem System. Auf einem anderen Rechner läuft alles problemlos.
imonbln
User
Beiträge: 149
Registriert: Freitag 3. Dezember 2021, 17:07

wrench139 hat geschrieben: Freitag 20. Mai 2022, 10:00 Vielleicht könnte von euch ja einmal jemand probieren den Code bei sich laufen zu lassen ( eventuell ein mal mit den auskommentierten Zeilen 7 & 8 und ein mal mitsamt Zeile 7 & 8 )?
Wenn der Fehler bei anderen nicht auftritt, wüsste ich zumindest mal, dass es an meinem System liegt.
Jein, vermutlich hat die opencv Version, welche du verwendest ein Problem, jemand anders könnte andere Versionen als du haben und damit das Problem nicht triggern. Ich würde dir raten ein minimales Programm zu erstellen, dass den Fehler hat. Wenn ich dich richtig verstanden habe, sollte das vielleicht das folgende sein:

Code: Alles auswählen

import cv2
from matplotlib import pyplot as plt

img = cv2.imread("lena.png")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# cv2.imshow("original", img)
cv2.waitKey()

Interessant könnte in dem Zusammenhang vielleicht auch die Ressource lena.png sein. Vielleicht konvertierst du die mal Test halber zu ein JPEG oder so. Mit dem minimalen Programm und den dazugehörenden minimalen Ressourcen, würde ich mich direkt an die Opencv Entwickler wenden. Das hilft denen dein Problem zu reproduzieren und zu lösen. Und viel wichtiger es hilft dir das Problem zu reproduzieren und zu sehen, ob das Problem gelöst ist. In den Link welchen ich dir gesendet habe, hat zum Beispiel ein Teilnehmer geschrieben, dass ihn ein Downgrade geholfen hat.
Fakt ist aber du hast das Problem und das musst du bei dir lösen oder aufgeben! Wir als Forum können nur von der Seitenlinie zusehen und dir Tipps geben.
Antworten