Перейти к содержимому
Compvision.ru
SmileGobo

Валится программа при запуске при использовании libopencv_hightgui, Opencv+qt

Recommended Posts

Пишу приложение с использованием opencv под Win7. Использую Qt 4.8 собранный под MSVC 2010, opencv собранный им же. Qt Creator 2.6

Подключил к проекту opencv:

OPENCV_VERSION=243 #2.4.3


OPENCV_PATH="D:\projects\polygraph\lib\opencv\install"

#так походу разделяют сборки

#debug

CONFIG(debug,debug|release) {

    LIB_SUFIX=d

} else {#release


    LIB_SUFIX=

}


LIBS+=-L$${OPENCV_PATH}\lib


LIBS += -lopencv_video$${OPENCV_VERSION}$${LIB_SUFIX}

#LIBS += -lopencv_highgui$${OPENCV_VERSION}$${LIB_SUFIX}

LIBS += -lopencv_core$${OPENCV_VERSION}$${LIB_SUFIX}

LIBS += -lopencv_imgproc$${OPENCV_VERSION}$${LIB_SUFIX}

LIBS += -lopencv_calib3d$${OPENCV_VERSION}$${LIB_SUFIX}



INCLUDEPATH += "$${OPENCV_PATH}/include"

если подключаю LIBS += -lopencv_highgui$${OPENCV_VERSION}$${LIB_SUFIX}, то программа сразу же захлопывается не отработав, отладка так же моментально завершается. Если библиотеку не линковать в проект, то все ок. Я даже никакх вызовов из этой библиотеки не использую, а она все равно валится. Раньше под Qt делал консольный проект ничего подобного не было...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

OpenCV собрано с установленной опцией поддержки QT?

Помнится мне пришлось перестраивать с этой опцией, но точно уже не помню.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

OpenCV собрано с установленной опцией поддержки QT?

Помнится мне пришлось перестраивать с этой опцией, но точно уже не помню.

Сначала у меня была сборка без поддержки, после чего я собрал с поддержкой (видел в процессе сборки ссылки на какие-то qt библиотеки и файлы именовались с префиксом qt), но результат в обоих случаях одинаков

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

у Вас при сборке mingw одной версии использовался?

#include <opencv2/highgui/highgui.hpp> подключили?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Во первых я не использую mingw - я использую компилятор от майкрософт(так надо ;) ) Библиотеки соответствуют компилятору и по отдельности работаю. А если бы я не подключал необходимые инклуды, то речи о запуске программы бы не шло. На всякий случай код:

main.cpp

#include "mainwindow.h"

#include <QApplication>


int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.show();

    //w.ViewShootCam(); // в этом методе тестовый запуск opencv компонент

    return a.exec();

}
Что характерно программа валится, даже если не использовать вызовы opencv классов или методов MainWindow.cpp
#include "mainwindow.h"

#include "ui_mainwindow.h"


#include <opencv2/core/core.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>


#include <QImage>

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    //ViewShootCam();

}


MainWindow::~MainWindow()

{

    delete ui;

}


void MainWindow::ViewShootCam(){

   cv::Mat img;

  cv::VideoCapture cap;


    if( ! cap.isOpened() ){

        qDebug()<<"not captured";

        return;

    }

    cap >> img;


    cv::cvtColor(img, img, CV_BGR2RGB);

    QImage out_img((const unsigned char*)(img.data), img.cols, img.rows, QImage::Format_RGB888);


    ui->m_img_lbl->setPixmap(QPixmap::fromImage(out_img));

    ui->m_img_lbl->show();


}
MainWindow.h
#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>


namespace Ui {

class MainWindow;

}


class MainWindow : public QMainWindow

{

    Q_OBJECT


public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();

    void ViewShootCam();

private:

    Ui::MainWindow *ui;

};


#endif // MAINWINDOW_H

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а у Вас валиться только при использовании внутри QWidget? В смысле в консольном варианте все работает?

У меня тоже такая проблема была, что именно внутри QWidget'ов валилось, но у меня пересбором библиотеки все решилось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Да я поэкспериментировал и выяснил, что достаточно только подключить инклуд #include <opencv2/highgui/highgui.hpp> и начинаются чудеса, вроде пересобирал я библиотеки ну попробую еще раз...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Дело не в инклуде, а в присуствии в проекте вызовов opencv т.е. достаточно объявить где-то в коде функцию, где используется opencv, программа падает при запуске - войти в отладчик не возможно... :crazysmile:

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

а если напрямую адрес написать то работает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вероятно имеется ввиду прямой вызов функции из длл по ее адресу (см. GetProcAddress и т.п.).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Адреса то тут причем? и какие мне адреса загружать? Вообще не в ту сторону....

Попробовал собрать с mingw та же ерунда. Мне кажется, что hightgui имеет какой-то свой цикл опроса оконных приложений или что-то типо того и конфликтует с Qt шным.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я собирал под QT из студии и оконные и консольные приложения, все было хорошо.

