[OpenCV\Emgu\C#] Stereobilder - Tiefenbilder

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

[OpenCV\Emgu\C#] Stereobilder - Tiefenbilder

Beitrag von The_Real_Black »

Hallo ZFX und Developa ^^

Im Folgenden Code berechne ich zweimal die Disparitätenbilder, aber im unteren Teil des Codes führt die Berechnung zu einen Fehler entweder einer "System.AccessViolationException" oder einer EmguCV Exception ohne Fehlermeldungstext oder innere Exception. Was unterscheidet aber beide Codestellen voneinander?

Im oberen lade ich die Bitmaps frisch von der Platte unten hingegen sind beide Bilder bereits als Bitmap geladen und dann in einer Picturebox verstaut worden. Gleiches gilt für die AlgoKlasse "StereoBM" oben wird sie frisch angelegt wärend unten sie mit den gleichen Einstellungen bereits initialisiert wurde. Wieso sollte es für Emgu\OpenCV einen unterschied machen ob ein Bitmap frischgeladen wurde oder nicht.

Hat einer Erfahrungen mit der Stereobild-Verarbeitung mit Emgu und OpenCV?

Code: Alles auswählen

			Size s = new System.Drawing.Size(640, 480);
			//---------------------------------------------------------------------------------------------------
// OBEN
			Image<Gray, byte> imageLeft;
			Image<Gray, byte> imageRight;
			Image<Gray, short>  disparityImage = new Image<Gray, short>(s);
			Bitmap bmpL = new Bitmap(@"C:\test\bin\Debug\left.bmp");
			Bitmap bmpR = new Bitmap(@"C:\test\bin\Debug\right.bmp");
			StereoBM stereoAlgorithm = new StereoBM(Emgu.CV.CvEnum.STEREO_BM_TYPE.CV_STEREO_BM_BASIC, 0);

			imageLeft = new Image<Gray, byte>(bmpL);
			imageRight = new Image<Gray, byte>(bmpR);

			imageLeft = imageLeft.Resize(disparityImage.Width, disparityImage.Height);
			imageRight = imageRight.Resize(disparityImage.Width, disparityImage.Height);

			stereoAlgorithm.FindStereoCorrespondence(
				imageLeft,
				imageRight,
				disparityImage);
			//---------------------------------------------------------------------------------------------------
// UNTEN
			Image<Gray, byte> ImgL = new Image<Gray, byte>(pic_Left.Image as Bitmap);
			Image<Gray, byte> ImgR = new Image<Gray, byte>(pic_Right.Image as Bitmap);
			Image<Gray, short> D = new Image<Gray, short>(s);

			ImgL = ImgL.Resize(s.Width, s.Height);
			ImgR = ImgR.Resize(s.Width, s.Height);
			BM.FindStereoCorrespondence(
				ImgL,
				ImgR, 
				D); 
			pic_DBM.Image = D.ToBitmap();
Happy Coding.
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

Re: [OpenCV\Emgu\C#] Stereobilder - Tiefenbilder

Beitrag von The_Real_Black »

FU****** EMGU OPENCV UND DER GANZE REST!!!
Ein Fall für den Jammer-Thread!

Code: Alles auswählen

		public FrmMain() {
			InitializeComponent();

			GC = new StereoGC(0, 100);
			BM = new StereoBM(Emgu.CV.CvEnum.STEREO_BM_TYPE.CV_STEREO_BM_BASIC, 0);
		}
BM geht.

Code: Alles auswählen

		public FrmMain() {
			InitializeComponent();

			BM = new StereoBM(Emgu.CV.CvEnum.STEREO_BM_TYPE.CV_STEREO_BM_BASIC, 0);
			GC = new StereoGC(0, 100);
		}
BM geht nicht. (System.AccessViolationException)

Sowas könnte man in einer Doku mal erwähnen, dass man bei OpenCV ganz massiv darauf achten muss wann man was initialisiert... An was könnte sowas liegen?
Happy Coding.
Benutzeravatar
eXile
Establishment
Beiträge: 1136
Registriert: 28.02.2009, 13:27

Re: [OpenCV\Emgu\C#] Stereobilder - Tiefenbilder

Beitrag von eXile »

Könntest du den Callstack bei der Exception bitte mal posten? Ansonsten ein Schuss ins Blaue: Ich denke, es liegt an dem von Dir benutzten Wrapper, der bei diesen Aufrufen unerwünschte Nebeneffekte verursacht.
Benutzeravatar
The_Real_Black
Establishment
Beiträge: 110
Registriert: 19.01.2008, 19:57
Benutzertext: Happy Coding
Kontaktdaten:

Re: [OpenCV\Emgu\C#] Stereobilder - Tiefenbilder

Beitrag von The_Real_Black »

eXile hat geschrieben:Könntest du den Callstack bei der Exception bitte mal posten? Ansonsten ein Schuss ins Blaue: Ich denke, es liegt an dem von Dir benutzten Wrapper, der bei diesen Aufrufen unerwünschte Nebeneffekte verursacht.
Stack Trace wenn man GC nicht initialisiert bzw BM über GC.

Code: Alles auswählen

   bei Emgu.CV.CvInvoke.cvFindStereoCorrespondenceBM(IntPtr left, IntPtr right, IntPtr disparity, MCvStereoBMState& state)
   bei Emgu.CV.StereoBM.FindStereoCorrespondence(Image`2 left, Image`2 right, Image`2 disparity)
   bei Start.FrmMain.but_Algo1_Click(Object sender, EventArgs e) in FrmMain.cs:Zeile 195.
Ja entweder liegt es an EmguCV oder was eher ist an OpenCV selbst. Da anscheinend Emgu über ein "Invoke" in den OpenCV DLLs zugreift könnte man davon ausgehen, dass es erst danach zur Speicherverletzung kommt, daher ist es vermutlich ein OpenCv Problem.
Frage ist nur wieso man keine System.AccessViolationException abfangen kann der catch Block schlägt nicht zu und selbst im Debugger bricht das Programm an der Stelle sofort ohne Fehlerbehandlung ab.
Happy Coding.
Antworten