Ein c++ Program mit opencv_gpu (cuda) zum laufen bringen



  • Hi!

    ich habe eine etwas sonderbare Begebenheit. Nach langem Ringen habe ich auf meiner OpenSUSE13.2 Qt5, cuda-7.5, ffmpeg-2.6.1, bumblebee3.2.1 mit 352.42 und 352.39 Nvidiatreiber und opencv-2.4.11, teils per repo, teils selbstkompiliert, zum laufen gebracht. Nun bin ich dabei die gpu Anwendungen von OpenCV mittels QtSDK (Qt Creator 3.4.1 Qt 5.4.2) zu kompilieren.
    Ich versuche dazu einfach mal die Verarbeitungsgeschwindigkeiten eines normalen Thresholdalgorithmuses zu vergleichen. Und zwar den File:

    #include <iostream>
    #include <time.h>
    #include "opencv2/core/core.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include "opencv2/opencv.hpp"
    #include "opencv2/gpu/gpu.hpp"
    
    using namespace std;
    
    int main()
    {
        try
        {
            cv::Mat dst_mat;
            cv::Mat src_host = cv::imread("/home/peter/testCuda/testCuda/GothaOrangerie.JPG", CV_LOAD_IMAGE_GRAYSCALE);
            cv::namedWindow("Result",cv::WINDOW_NORMAL);
            cv::imshow("Result", src_host);
            cv::waitKey();
            cv::gpu::GpuMat dst, src;
            src.upload(src_host);
            clock_t t = clock();
            cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
            t = clock() -t;
            cv::Mat result_host(dst);
    
            cout << ((float)t)/CLOCKS_PER_SEC << endl;
            cv::imshow("Result", result_host);
            cv::waitKey();
    
            t = clock();
            cv::threshold(src_host, dst_mat, 128.0, 255.0, CV_THRESH_BINARY);
            t = clock() -t;
            cout << ((float)t)/CLOCKS_PER_SEC << endl;
            cv::imshow("Result", dst_mat);
            cv::waitKey();
        }
        catch(const cv::Exception& ex)
        {
            cout << "Error: " << ex.what() << endl;
        }
        return 0;
    }
    

    An sich nicht die Welt. Ich kann es auch super kompilieren über die Konsole mittels

    g++ main.cpp -o threshold `pkg-config --cflags --libs opencv` -lopencv_gpu -L/usr/local/cuda-7.5/lib64
    

    und das kleine threshold Programm ausführen. Probiere ich den gleichen Schmonz im Qt Creator zu fabrizieren passiert mir das...

    OpenCV Error: No GPU support (The library is compiled without CUDA support) in mallocPitch, file /home/abuild/rpmbuild/BUILD/opencv-2.4.9/modules/dynamicuda/include/opencv2/dynamicuda/dynamicuda.hpp, line 126
    Error: /home/abuild/rpmbuild/BUILD/opencv-2.4.9/modules/dynamicuda/include/opencv2/dynamicuda/dynamicuda.hpp:126: error: (-216) The library is compiled without CUDA support in function mallocPitch
    

    der Witz ist, wenn ich das kleine Programm threshold mittels

    optirun ./threshold
    

    in der Konsole auszuführen möchte, kriege ich haargenau die gleiche Fehlermeldung.

    Hier der .pro File

    #-------------------------------------------------
    #
    # Project created by QtCreator 2015-10-15T04:02:07
    #
    #-------------------------------------------------
    
    TARGET = testCuda
    
    LIBS += -L/usr/lib64/
    LIBS += -L/usr/local/cuda-7.5/lib64 -lopencv_gpu
    LIBS += `pkg-config opencv --cflags --libs`
    
    SOURCES += main.cpp
    

    und der Kompiliercode von Qt fabriziert.

    22:58:12: Running steps for project testCuda...
    22:58:12: Configuration unchanged, skipping qmake step.
    22:58:12: Starting: "/usr/bin/make" 
    g++ -c -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++ -I../testCuda -I/usr/include/QtCore -I/usr/include/QtGui -I/usr/include -I. -I../testCuda -I. -o main.o ../testCuda/main.cpp
    g++ -Wl,-O1 -o testCuda main.o    -L/usr/lib64 -L/usr/lib64/ -L/usr/local/cuda-7.5/lib64 -lopencv_gpu `pkg-config opencv --cflags --libs` -lQtGui -L/usr/lib64 -L/usr/X11R6/lib -lQtCore -lpthread 
    22:58:13: The process "/usr/bin/make" exited normally.
    22:58:13: Elapsed time: 00:01.
    

    Jemand ne Idee wir ich das zum laufen kriege? Will das in Qt Projekte mit einbauen. Aber so wirds nix.

    Grüße!


  • Mod

    Ojeh, ob sich jemand mit all diesen Dingen gleichzeitig auskennt? Ich weiß nicht einmal, in welchem Forum diese Frage am besten aufgehoben wäre. Mit Standard-C++ hat es nichts zu tun, aber in Qt treiben sich vermutlich wenig Leute rum, die sich mit CUDA auskennen, im Grafikforum sicherlich wenige Qt-Leute und ich bin gespannt, ob sich überhaupt irgendjemand im gesamten Forum mit dem Zusammenspiel zwischen OpenCV, CUDA und Qt auskennt.



  • 😃 😃 jetz musste ich irgendwie lachen.
    Grafikforum evtl? Qt is ja nicht schlecht verbreitet und der eine oder andere Progger wird evtl unter Linux mit Qt arbeiten. Da halte ich die Chance für am größten.

    Grüße!


  • Mod

    Ich fürchte gar, diese Frage würde in anderen Foren bessere Chancen haben. Ansonsten können wir ja die Frage die nächsten paar Wochen in den genannten Boards zirkulieren lassen 😃



  • Was haltet ihr von dem Deal, das ich sobald das läuft die Shellscripts die ich dafür erhämmert habe veröffentliche und ihr es ein wenig kreisen lässt?

    Grüße!





  • Falls du das Problem noch nicht gelöst hast:

    Die Fehlermeldung ist eine OpenCV Fehlermeldung, daher hat dein Problem nichts mit Qt oder CUDA-Programmierung zu tun.

    OpenCV meckert, dass deine Graka nicht unterstützt wird. Das ist laut Doku das Standardverhalten für die Bibliothek, falls diese ohne CUDA Unterstützung kompiliert wurde. (steht ja in der Fehlermeldung sogar 😉 )

    To enable CUDA support, configure OpenCV using CMake with WITH_CUDA=ON . When the flag is set and if CUDA is installed, the full-featured OpenCV GPU module is built. Otherwise, the module is still built but at runtime all functions from the module throw Exception with CV_GpuNotSupported error code, except for gpu::getCudaEnabledDeviceCount(). The latter function returns zero GPU count in this case.

    Du solltest versuchen, OpenCV wie beschrieben mit CUDA Unterstützung zu kompilieren.



  • @Plywoodpirate

    Habe ich. Genau das ist das Problem.

    Grüße



  • Habe ich das richtig verstanden? Manuell über die Kommandozeile läufts und
    mit dem im Qt Creator-Projekt nicht? Eine Sache, die mir spontan auffällt:

    Kommandozeile:

    g++ main.cpp -o threshold `pkg-config --cflags --libs opencv` -lopencv_gpu -L/usr/local/cuda-7.5/lib64
    

    QMake:

    g++ -Wl,-O1 -o testCuda main.o    -L/usr/lib64 -L/usr/lib64/ -L/usr/local/cuda-7.5/lib64 -lopencv_gpu `pkg-config opencv --cflags --libs` -lQtGui -L/usr/lib64 -L/usr/X11R6/lib -lQtCore -lpthread
    

    Die Reihenfolge von -lopencv (aka. `pkg-config --cflags --libs opencv`) und -lopencv_gpu ist vertauscht. Möglicherweise werden dadurch Symbole aus opencv_gpu
    nicht durch den Linker einbezogen und die opencv-lib denkt daher, dass keine GPU-Unterstützung einkompiliert ist (Reihenfolge beim Linken wichtig, lohnt sich,
    mal zu recherchieren wie der Linker Symbole auflöst).

    Vielleicht versuchst du mal die beiden betreffenden Zeilen in der .pro-Datei zu vertauschen, mit etwas Glück war es das bereits, also:

    LIBS += `pkg-config opencv --cflags --libs`
    LIBS += -L/usr/local/cuda-7.5/lib64 -lopencv_gpu
    

    Gruss,
    Finnegan



  • So das Problem ist mittlerweile veraltet und durch einen Haufen anderen Müll ersetzt worden der mir tierisch auf den Zeiger ging was ich aber großteils beseitigen konnte. Wenn jemand Gelegenheit hätte es zu testen wäre ich mordsmäßig happy. Bei mir läuft es jetz.
    [url]
    http://stackoverflow.com/questions/32806247/compile-opencv3-with-cuda7-5-ffmpeg-latest-issue-opensuse-13-2/33381578#33381578[/url]

    Sry für mein grauenhaftes Englisch. Hat mich mal wieder die halbe Nacht gekostet. Gehe zufrieden schlafen.

    Grüße!


Log in to reply