правда я в ключал так:

// OpenCV header files
#include "opencv/highgui.h"[/code]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Проблема все же кроется при включении библиотек libopencv_highgui и libQtGui4... Что так может колбасить эти библиотеки не могу понять, нету мыслей как искать причину конфликта? :mellow:/>

Есть мысль попробовать еще на другой машине эти либы и на Debian

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
какой адрес?

я имел ввиду если Вы просто напишите

INCLUDE+=прямая ссылка

LIBS+=прямая ссылка

то работает или нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

я имел ввиду если Вы просто напишите

INCLUDE+=прямая ссылка

LIBS+=прямая ссылка

то работает или нет?

А как это может влиять? 0_о Конечно будет работать если я укажу напрямую хидеры и библиотеки...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну в смысле также вылетает? просто как вы написали в первом посте у меня сложилось мнение что нет)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

ну в смысле также вылетает? просто как вы написали в первом посте у меня сложилось мнение что нет)

А какая разница если подключаться теже хидеры и либы? Как результат может быть другим? Я уже перепробовал несколько сборок с разными версиями и компиляторами, разве что Qt весрию еще не менял... ума не приложу что не так... Думаю перелезть на wxWidgets уже...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Адреса то тут причем? и какие мне адреса загружать? Вообще не в ту сторону....

Попробовал собрать с mingw та же ерунда. Мне кажется, что hightgui имеет какой-то свой цикл опроса оконных приложений или что-то типо того и конфликтует с Qt шным.

Адреса как раз при том.

Ты же знаешь, каким образом exe выполняет код из dll? Про разницу статической и динамической линковки? Про то, каким образом CRT (C run time library) подключается? Если нет, то почитай в интернете.

А по проблеме: не подключай вообще lib файлы из OpenCV в свой проект. Ни одного. И не вызывай ни одной функции оттуда. А поставь по очереди вызовы LoadLibrary для dll из OpenCV и посмотри коды возврата и значение GetLastError() после каждого вызова LoadLibrary. И смотри, что пишется в Output при этом.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Адреса как раз при том.

Ты же знаешь, каким образом exe выполняет код из dll? Про разницу статической и динамической линковки? Про то, каким образом CRT (C run time library) подключается? Если нет, то почитай в интернете.

А по проблеме: не подключай вообще lib файлы из OpenCV в свой проект. Ни одного. И не вызывай ни одной функции оттуда. А поставь по очереди вызовы LoadLibrary для dll из OpenCV и посмотри коды возврата и значение GetLastError() после каждого вызова LoadLibrary. И смотри, что пишется в Output при этом.

Вот спасибо! Натолкнули Вы меня на отличную мысль!!!! Наверняка не так dll грузиться, ведь при сборке я получаю две директории со статическими либами, и это ЖЖЖ не спроста! ;)

Вечером проверю.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Адреса как раз при том.

Ты же знаешь, каким образом exe выполняет код из dll? Про разницу статической и динамической линковки? Про то, каким образом CRT (C run time library) подключается? Если нет, то почитай в интернете.

А по проблеме: не подключай вообще lib файлы из OpenCV в свой проект. Ни одного. И не вызывай ни одной функции оттуда. А поставь по очереди вызовы LoadLibrary для dll из OpenCV и посмотри коды возврата и значение GetLastError() после каждого вызова LoadLibrary. И смотри, что пишется в Output при этом.

Вот спасибо! Натолкнули Вы меня на отличную мысль!!!! Наверняка не так dll грузиться, ведь при сборке я получаю две директории со статическими либами, и это ЖЖЖ не спроста! ;)

Вечером проверю.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не прокатила затея, ладно попробуем грузить либы вручную, но что-то мне подсказывает, что не будет собираться без статических библиотек...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Может быть еще дело в CRT.

При сборке Opencv там есть пункт, позволяющий выбирать между статическим и динамическим вариантом.

По моему он должен совпадать с тем, что выбран в установках проекта.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Попробовал на Debian Sqeeueze opencv 2.4.2 Qt 4.6.3 все работает на ура. Но нужно это мне все под виндой =\ ... Не так я библиотеки походу цепляю.... Хотя в консоли все отлично работает без использования libQtGui...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ты просто компилируешь OpenCV и Qt с разными параметрами. Я как раз хотел узнать, что выдасть LoadLibrary, то есть источник расхождений, коды ошибок. Но ты почему-то об этом не пишешь.

Ещё можешь посмотреть на зависимости (таблицу импорта) в qt'шных dll и в opencv'шных. Если ты вдруг это сделаешь, то покажи здесь.

Вообще тяжело помогать, не имея вообще никаких данных. Или выложи что-ли свой exe со всеми используемыми dll. Не знаю, как по-другому пожно догадаться в чём у тебя проблема.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×