- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 39

Thema: C/C++ Beispielprogramme mit USB Cam und openCV?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast

    C/C++ Beispielprogramme mit USB Cam und openCV?

    hallo
    fühlt sich jemand in der Lage, C/C++ Beispielprogramme mit USB Cam und openCV samt Installationsanleitungen zu schreiben?

    Die Programme sollen in der Lage sein, z.B.

    Farben auf Bällen zu erkennen
    https://www.youtube.com/watch?v=MWK55A0RH0U

    die Farbverteilungen auf einem Rubik's Cube zu erkennen wie hier
    https://www.facebook.com/groups/lego...6070768207818/

    oder Formen auf Schildern zu erkennen wir hier, um daraf zu reagieren:
    https://www.youtube.com/watch?v=fns19y9NOpM

    alles das ist mit Python wohl recht einfach möglich, es wird aber C/C++ Code benötigt, da alle übrigen (Roboter-)Funktionen ebenfalls in C programmiert werden.
    Es geht auch nur um den openCV-Image-Processing-Teil, nicht um die anschließende Reaktion der Machine/des Roboters.

    (ergänzt: ) die libs und API wrapper müssen allerdings funktionieren per einfachem
    #include <zzzz>
    und verlinken mit simplem
    make g++ plus -lxxxx und /oder -Izzzz
    in einer simplen Kommandozeile, ohne makefile und ohne cmake etc. (also kompatibel zur Geany IDE mit compile/build settings)

    Fühlt sich dazu jemand zunächst einmal grundsätzlich in der Lage?
    Über die Umsetzung (bezahlt oder ntl gern als Freeware) kann man dann anschließend reden, und ich helfe ntl jederzeit gerne im Rahmen meiner Anfänger-Kenntnisse mit!)
    Geändert von HaWe (12.03.2017 um 10:07 Uhr)

  2. #2
    shedepe
    Gast
    Hey.
    1. Kamera einlesen:
    (Auch nur von hier geklaut: http://answers.opencv.org/question/1...rom-my-webcam/)
    Code:
    #include "opencv2/opencv.hpp"
    using namespace cv;
    int main(int argc, char** argv)
    {
        VideoCapture cap;
        // open the default camera, use something different from 0 otherwise;
        // Check VideoCapture documentation.
        if(!cap.open(0))
            return 0;
        for(;;)
        {
              Mat frame;
              cap >> frame;
              if( frame.empty() ) break; // end of video stream
              imshow("this is you, smile! :)", frame);
              if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC 
        }
        // the camera will be closed automatically upon exit
        // cap.close();
        return 0;
    }
    Alternativ kann man auch -1 für eine beliebige Kamera angeben bei cap.open oder einen Dateinamen für ein Video.

    2. Bälle. Dort wurde vermutlich eine Hough Circle Transformation angewendet in Kombination mit einem Farbtreshold.
    Hough Circles kann man direkt das Beispiel nehmen: http://docs.opencv.org/2.4/doc/tutor...gh_circle.html
    Um den Circle rauszuschneiden: http://answers.opencv.org/question/1...-hough-circle/
    Treshold kann man die inRange Funktion verwenden: (Auch geklaut von stackoverflow : https://stackoverflow.com/questions/...mage-in-opencv)

    Code:
    cv::Mat image = cv::imread("bird.jpg"); //Oder eben aus der Video capture einlesen
    
    if (image.empty())
    {
        std::cout << "> This image is empty" << std::endl;
        return 1;
    }cv::Mat output;
    cv::inRange(image, cv::Scalar(0, 125, 0), cv::Scalar(255, 200, 255), output);
    cv::imshow("output", output);
    3. Das kann tricky sein. Vorgehen ist in etwa so:
    Houghlines transformation anwenden. Ergibt Array mit gefindenen Linien.
    http://docs.opencv.org/2.4/doc/tutor...ugh_lines.html
    Dann iteriert man durch das Array mit linien durch. Schaut wo sich zwei Linien schneiden und ob sie senkrecht zu einander stehen (Steigung * Steigung = -1). Dann hat man ein Array aus Schnittpunkten. Dort sind die Schnittpunkte die jeweils an nächsten zueinander sind Teile eines Rechtecks.
    Dann schneidet man wie bei 2. Den Rechteck Teil raus und lässt verschiedene inRange Funktionen drüber laufen (Also einmal für Grün, Gelb,Blau usw.). inRange erzeugt ein Binärbild (Also weiß für Pixel unter dem Treshold, Schwarz drüber). Auf diesem Binärbild zählt man alle Schwarzen Pixel und vergleicht sie mit der Gesamtanzahl von Pixeln des Auschnitts. Wenn mehr als 70% Schwarz sind kann man sagen man hat die Farbe gefunden.

    Code:
    int TotalNumberOfPixels = bwImage.rows * bwImage.cols;
    int ZeroPixels = TotalNumberOfPixels - countNonZero(bwImage);
    4. Kann man mit Feature Detection probieren. Aktuelle Ansätze würden vermutlich neuronale Netze tranieren. Aber das ist mehr als dir irgendjemand mal schnell coden wird.

    Für fertige Beispielprogramme reicht bei mir die Zeit nicht aus zum schreiben. Vorallem besteht 80% der Zeit darin Parameter zu optimieren. Und manchmal muss man verschiedene Ansätze durchprobieren.
    Die C++ Api von OpenCv ist aber auch nicht schwerer als die Python API und mindestens genauso gut dokumentiert. Muss man sich halt reinlesen.

    PS. Wenn du ROS verwendest kannst du auch ganz einfach die Bildverarbeitung in Python schreiben und den Rest in C/C++

  3. #3
    HaWe
    Gast
    dankeschön, das sieht ja schon sehr gut aus!

    Eine Frage vorher, bevor ich was falsch installiere:

    - Muss ich für die Cam (eine alte Logicam USB) vorab Treiber installieren (ggf welche) ?

    - nach welcher Installationsanleitung muss ich für openVG vorgehen, inkl welche Zusatzlibs (uv4l ? raspicam ? cv::Mat? oder noch was anders?)
    (Ich hatte schon öfters mal falsche Anleitungen im Web befolgt, und hinterher ging gar nichts mehr....)

  4. #4
    shedepe
    Gast
    Linux oder Windows?

    Linux brauchst du keinen Treiber.
    Ansonsten apt-get install libopencv-dev

  5. #5
    HaWe
    Gast
    hey, nein, schon richtig: für den Pi, also für Linux.

    Habe es so gemacht, USB cam eingestöpselt, und das allererste Programm versucht zu erstellen,

    Code:
    #include "opencv2/opencv.hpp"
    using namespace cv;
    int main(int argc, char** argv)
    {
        VideoCapture cap;
        // open the default camera, use something different from 0 otherwise;
        // Check VideoCapture documentation.
        if(!cap.open(0))
            return 0;
        for(;;)
        {
              Mat frame;
              cap >> frame;
              if( frame.empty() ) break; // end of video stream
              imshow("this is you, smile! :)", frame);
              if( waitKey(10) == 27 ) break; // stop capturing by pressing ESC 
        }
        // the camera will be closed automatically upon exit
        // cap.close();
        return 0;
    }

    per Geany compile/build settings wie hier angegeben, aber tonnenweise errors:
    Code:
    g++ -Wall -pthread -I/opt/vc/include -I/opt/vc/include/interface/vmcs_host/linux -I/opt/vc/include/interface/vcos/pthreads -o "camtest" "camtest.c" -lshapes -L/opt/vc/lib -lOpenVG -lEGL -lwiringPi -lrt -lpigpio -lArduiPi_OLED  (im Verzeichnis: /home/pi/programs/cam)
    
    /tmp/ccQSKrEJ.o: In function `main':
    camtest.c:(.text+0x68): undefined reference to `cv::VideoCapture::VideoCapture()'
    camtest.c:(.text+0x78): undefined reference to `cv::VideoCapture::open(int)'
    camtest.c:(.text+0x110): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
    camtest.c:(.text+0x124): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
    camtest.c:(.text+0x144): undefined reference to `cv::waitKey(int)'
    camtest.c:(.text+0x198): undefined reference to `cv::VideoCapture::~VideoCapture()'
    camtest.c:(.text+0x1dc): undefined reference to `cv::VideoCapture::~VideoCapture()'
    camtest.c:(.text+0x1f0): undefined reference to `cv::VideoCapture::operator>>(cv::Mat&)'
    /tmp/ccQSKrEJ.o: In function `cv::Mat::~Mat()':
    camtest.c:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): undefined reference to `cv::fastFree(void*)'
    /tmp/ccQSKrEJ.o: In function `cv::Mat::release()':
    camtest.c:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x58): undefined reference to `cv::Mat::deallocate()'
    collect2: error: ld returned 1 exit status
    Kompilierung fehlgeschlagen.
    wo soll man jetzt anfangen?
    Sicher fehlen schon mal eine ganze Menge compile/build parameter.
    Aber welche?
    Geändert von HaWe (11.03.2017 um 12:46 Uhr)

  6. #6
    shedepe
    Gast
    Opencv empfiehlt, dass man CMake als Buildsystem verwendet.
    Eine einfache CMakeLists.txt dazu sieht so aus:

    Code:
    cmake_minimum_required(VERSION 2.8)
    project( DisplayImage ) 
    find_package( OpenCV REQUIRED )
    include_directories( ${OpenCV_INCLUDE_DIRS} )
    add_executable( DisplayImage DisplayImage.cpp )
    target_link_libraries( DisplayImage ${OpenCV_LIBS} )
    http://docs.opencv.org/3.1.0/db/df5/...gcc_cmake.html

    Bei Project trägt man den Namen des Projects ein.
    Bei Add Executable trägt man 1. Den Namen der ausführbaren Datei ein die bei rauskommen soll und 2. Alle cpp Files die verwendet werden soll um diese Executable zu bauen.
    Bei TargetLinkLibraries trägt man 1. Den Namen der Executable ein und 2. Alle Libraries gegen die man linken will.
    OpenCV wird automatisch durch
    find_package( OpenCV REQUIRED ) gefunden.

  7. #7
    HaWe
    Gast
    weiß also keiner eine Antwort? scheint doch nicht so einfach lösbar zu sein, und das ist ja nun sogar nur das allersimpelste Beispielprogramm.
    Es war ja auch genau das meine Befürchtung, opencv ist für Neulinge mit C einfach nicht machbar, im Gegensatz zu Python, da läuft es wohl alles wie am Schnürchen.
    Ich denke, es läuft wohl doch auf eine Auftragsarbeit hinaus - wer fühlt sich dazu also überaupt in der Lage?

    Zitat Zitat von HaWe Beitrag anzeigen
    hallo
    fühlt sich jemand in der Lage, C/C++ Beispielprogramme mit USB Cam und openCV samt Installationsanleitungen zu schreiben?

    Die Programme sollen in der Lage sein, z.B.

    Farben auf Bällen zu erkennen
    https://www.youtube.com/watch?v=MWK55A0RH0U

    die Farbverteilungen auf einem Rubik's Cube zu erkennen wie hier
    https://www.facebook.com/groups/lego...6070768207818/

    oder Formen auf Schildern zu erkennen wir hier, um daraf zu reagieren:
    https://www.youtube.com/watch?v=fns19y9NOpM

    alles das ist mit Python wohl recht einfach möglich, es wird aber C/C++ Code benötigt, da alle übrigen (Roboter-)Funktionen ebenfalls in C programmiert werden.
    Es geht auch nur um den openCV-Image-Processing-Teil, nicht um die anschließende Reaktion der Machine/des Roboters.

    (ergänzt: ) die libs und API wrapper müssen allerdings funktionieren per einfachem
    #include <zzzz>
    und verlinken mit simplem
    make g++ plus -lxxxx und /oder -Izzzz
    in einer simplen Kommandozeile, ohne makefile und ohne cmake etc. (also kompatibel zur Geany IDE mit compile/build settings)

    Fühlt sich dazu jemand zunächst einmal grundsätzlich in der Lage?
    Über die Umsetzung (bezahlt oder ntl gern als Freeware) kann man dann anschließend reden, und ich helfe ntl jederzeit gerne im Rahmen meiner Anfänger-Kenntnisse mit!)

    und, wie gesagt, ganz wichtig:
    es muss mit der Geany IDE laufen, denn damit programmiere ich auch die eigentlichen Anwendungsprogramme.

  8. #8
    shedepe
    Gast
    Doch alle Informationen die du benötigst wurden dir servier fertig geliefert. Wenn du jedoch nicht bereit bist dich in die Grundlagen der C/C++ Entwicklung unter Linux einzuarbeiten und gleichzeitig, wie die meisten Anfänger meinen eine für sie optimalere Sonderlösung zu verwenden, kann man dir leider auch nicht helfen.

  9. #9
    HaWe
    Gast
    Zitat Zitat von shedepe Beitrag anzeigen
    Doch alle Informationen die du benötigst wurden dir servier fertig geliefert. Wenn du jedoch nicht bereit bist dich in die Grundlagen der C/C++ Entwicklung unter Linux einzuarbeiten und gleichzeitig, wie die meisten Anfänger meinen eine für sie optimalere Sonderlösung zu verwenden, kann man dir leider auch nicht helfen.
    deine ersten Tipps in Ehren, aber das stimmt nicht:
    es funktioniert nicht mit den von dir "servierfertigen" Parametern!

    g++ -Wall -pthread -o "camtest" "camtest.c" -lwiringPi -lrt -I/usr/include/opencv (im Verzeichnis: /home/pi/programs/cam)
    /tmp/ccfVGq5n.o: In function `main':
    camtest.c:(.text+0x68): undefined reference to `cv::VideoCapture::VideoCapture()'
    camtest.c:(.text+0x78): undefined reference to `cv::VideoCapture::open(int)'
    camtest.c:(.text+0x110): undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
    camtest.c:(.text+0x124): undefined reference to `cv::imshow(std::string const&, cv::_InputArray const&)'
    camtest.c:(.text+0x144): undefined reference to `cv::waitKey(int)'
    camtest.c:(.text+0x198): undefined reference to `cv::VideoCapture::~VideoCapture()'
    camtest.c:(.text+0x1dc): undefined reference to `cv::VideoCapture::~VideoCapture()'
    camtest.c:(.text+0x1f0): undefined reference to `cv::VideoCapture::operator>>(cv::Mat&)'
    /tmp/ccfVGq5n.o: In function `cv::Mat::~Mat()':
    camtest.c:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x3c): undefined reference to `cv::fastFree(void*)'
    /tmp/ccfVGq5n.o: In function `cv::Mat::release()':
    camtest.c:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x58): undefined reference to `cv::Mat::deallocate()'
    Kompilierung fehlgeschlagen.
    collect2: error: ld returned 1 exit status


    und auch
    g++ -Wall -pthread -o "camtest" "camtest.c" -lwiringPi -lrt $(pkg-config --cflags --libs opencv)
    ergibt sogar nur die Fehlermeldung
    g++ error: unrecognized command line option "--l/usr/include/opencv"


    von servierfertig kann also keine Rede sein.


    Aber ich bin ja auch nicht der erste, der es nicht zum Laufen kriegt, und ich verwette mein linkes Bein, dass noch nicht einmal du es schaffst, mit den von dir selber gegebenen Infos selbst das erste simple Basisprogramm zum Laufen zu kriegen: vor allem müsstest du dir dazu auch schon die Mühe machen, es selber mit Geany auf einem Pi mit Jessie auszutesten.
    Es wird aber so nicht gehen, wetten?

    Aber selbst wenn man es mit ein paar (noch offenen) Zusatztricks schaffen sollte, damit ist das Problem ja noch nicht gelöst, denn jetzt fängt es ja erst an: Es geht ja eigentlich um die Farb- und Mustererkennung (wie in den youtube Videos mit Python) , die ich brauche.

    Und daher meine Frage nach einer Auftragarbeit (s.o.).

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    oh ich weis ich sollte es nicht schreiben, aber dennoch:
    Grundlagen der C/C++ Entwicklung
    dazu gehört auch ein wenig gesunder Menschenverstand und die Fähigkeit eine Fehlermeldung zu verstehen. (ich meine damit nicht die Bedeutung der Meldung an sich, sondern den Kontext und was man machen kann um es zu verstehen .. dazu gehört auch das richtige googeln)

    Dein Compiler gibt dir mit der ersten Meldung ausführlich zu verstehen, dass er nicht in der Lage ist die genannten Methoden/Funktionen zu finden. Ich würde jetzt kurzerhand mit grep über die Sources von OpenCV gehen und versuchen raus zu finden wo denn die geforderten Aufrufe zu finden sind und die includes zu ergänzen.

    Der 2te Fehler jedoch vermittelt mir den Eindruck, als ob sich deine Sources garnicht im richtigen Pfad befinden oder dein Geany davon ausgeht dass DU die notwendigen Resourcen in einem Projektspezifischen Ordner zur Verfügung stellst.

    Dir mangelt es an Grundlagenverständnis, welches du dir wohl oder übel anlernen musst, oder du wirst ewig abhängig davon sein, dass andere deine (entschuldige den Begriff, es ist nicht bös gemeint aber beschreibt es am besten) verdrehten Einstellungen/Makefiles deiner Entwicklungsumgebung repariert.

    KORREKTUR: Der 2te Fehler weist auf ein generelles Problem mit dem Makefile hin
    Geändert von Ceos (13.03.2017 um 13:04 Uhr)
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. suche Beispielprogramme für den RP6
    Von enni im Forum Robby RP6
    Antworten: 10
    Letzter Beitrag: 02.01.2009, 17:28
  2. Beispielprogramme? Anfänger
    Von jojo.glaser im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 17.06.2006, 09:11
  3. Beispielprogramme für C
    Von solo im Forum Robby CCRP5
    Antworten: 6
    Letzter Beitrag: 14.02.2005, 18:06
  4. Beispielprogramme zur LPT1 Programmierung
    Von Sokrates87 im Forum C - Programmierung (GCC u.a.)
    Antworten: 4
    Letzter Beitrag: 07.01.2005, 18:57
  5. erklärung der beispielprogramme
    Von xandl33 im Forum Robby CCRP5
    Antworten: 6
    Letzter Beitrag: 03.05.2004, 01:51

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress