problem beim speicherzugriff, bei getriggerten Kameras



  • Hallo,
    kennt sich hier jemand mit der ids Kameraschnittstellen Programmierung aus?? Ich nutze 3 gigE Kameras von ids, wobei ich mit einer die anderen beiden triggere. Sobald ich den triggermode der zwei getriggerten Kameras aktiviere, kann ich nicht auf den Speicher zugreifen...
    Es wird mir angezeigt, dass die Kameras nicht geöffnet bzw. initialisiert sind, obwohl das getan wurde. Hier ein Codeausschnitt, hoffe das jemand damit etwas anfangen kann.

    /Init Gray and Colour Cams
    if(is_InitCamera(&phCamColour,NULL)==0 &&
    	   is_InitCamera(&phCamGray1,NULL)==0  &&
    	   is_InitCamera(&phCamGray2,NULL)==0)
    	{
    
    		//set memory format
    		is_SetColorMode (phCamColour, IS_CM_BGR8_PACKED );
    		is_SetColorMode (phCamGray1, IS_CM_MONO8);
    		is_SetColorMode (phCamGray2, IS_CM_MONO8);
    		//
    		is_SetDisplayMode (phCamColour, IS_SET_DM_DIB);
    		is_SetDisplayMode (phCamGray1, IS_SET_DM_DIB);
    		is_SetDisplayMode (phCamGray2, IS_SET_DM_DIB);
    
    		//set framerate
    		is_SetFrameRate (phCamColour, FPS, &newFPS);
    		is_SetFrameRate (phCamGray1, FPS, &newFPS);
    		is_SetFrameRate (phCamGray2, FPS, &newFPS);
    
    		//set flash(trigger puls)
    		is_SetFlashDelay (phCamColour,pulDelay,  pulDuration);
    		is_SetFlashStrobe (phCamColour, IS_SET_FLASH_HI_ACTIVE, 0);
    		//set trigger
    		is_SetExternalTrigger (phCamColour, IS_SET_TRIGGER_OFF);
    		is_SetExternalTrigger (phCamGray1, IS_SET_TRIGGER_HI_LO);
    		is_SetExternalTrigger (phCamGray2, IS_SET_TRIGGER_HI_LO);
    
    		// create Ringbuffer
    		char *pFrameBuffer[iBufferSize]; 
    		char *pFrameBufferGray1[iBufferSize]; 
    		char *pFrameBufferGray2[iBufferSize]; 
    
    		INT pFrame[iBufferSize]; 
    		INT pFrameGray1[iBufferSize]; 
    		INT pFrameGray2[iBufferSize]; 
    
    		is_ClearSequence(phCamColour); 
    		is_ClearSequence(phCamGray1); 
    		is_ClearSequence(phCamGray2); 
    
    		for (int i = 0; i < iBufferSize; ++i) 
    		{ 
    
    			if (is_AllocImageMem(phCamColour, m_nSizeX, m_nSizeY, 24, &pFrameBuffer[i], &pFrame[i]) != IS_SUCCESS) 
    				return false; 
    			if (is_AddToSequence(phCamColour, pFrameBuffer[i], pFrame[i]) != IS_SUCCESS) 
    				return false; 		
    			if (is_AllocImageMem(phCamGray1, m_nSizeX,m_nSizeY, 8, &pFrameBufferGray1[i], &pFrameGray1[i]) != IS_SUCCESS) 
    				return false; 
    			if (is_AddToSequence(phCamGray1, pFrameBufferGray1[i], pFrameGray1[i]) != IS_SUCCESS) 
    				return false; 
    			if (is_AllocImageMem(phCamGray2, m_nSizeX, m_nSizeY, 8, &pFrameBufferGray2[i], &pFrameGray2[i]) != IS_SUCCESS) 
    				return false; 
    			if (is_AddToSequence(phCamGray2, pFrameBufferGray2[i], pFrameGray2[i]) != IS_SUCCESS) 
    				return false; 
    
    			pFrame[i] = i + 1; 
    			pFrameGray1[i] = i + 1;
    			pFrameGray2[i] = i + 1;
    		} 
    		//capture Video
    		is_CaptureVideo(phCamColour, IS_WAIT);
    		is_CaptureVideo(phCamGray1, IS_WAIT);
    		is_CaptureVideo(phCamGray2, IS_WAIT);
    
    		//init ImageQueue
    		is_InitImageQueue (phCamColour, 0);
    		is_InitImageQueue (phCamGray1, 0);
    		is_InitImageQueue (phCamGray2, 0);
    		char *pBuffer = NULL;
    		INT nMemID = 0;
    		char *pBufferGray1 = NULL;
    		INT nMemIDGray1 = 0;
    		char *pBufferGray2 = NULL;
    		INT nMemIDGray2 = 0;
    
    		//grab next image from queue
    		while (IS_SUCCESS == is_WaitForNextImage(phCamColour, 1000, &pBuffer, &nMemID))
    		{
    			//returns 3 as return value!!!
    			is_WaitForNextImage(phCamGray1, 1000, &pBufferGray1, &nMemIDGray1);
    			is_WaitForNextImage(phCamGray2, 1000, &pBufferGray2, &nMemIDGray2);
    
    			//set memory address
    			img->imageData=pBuffer;
    			imgGray1->imageData=pBufferGray1;
    			imgGray2->imageData=pBufferGray2;
    
    			//show images
    			cvShowImage("test",img);
    			cvShowImage("gray1",imgGray1);	//program crashes
    			cvShowImage("gray2",imgGray2);
    			cvWaitKey(1);
    
    			//release memory
    			is_UnlockSeqBuf (phCamColour, nMemID, pBuffer);
    			is_UnlockSeqBuf (phCamGray1, nMemIDGray1, pBufferGray1);
    			is_UnlockSeqBuf (phCamGray2, nMemIDGray2, pBufferGray2);
    		}
    

    Hat jemand eine Ahnung wo mein Fehler ist?



  • Danke für die C++-Tags.



  • Hallo bronkobob,

    versuche es doch mal direkt bei IDS, die haben einen sehr guten Support die können Dir sicher weiterhelfen.

    Herzliche Grüsse
    Walter



  • Ja, die haben eigentlich auch einen guten Support, doch die hatten nichts am Code auszusetzen.
    Ich habe jetzt herausgefunden, dass wenn ich die Frame per seconds unter 20 Stelle keine Fehler mehr auftritt. Selbst wenn ich die Frames gar nicht mehr anzeige, bekomme ich ab 20 frames in der sekunde ne fehlermeldung. Ist die Speicherverwaltung so langsam, dass nicht mehr Bilder pro sekunde verarbeitet werden können?



  • Return value 3 ist doch ein timeout. Du kriegst also scheinbar innerhalb deines Timeouts (1000 ms) kein Trigger-Signal und somit wird der Puffer gar nicht gefüllt. Du darfst sowieso nur fortfahren, wenn deine is_WaitForNextImage-Aufrufe beide IS_SUCCESS zurückgeben und die Zeiger nicht NULL sind. Aber egal, du bist sicher noch am rumprobieren und hast deshalb nicht alle Überprüfen im Programm. Jedenfalls solltest du mal überlegen, warum dein Trigger-Eingang nichts meldet. Was genau ist denn eigentlich dein Trigger?



  • Bronkobob schrieb:

    Ja, die haben eigentlich auch einen guten Support, doch die hatten nichts am Code auszusetzen.
    Ich habe jetzt herausgefunden, dass wenn ich die Frame per seconds unter 20 Stelle keine Fehler mehr auftritt. Selbst wenn ich die Frames gar nicht mehr anzeige, bekomme ich ab 20 frames in der sekunde ne fehlermeldung. Ist die Speicherverwaltung so langsam, dass nicht mehr Bilder pro sekunde verarbeitet werden können?

    Ok, nun sieht die Sache schon anders aus. Hm, ich würde an deiner Stelle mal ausprobieren, ob du - sofern möglich - mit anderen Settings (z.B. geringere exposure time) eine höhere Framerate erzielen kannst. Außerdem hat die Kamera ja eine maximale Pixel- bzw. Zeilenfrequenz, die du vielleicht schon überschreiten willst?



  • Vielen Dank für die Info, ich habe die Pixelclock hochgesetzt und jetzt funzt es.
    Ist nur komisch, dass es im Nicht-Trigger-mode auch ohne manuelle Veränderung der Pixelclock funktionierte.



  • Bronkobob schrieb:

    Vielen Dank für die Info, ich habe die Pixelclock hochgesetzt und jetzt funzt es.
    Ist nur komisch, dass es im Nicht-Trigger-mode auch ohne manuelle Veränderung der Pixelclock funktionierte.

    Verstehe ich auch nicht. Nach meinem Verständnis und meiner Erfahrung sollte die Kamera im Freerun-Modus die Frequenz liefern, die man setzt (vorausgesetzt, man kann sie auch setzen, ansonsten gibts nur full speed) bzw. die eingestellt ist. Oder hält die Kamera eventuell 2 Werte (Frequenz freerun und Frequenz triggered)?


Anmelden zum Antworten