2012-10-02 14 views
8

Actualmente estoy sufriendo de algunas excepciones extrañas que son más probablemente debido a que yo haga algo de manera incorrecta al interactuar con OpenCV:cómo saber qué está causando "cv :: Exception at memory location"?

First-chance exception at 0x7580b9bc in xxx.exe: Microsoft C++ exception: cv::Exception at memory location 0x00c1c624..

ya he habilitado el campo Thrown en el menú Debug -> Exceptions, sin embargo, realmente no puedo entender en qué parte de mi código se lanza la excepción.

¿Cómo puedo depurar esto?

EDITAR marco de la pila se lee como esto (mi aplicación incluso no aparecer en la lista!):

  • KernelBase.dll 7580b8bc()
  • [Marcos a continuación pueden ser! incorrectos o falta]
  • KernelBase.dll! 7580b8bc()
  • opencv_core242d.dll! 54eb60cc()
+0

¿Ha intervenido con un depurador y ha visto qué línea causa la excepción? –

+0

@TonyTheLion Me encantaría hacer eso, pero desafortunadamente ni siquiera sé en qué parte de mi código se lanza la excepción. Todo lo que puedo ver es el Desmontaje. – memyself

+0

¿La excepción termina realmente su programa o se maneja? – Benj

Respuesta

10

Puede envolver todo su main en un bloque try catch que imprime los detalles de la excepción. Si la API abierta CV puede lanzar excepciones, tendrá que pensar en el manejo de ellos de todos modos como parte de su diseño:

try 
{ 
    // ... Contents of your main 
} 
catch (cv::Exception & e) 
{ 
cerr << e.msg << endl; // output exception message 
} 
+2

¡eso es un comienzo! Tuve que usar 'e.what()' en vez de 'e.msg()'. Ahora obtengo al menos el error de opencv, pero aún no sé en qué parte de mi programa se ha producido este error. ¿Hay alguna manera de resolverlo? – memyself

+0

@memyself Deberías ser capaz de resolverlo saliendo del depurador hasta que de repente termines en el bloque catch. Una vez que eso ocurra, fíjate bien en la última función Abrir CV que se invocó desde tu código. – Benj

+0

el problema es que el programa ocurre aleatoriamente y solo si el usuario hace algo con el mouse. Así que recorrerlo hasta que se produzca el error es bastante complicado. Estaba pensando que debería haber una manera de darme el número de línea, una vez que el depurador esté en el bloque 'catch', ¿o eso no es posible? – memyself

2

He conseguido este problema usando OpenCV con WebCam. El problema en mi caso es que el programa está tratando de leer una imagen cuando la cámara no se ha inicializado.

mi código de error:

// open camera 
capture.open(0); 
while (1){ 
    //store image to matrix // here is the bug 
    capture.read(cameraFeed); 

La solución

// open camera 
capture.open(0); 
while (1){ 

    //this line makes the program wait for an image 
    while (!capture.read(cameraFeed)); 

    //store image to matrix 
    capture.read(cameraFeed); 

(lo siento por mi Inglés) Gracias

1

OpenCV tiene esta práctica función llamada cv::setBreakOnError

Si pones el siguiente en su principal antes de cualquier llamadas OpenCV:

cv::setBreakOnError(true); 

continuación, el programa se bloqueará, ya que OpenCV hará una operación no válida (eliminación de referencias a un puntero nulo) justo antes de que tiraría cv :: Excepción normalmente. Si ejecuta su código en un depurador, se detendrá en esta operación ilegal y podrá ver toda la pila de llamadas con todos sus códigos y variables en el momento del error.

Cuestiones relacionadas