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

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

Recommended Posts

Ты просто компилируешь OpenCV и Qt с разными параметрами.

Qt берется готовый и я также брал готовые билды opencv.

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

Я не знаю как выгрузить классы Opencv с помощью LoadLibrary, да и вообще как под винду собрать без указания статических либ тоже не имею понятия, под Linux компилер сам подхватывал so вместо .lib

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

Как это можно сделать?

Или выложи что-ли свой exe со всеми используемыми dll.

Чуть позже доеду домой выложу, если надо.

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


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

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

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

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

Пробовал менять его не помогло

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


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

Qt берется готовый и я также брал готовые билды opencv.

Это не гарантия.

Я не знаю как выгрузить классы Opencv с помощью LoadLibrary, да и вообще как под винду собрать без указания статических либ тоже не имею понятия, под Linux компилер сам подхватывал so вместо .lib

Этого не надо. Я в предыдущем посте писал, что надо просто вызвать и на какие коды ошибок смотреть.

Как это можно сделать?

Я в шестнадцатеричном редакторе Far'а смотрю. Можно плагин к нему поставить, который это сам сделает.

P.S. Согласен, что в Линуксе зависимости отслежииваются проще. То, с чем ты сейчас столкнулся, называется то ли dll hell, то ли dependency hell. Прочувствуй это.

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


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

QStringList libs_name;

    libs_name

            <<"opencv_calib3d243.dll"

            <<"opencv_contrib243.dll"

            <<"opencv_core243.dll"

            <<"opencv_features2d243.dll"

            <<"opencv_ffmpeg243.dll"

            <<"opencv_flann243.dll"

            <<"opencv_gpu243.dll"

            <<"opencv_highgui243.dll"

            <<"opencv_imgproc243.dll"

            <<"opencv_legacy243.dll"

            <<"opencv_ml243.dll"

            <<"opencv_nonfree243.dll"

            <<"opencv_objdetect243.dll"

            <<"opencv_photo243.dll"

            <<"opencv_stitching243.dll"

            <<"opencv_ts243.dll"

            <<"opencv_video243.dll"

            <<"opencv_videostab243.dll";

    const QString base_path="D:\\projects\\opencv243\\opencv\\build\\x86\\vc10\\bin\\";

    for(int i=0;i<libs_name.size();i++){

        QString full_name=base_path+libs_name[i];


        std::wstring str = full_name.toStdWString ();

        HINSTANCE mod=LoadLibrary(str.c_str());


        if (mod==NULL){

            QString msg="can't load module ";

            msg+=full_name+" "+QString::number(GetLastError());

            QFileInfo fi(full_name);

            if (!fi.exists()){

                 msg+=" file not found!";

            }

            qDebug()<<msg;

        }


    

Результат:

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_calib3d243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_contrib243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_features2d243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_gpu243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_legacy243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_nonfree243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_stitching243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_ts243.dll 126"

"can't load module D:\projects\opencv243\opencv\build\x86\vc10\bin\opencv_videostab243.dll 126"

Не может загрузить либы! 0_о

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


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

Ага, чуть лучше. Но надо бы ещё посмотреть на Output и на все твои dll. Проблема может быть в разных манифестах, например. Или зависимостях.

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


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

Depency Walker при использовании его на opencv_highgui.dll и QtCore4.dll ругается на отсутствие IESHIMS.DLL

Хотя по отдельности эти либы работают... 0_о

А Output что под этим подразумевается?

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


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

Depency Walker при использовании его на opencv_highgui.dll и QtCore4.dll ругается на отсутствие IESHIMS.DLL

Хотя по отдельности эти либы работают... 0_о

Ну блин! Тебе действительно так сложно вывести эти зависимости здесь, на форуме (или dll, чтобы самому посмотреть)? Я уже пару дней тебя об этом спрашиваю. Если вопрос не важен, то ладно.

А Output что под этим подразумевается?

Стандартный out приложений. В студии естьодноимённое окошко.

  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
Стандартный out приложений. В студии есть одноимённое окошко.
std::cout не знаю как его отображать в Qt creator

Ну блин! Тебе действительно так сложно вывести эти зависимости здесь, на форуме (или dll, чтобы самому посмотреть)? Я уже пару дней тебя об этом спрашиваю. Если вопрос не важен, то ладно.

Сложно я не знаю как это сделать, но я постараюсь узнать

В общем взял стакан коньяка, а потом Qt 4.8.1 и все завелось. Баг крайне странный ,ну да ладно всем большое спасибо!

  • Like 1

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


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

Qt 5.0.1

OpenCV 2.4.3

сделал для себя через Cmaker библиотеки MinGW и написал небольшу программку

pro:


QT       += core gui


greaterThan(QT_MAJOR_VERSION, 4): QT += widgets


TARGET = firstQt

TEMPLATE = app



SOURCES += main.cpp\

        mainwindow.cpp


HEADERS  += mainwindow.h


FORMS    += mainwindow.ui


INCLUDEPATH  +=C:\\OpenCV243\\pro\\install\\include


LIBS += -LC:\\OpenCV243\\pro\\install\\lib \

 -Llibopencv_contrib243d \

 -Llibopencv_features2d243d \

 -Llibopencv_flann243d \

 -Llibopencv_highgui243d \

 -Llibopencv_objdetect243d \

 -Llibopencv_video243d \

 -Llibopencv_legacy243d \

 -Llibopencv_calib3d243d \

 -Llibopencv_ml243d
Заголовок:
#ifndef MAINWINDOW_H

#define MAINWINDOW_H


#include <QMainWindow>


#include<opencv2/imgproc/imgproc.hpp>

#include<opencv2/core/core.hpp>

#include<opencv2/highgui/highgui.hpp>




namespace Ui {

class MainWindow;

}


class MainWindow : public QMainWindow

{

    Q_OBJECT


public:

    explicit MainWindow(QWidget *parent = 0);

    ~MainWindow();


private:

    Ui::MainWindow *ui;


    cv::VideoCapture camWebcam;


    cv::Mat matOriginal;

    cv::Mat matProcessed;


    QImage gimgOriginal;

    QImage gimgProcessed;


    std::vector<cv::Vec3f> vecCircles;

    std::vector<cv::Vec3f>::iterator itrCircles;


    QTimer* tmrTimer;



public slots:

    void proFrameAndUpdateGUI();


private slots:

    void on_BtnPause_clicked();









};


#endif // MAINWINDOW_H

срр:
#include "mainwindow.h"

#include "ui_mainwindow.h"

#include<QDialog>


MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)

