Problema con acceso a memoria
Hola,
Tengo un programa realizado con QT y OpenCV, que abre imágenes y realiza algunas operaciones…. En modo consola funciona perfectamente.
Pero al querer implementarlo en una aplicación con interfaz gráfica da problemas durante la ejecución. El problema está cuando se llama a la función cvResize(tmp, ent2) el programa se cierra y devuelve el siguiente mensaje: "El programa finalizó retornando -1073741819", es una violación al acceso de memória. Si lo ejecuto en modo depuración se para y muestra el siguiente mensaje:
"Signal received"
The inferior stopped because it receicved a signal from the Operating System.
Signal name:
Signal meaning: Segmentation fault.
Programa de consola
Archivo "main.cpp"
#include <QtCore/QCoreApplication> //Incluir librerias OpenCV #include <cxcore.h> #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); //Operaciones con OpenCV cvNamedWindow("Imagen 1", 1); cvNamedWindow("Imagen 2", 1); cvNamedWindow("Imagen tmp", 1); IplImage *ent1= cvLoadImage("perro.bmp", 1); IplImage *tmp= cvLoadImage("imagen2.bmp", 1); IplImage *ent2= cvCloneImage(ent1); cvShowImage("Imagen 1", ent1); cvShowImage("Imagen tmp",tmp); cvShowImage("Imagen 2", ent2); cvResize(tmp, ent2); //Función problemática… cvReleaseImage(&tmp); cvShowImage("Imagen 2", ent2); cvWaitKey(0); return 0; }
Programa con interfaz gráfica
Archivo "mainwindow.h"
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); protected: void changeEvent(QEvent *e); private: Ui::MainWindow *ui; private slots: private slots: void on_pushButton_clicked(); }; #endif // MAINWINDOW_H
Archivo "mainwindow.cpp"
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include <cxcore.h> #include <cv.h> #include <highgui.h> MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); } MainWindow::~MainWindow() { delete ui; } void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this); break; default: break; } } void MainWindow::on_pushButton_clicked() { //Operaciones con OpenCV IplImage *ent1,*ent2,*tmp; cvNamedWindow("Imagen 1", 1); cvNamedWindow("Imagen 2", 1); cvNamedWindow("Imagen tmp", 1); ent1= cvLoadImage("perro.bmp", 1); tmp= cvLoadImage("imagen2.bmp", 1); ent2= cvCloneImage(ent1); cvShowImage("Imagen 1", ent1); cvShowImage("Imagen tmp",tmp); cvShowImage("Imagen 2", ent2); cvResize(tmp, ent2); //Función problemática, si la quito el programa funciona, pero no es la solución… cvReleaseImage(&tmp); cvShowImage("Imagen 2", ent2); }
Archivo "main.cpp"
#include <QtGui/QApplication> #include "mainwindow.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }
Alguien sabe dónde está el error o problema o cómo solucionarlo…
Muchas gracias.


Comprueba los punteros
Un fallo de "Segmentation Fault" significa dos cosas: o bien el puntero suministrado no está inicializado, con lo que no puede trabajar con él, o que se ha saltado el límite del mismo y ha pasado a una zona de memoria no reservada.
Lamentablemente no tengo el OpenCV instalado ni tampoco tiempo para hacer pruebas, pero yo comenzaría por ahí: comprobando que las operaciones de creación de imágenes, efectivamente, están creando las imágenes que necesito y no me están devolviendo punteros nulos o similares, aunque creo que de ser ese el problema, las funciones para mostrar las imágenes no funcionarían tampoco.
Comprueba también las dimensiones de las imágenes. Quizás el cvResize no esté determinando correctamente la altura o anchura de alguna de las dos imágenes, la de origen o la de destino.
Otra opción es simular el funcionamiento cvResize, pero eso significaría transformar las imágenes cargadas por las funciones de openCV al tipo QImage o QPixmap, para hacer ahí la transformarción de tamaño, y luego volver a convertirlas al formato que entiende openCV para seguir trabajando con ellas. Esto quizás signifique una pérdida de rendimiento, pero si no queda más remedio...
¡Un saludo!