{

    ui->setupUi(this);


    camWebcam.open(0);

    if(camWebcam.isOpened() == false){


        ui->txtCanvas->append("error: camWebcam not accsess succsesfuly");

        return;

    }


    tmrTimer = new QTimer(this);

    connect(tmrTimer, SIGNAL (timeout()), this, SLOT(proFrameAndUpdateGUI()));


    tmrTimer->start(20);



}


MainWindow::~MainWindow()

{

    delete ui;

}


void MainWindow::proFrameAndUpdateGUI(){


    camWebcam.read(matOriginal);

    if (matOriginal.empty() == true) return;


    cv::inRange(matOriginal, cv::Scalar(0,0,175), cv::Scalar(100,100, 256), matProcessed);

    cv::GaussianBlur(matProcessed, matProcessed, cv::Size(9,9), 1.5);

    cv::HoughCircles(matProcessed, vecCircles, CV_HOUGH_GRADIENT, 2, matProcessed.rows / 4, 100, 50, 10,  400);


    for (itrCircles = vecCircles.begin(); itrCircles !=vecCircles.end(); itrCircles++){


        ui->txtCanvas->append(QString("Ball position x=") + QString::number((*itrCircles)[0]).rightJustified(4, ' ') +

                                                            QString(", y=")+QString::number((*itrCircles)[1]).rightJustified(4, ' ')+

                                                            QString(", radius =") + QString::number((*itrCircles)[2], 'f', 3).rightJustified(7, ' '));


        cv::circle(matOriginal, cv::Point((int)(*itrCircles)[0], (int)(*itrCircles)[1]), 3, cv::Scalar(0,255,0), CV_FILLED);

        cv::circle(matOriginal, cvPoint((int)(*itrCircles)[0], (int)(*itrCircles)[1]), (int)(*itrCircles)[2], cv::Scalar(0,0,255), 3);


    }


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


        QImage gimgOriginal((uchar*)matOriginal.data, matOriginal.cols, matOriginal.step, QImage::Format_RGB888);

        QImage gimgProcessed((uchar*)matProcessed.data, matProcessed.cols, matProcessed.step, QImage::Format_Indexed8);



        ui->IplOriginal->setPixmap(QPixmap::fromImage(gimgOriginal));

        ui->IplProcessed->setPixmap(QPixmap::fromImage(gimgProcessed));

}




void MainWindow::on_BtnPause_clicked()

{

    if(tmrTimer->isActive() == true){


        tmrTimer->stop();

        ui->BtnPause->setText("Remuse");

    }

    else

    {

        tmrTimer->start(20);

        ui->BtnPause->setText("pause");


    }

}

В конце получаю очень много ошибок...

из http://floomby.ru/s1/Car4dQ

Подскажите в какую сторону копать...

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


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

Может QTimer.h не хватает?

У QT ведь на все свое Q :)

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


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

Похоже на ошибки линковки.

Наверное что то не то с .lib-ами (или .a).

Либы отладочные, а профиль программы какой?

у меня вот такой вариант завалялся:

QT       += core gui

TARGET = qt-opencv-multithreaded
TEMPLATE = app

VERSION = 1.21

DEFINES += APP_VERSION=$$VERSION

FORMS = ImageProcessingSettingsDialog.ui CameraConnectDialog.ui MainWindow.ui

SOURCES += main.cpp\
MainWindow.cpp \
CaptureThread.cpp \
Controller.cpp \
ImageBuffer.cpp \
CameraConnectDialog.cpp \
ProcessingThread.cpp \
FrameLabel.cpp \
MatToQImage.cpp \
ImageProcessingSettingsDialog.cpp

HEADERS += MainWindow.h \
CaptureThread.h \
Controller.h \
ImageBuffer.h \
CameraConnectDialog.h \
ProcessingThread.h \
FrameLabel.h \
Structures.h \
Config.h \
MatToQImage.h \
ImageProcessingSettingsDialog.h

LIBS += -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
[/code]

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


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

как я формировал либы:

1) скачал cmake

2) запустил, выбрал входную папку c:\openCV243, а выходную создал с именем C:\opencv243\pro

3) Configure указал MinGW Makefiles

4) указал пути компиляторов (в версии Qt 5.0.1 они лежат в папке tools\MinGW\bin) - использовал т.к. для этой версии нужен GCC версии > 4.6 (как я понял в тулсах лежит 4.7.3.2 версия)

5) нажал Finish

6) Установил отметку With_QT и переконфигурировал еще онин раз

7) Указал qmake из папки Qt (у меня он находится C:\Qt\Qt5.0.1\5.0.1\mingw47_32\bin\)

8) переконфигурировал и сгенерировал

9) закрыл Cmake

10) запустил CMD меню

11) перешел в созданную в п.2 папку (cd C:\opencv243\pro)

12) прописал mingw32-make и ожидал конца формирования... (~10 мин)

13) по окончанию прописал mingw32-make install

14) прописал exit

15) поменял PATH на C:\openCV243\pro\install\bin\; C:\Qt\Qt5.0.1\5.0.1\mingw47_32\bin\

16) пробовал написать ПО... и вылезла ошибка приведенная выше... в каком из пуктов ошибся?

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


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

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


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

Спасибо за ответы. Получилось построить проект без ошибок! Теперь другая проблема: При запуске програмы она сразу завершается ошибкой:

Приложение остановлено, так как оно получило сигнал от опрационной системы.

Сигнал: SIGSEGV

Назначение: Segmentation fault

Как с этим бороться?

ЗЫ: отключение антивируса проблему не решает...

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


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

программа валится тут:

void OpenCV::on_btnShowImageFromCam_clicked()

{

    if(camWebcam.isOpened() == false){

    camWebcam.open(0);

    }

    else

    {

    camWebcam.read(matOriginal);

    }

    if (matOriginal.empty() == true)

    {

        return;

    }

    else

    {

    QImage qimgOrigimal((uchar*)matOriginal.data, matOriginal.cols, matOriginal.step, QImage::Format_RGB888);


    ui->IplImageOriginal->setPixmap(QPixmap::fromImage(qimgOrigimal));

    }

}

точнее тут

QImage qimgOrigimal((uchar*)matOriginal.data, matOriginal.cols, matOriginal.step, QImage::Format_RGB888);

ui->IplImageOriginal->setPixmap(QPixmap::fromImage(qimgOrigimal));

написал программку для получения кадра с камеры(самую простую)

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


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

Ты же размеры кадра неправильные передаёшь: ширину в пикселях и ширину в байтах. А высоту?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×