Anzeige:
Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 31 bis 45 von 53

Thema: QT + installieren von Qextserialport.tar.gz

  1. #31
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Wenn opencv auf dem Fokus kommt, meinst du damit, dass er einfach mit der Bearbeitung der Bilder nicht mehr hinterher kommt?

    Ich habe jetzt auch nicht wirklich eine Idee. Bin selbst ganz neu in opencv & openmp und muss mich jetzt erstmal um mein Cluster kümmern.

  2. #32
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi kater
    ja ganz recht
    normalerweise ist die webcam-ausgabe sehr fluessig
    wenn die comControl arbeitet, stocken die bilder und der algo arbeitet nicht mehr
    richtig.
    wegen opencv + openmp
    hab im netz einkleines prog gefunden
    welches opencv fuer die webcams benutzt und openmp als multitasking.

    ich hab gestern und heute etliche sachen mit openmp und cv versucht
    ist recht komplex opencv zum mitmachen zu ueberreden
    die meisten fehlermeldung waren: entweder seqfaults oder bad-frames
    webcam nicht erkannt und programm abbruch.
    es ist also gar nicht so einfach
    vielen dank fuer deine hilfe (auch beim openmpi)
    gruss nomad

    ps. achtung wenn ich 2 webcams benutze -> ProgAbbruch
    Code:
    /* 
    dd. 19.07.2009
    name: ompCVtest.cpp
    compile:
    g++ -I/usr/local/include/opencv -L /usr/local/lib -lcxcore -lcv -lhighgui -lcvaux -lml -o ompCVtest ompCVtest.cpp -lm -fopenmp
    
    run: ./ompCVTest
    Hi all,
    I am currently using openmp in the computer vision. What I want to do is grab
    images from to cameras. By using the parallel structure, I firstly generate two threads
    using the omp sections. 
    The each stream from these cameras is proposed to grabbed and displayed in a corresponding thread. 
    I am using the opencv to grab and display images. 
    Once I use the series structure, i.e. images from two cameras are grabbed one by one, 
    there is no problem. 
    However, if I use the parallel structure, 
    I can see that two threads do work, but I can only display one image.
    I am not quite sure about the problem. I need your help in this issue or any other suggestion.
    
    I am using Xeon 2Cpu workstation with winxp system and intel cpp compiler 9.0 installed. The opencv is v4beta. The c file is shown as follows:
    */
    
    
    #include <omp.h>
    
    #include<iostream>
    
    // openCV
    #include<cv.h>
    #include<cvaux.h>
    #include<highgui.h>
    
    // c
    #include <math.h>
    
    // C-Stuff for RS232
    #include <stdio.h>
    #include <stdlib.h>
    
    #include <fcntl.h> 
    #include <string.h> 
    #include <ctype.h> 
    
    #include <setjmp.h> 
    #include <termios.h> 
    #include <unistd.h> 
    #include <sys/signal.h> 
    #include <sys/types.h> 
    #include <errno.h> 
    
    #include <ctype.h>
    #include <sys/io.h> 
    // glui
    #include <sys/stat.h>
    #include <stdarg.h>
    #include <assert.h>
    #include <float.h>
    #include <limits.h>
    #include <time.h>
    
    #include <sstream>
     
    using namespace std;
    /*** special Func (1) conio.h ******************************************************************/
    void gotoxy(int x, int y) { printf("\033[%d;%dH", y, x); fflush(stdout); }
    void clrscr(void)         { printf("\033[H\033[J");      fflush(stdout); }
    
    // delay (nnn)
    
    void delay(long millisek)
    {
       int mikrosek = millisek*1000;
       struct timeval  timeout;
       
       timeout.tv_sec  = mikrosek / 1000000L;
       timeout.tv_usec = mikrosek % 1000000L;
       select(0, NULL, NULL, NULL, &timeout);
    }
    /***********************************************************************************************/
    
    int main()
      {
         IplImage *image1;//, *image2;
         CvCapture *capture1;//, *capture2;
    
         clock_t t1, t2;
    
         int nframe1, nframe2, tid, nthreads;
    
         capture1=cvCaptureFromCAM(0);
       //  capture2=cvCaptureFromCAM(-1);
    
         cvNamedWindow("camera1", 1);
         //cvNamedWindow("camera2", 1);
    
         cvResizeWindow("camera1", 320, 240);
         //cvResizeWindow("camera2", 320, 240);
    
         omp_set_num_threads(4);
    
         nframe1=0;
         nframe2=0;
    
         for (;;)
            {
               t1=clock();
               
               #pragma omp parallel private(tid)
                  {
                     tid = omp_get_thread_num();
                  
                     if(tid == 0)
                        {
                           nthreads=omp_get_num_threads();
                           printf("Number of threads = %d\n ", nthreads);
                        }
                     
                     printf("Thread %d starting.... \n", tid);
                   
                     #pragma omp sections
                        {
                           #pragma omp section
                              {
                                 printf("Thread %d grabbing from camera 1 \n", tid);
                                 
                                 image1=cvQueryFrame(capture1);
                                 cvShowImage("camera1", image1);
                             
                                 printf("This is the No %d frame from camera1 \n", nframe1);
                           
                                 nframe1++;
    
                              }
                          
                            
                           #pragma omp section
                              {
                                 printf("Thread %d ComControl\n", tid);
                                // image2=cvQueryFrame(capture2);
                                // cvShowImage("camera2", image2);
                                 
                                 printf("Delay COM\n");
                                 delay(500);
                                     
                                 printf("This is the No %d frame from camera2 \n", nframe2);
                                 nframe2++;
                              }
                        }
                     
                  }
               
               t2=clock();
               
               printf("Time is %f \n", (double)(t2-t1)/CLOCKS_PER_SEC);
               
               if (cvWaitKey(10)>=0)
                  break;
            }
         
         cvReleaseCapture(&capture1);
         //cvReleaseCapture(&capture2);
         cvDestroyAllWindows();
    
      }

  3. #33
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Ich wuerde in diesem Beispiel einfach stink normale Threads nehmen. OpenMP macht da mehr als es soll und das auch nicht wie du willst.

    Es gibt std::thread oder von boost und opencv hat auch Threads wenn ich mich recht erinnere.

    Weil, du hast ja zwei verschiedenen Aufgaben, Bilder holen und CamControl. Da gibt es nicht zu parallelisieren im Sinne von schneller machen.

  4. #34
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi kater
    hast ja eigentlich recht,
    es geht mir ja nicht ums schneller sein,
    sondern es waer schoen wenn,
    Master 1 core
    sub 1 core == opencv (unterbrechungs-frei)
    sub 2 core == comController

    hab schon das buch "programming with posix-threads" draussen.
    mal gucken was passiert
    ps: falls du tips fuers opencv brauchst, ich steh gern zur verfuegung..
    gurss nomad

  5. #35
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Du kannst erstmal überhaupt nicht festlegen welcher Kern welche Aufgabe machen soll. Und unterbrechungsfrei gibt es in einem Multithreadsystem auch nicht.
    Ich verstehe überhaupt nicht wo das Problem ist. Der ComController kann überhaupt nicht so viel Ressourcen brauchen, dass eine opencv ins Stocken geht. Außer du machst irgendwas total falsch. Die paar KB die zum mC gehen sind schnell abgearbeitet.

    Packe einfach opencv oder den Controller in seine eigene Thread Funktion. Und wenn du keine Endlosschleifen rein gebaut hast irgendwo, dann geht das auch.

    Ich würde jetzt erstmal die Thread Funktionen von opencv versuchen. Posix Threads waren mir immer etwas kryptisch.

  6. #36
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi kater
    also com verbraucht schon etliche zeit.
    hier eine messung von gestern.
    3) - after grabing into LK-Algo
    - LK = took 0.010723 seconds.
    - COM = took 0.519834 seconds.

    das bloede daran ist (das ist auch der zeit verbrauch)
    com wartet auf ein acknowledge vom microcontroller.
    sonst kann es sein, dass z.b. linux schon wieder daten sendet, ohne das der controller
    bereit ist. und wenn du 5 hochleistungs-servos (247 newton-cm) betreibst, dann kommst du
    in teufels kueche.(z.b. dass das system die beiden webcams zerlegt.)

    heute war (ist) ein frustrieender tag. frueh tests mit opencv (1 webcam) ein delay() und
    openmp.
    das gemeine ist dass opencv sehr mimosenhaft auf gueltige openmp pragmas
    reagiert: SeqFaults und CoreDumps :-o

    bei tests mit dem echten system, habe ich festgestellt, dass trotz oder deswegen
    mit openmp ein bessers verhalten (weniger -> lostFocus) erzielt wird

    jetzt guck ich mal was mit opencv und opencv-Threads moeglich ist.
    gruss nomad

  7. #37
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Deswegen sagte ich doch, leg den COMController in sein eigenen Thread. Dann kann er soviel Zeit verbrauchen wie er will.
    Ich schau mir opencv Threads auch gleich mal an.

  8. #38
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi kater
    betr. opencv und opencv-threads:
    aus dem netz:
    still have to figure out:
    which openCV functions are pthread-safe?!

    By pthread-safe I mean that
    (1) opencv functions can be called by different threads on different
    data with no unexpected result, with no need of mutex protection. This
    imply opencv functions are fully reentrant (using only stack variables)
    (2) opencv functions can be called by different threads on the same
    data provided the ordinary use of pthread_mutex_lock()/trylock()/unlock
    ()/etc.
    A specific example: what to do if I wanna call cvGetTickCount() by
    different threads? Do I have to use mutexes??!! (that would spoil the
    measure)
    also laeuft s doch meines erachtens auf pthread raus.
    was ich so gefunden hab: ist spaerlich
    ein japaner oder chinese hat ein program ins netz gestellt.
    jesses
    (also: opencv,opengl + object-lader + pthreads) konnte es mit fehlern compilieren
    aber zu komplex.....

    ich haett eine bitte:
    also wie schon gesagt
    1 thread opencv
    1 thread com-stuff
    waerst du so nett
    mir an hand des untenstehenden pseudo-codes mal einige hinweise ueber die
    verwendung und die plazierung der threads geben.
    waer froh darum, damit ich weiss wie ichs machen soll
    Gruss nomad

    Code:
    main()
    {
       initialisierungen()
       
       capture = cvCaptureFromCAM( 0 );
       if( !capture ) 
            {
               printf( "Cannot open initialize WebCam!\n" );
               return 1;
            }
       cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, x );
       cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, y );
       cvNamedWindow( "CamHeadSystem", CV_WINDOW_AUTOSIZE ); 
       cvMoveWindow( "CamHeadSystem", 10, 10 );
         
       cvSetMouseCallback( "CamHeadSystem", on_mouse, (void*)image );
     
       while(!Done)
       { 
          frame = cvQueryFrame( capture ).;
    
          lucasKanade()
          {
             -> // in der functions
                 // get a frame
                frame = cvQueryFrame( capture ):
                
                set-MausPoints
                   -> algorithmus
                   for_loop 
                   {
                       -> output: plmx,plmy (1 lucasKanadePunkt (Nase)
                   } 
          }
         
         // hier ist der comStuff   
         comControl()
          {
             input: plmx,plmy
                 calcPoints : convert x,y into drehwinkelX, drehwinkelY
                 convert drehwinkel into servoPulses
                 convert int to String
                 -> output: servoPulse1, servoPulse2 as string
                 
             Call: comSendData()
          }
             
          comSendData()
          {   
             forLoop 2x
             {   
                Sender() // sendDatas to microController
                Reader() // wait on <5> acknowledge
             }
          }   
             
       }
    }

  9. #39
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Du bist lustig Ich habe selbst noch nie mit opencv Thread gearbeitet. Denke aber, dass ich mein Programm heute fertig bekomme. Code gibts sobald es funktioniert.

  10. #40
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi

    danke,
    bin gespannt auf dein programm.
    viel glueck
    gruss
    nomad

  11. #41
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Nun, eben erst jetzt funktioniert es OHNE Threads.
    http://130.83.141.57/temp/drehdich.avi
    Wieder nur für Leute mit mpeg4 Skills.

    Es ist zwar ein FPS Counter eingebaut, aber man sieht ihn nicht im Video. Weiß ich jetzt auch nicht warum. Videos unter opengl aufzunehmen ist ja sowas von eklig. Habe das jetzt ganz dumm Bild für Bild abgespeichert, konvertiert und ein Video daraus gemacht.

    Jedenfalls bekomme ich 15fps, mehr macht die Kamera nicht. Jetzt ist es dunkler, da sind es nur noch 10fps und das sieht man auch deutlich im Bild wie langsam es reagiert.

    Wenn ich jetzt noch die Threads einbaue sollte sich das erledigt haben.
    Ich brauche dann drei Threads. Einer der die Bilder rendert. Einer der die lahme Kamera einliest und einer für den mC. Na, das dauert noch eine weile.

  12. #42
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34

    save a opengl Image with opencv

    Ok, ich hab hier mal eine Funktion geschrieben mit der man opengl Bilder mit opencv speichern kann. Generell kann man auch alles andere außer opencv nehmen, aber es bietet sich hier gerade an.

    Es ist bestimmt nicht die feine Art Pointer zu verbiegen, aber in der BV kann man es sich nicht leisten unnötig Daten zu kopieren.

    Code:
    int saveImage()
    {
      // buffer for the opengl image
      unsigned char *image;
    
      //Allocate our buffer for the image 
      if ((image = (unsigned char*)malloc(3* windowswidth * windowsheight * sizeof(char))) == NULL)
      {
        cerr << "Failed to allocate memory for image\n";
        return -1;
      }
      
      char fname[32];
      static int counter = 0;
      
      // create a filename
      snprintf(fname, sizeof(fname), "jpg/%05d.jpg", counter);
          
      // Copy the image into our buffer 
      glReadBuffer(GL_BACK_LEFT);
      glReadPixels(0,0,windowswidth, windowsheight,GL_RGB,GL_UNSIGNED_BYTE,image);
    
      // create a new opencv image
      // windowswidth & windowsheight ist that what you write
      // by glutInitWindowSize (windowswidth, windowsheight);
      IplImage *cvimage = cvCreateImageHeader(cvSize(windowswidth, windowsheight), IPL_DEPTH_8U, 3);
    
      // Ugly Stuff
      cvimage->imageData = (char*)image;
    
      // flip it vertically
      cvConvertImage(cvimage, cvimage, CV_CVTIMG_FLIP);
    
      // save it
      cvSaveImage(fname , cvimage);
      
      counter++;
      free(image);
    
      return 0;
    }

  13. #43
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi
    dein wort in gottes ohr.....
    vielen dank fuer deine ersten hinweise.

    eins versteh ich nicht ganz.
    warum benutzt du opengl in diesem fall.
    nur zur anzeige der bilder?
    warum machst du den umweg ueber copy und avi-file
    ich weiss opengl ist in diesem fall ekelig
    gruende sind unteranderem:
    - opengl hat einen eigenen glutMainLoop
    - opencv nicht muss mit einem whileLoop gemacht werden
    - opengl hat andere ansichten ueber ein bild
    (RGB (gl)) (RBG (cv))
    - und sowie so

    ich hab rausgefunden dass sich opencv & opengl
    sich schon vertragen, aber niemals wenn noch
    ein microcontroller dabei ist.
    hab's vor tagen ausprobiert.

    als attachmend:
    1) cvLkDemo1-cpp.txt
    ein kleines demoProg
    openCV + lucasKanade Algo
    filename: cvLkDemo1.cpp
    steht auch da, wie man compilieren kann
    um die lkPoints zu erzeugen mit der mouse
    aufs bild klicken

    2) cvgl_3dDemo1.cpp
    opencv + opengl
    - opencv fuer die webcam
    - opengl anzeige der bilder mit hilfe von
    glTexturen

    hoffentlich hilfts dir
    gruss
    nomad
    Geändert von nomad (21-07-2009 um 10:05 Uhr)

  14. #44
    Registrierter Benutzer
    Registriert seit
    31.12.2008
    Beiträge
    34
    Opengl... hast du das Video nicht gesehen? Damit ich diesen 3d Effekt beim drehen habe. Ich hab einfach dein cv3d Programm genommen, alles unnötige rausgeworfen und opencv + mC eingebaut. Also bei mir funktioniert das wunderbar.

    Threads gehen auch, man braucht aber den gcc-4.4 dazu, sonst kennt er std::thread nicht. Bin gerade auf der Arbeit, spätestens heute Abend sollte ich auch alle in Threads geleget haben.

    WIso den Umweg über copy und avi File? Na wie soll ich den Leuten denn sonst zeigen was das Progrmam tut (man sieht nicht viel ich weiss). Es will sich ja nicht jeder das Programm erst compilieren. Wenn du eine gute Idee hast, wie man unter opengl Videos macht, nur her damit. Der AVI Writer von opencv funktioniert ja nicht unter Linux.

  15. #45
    Registrierter Benutzer
    Registriert seit
    19.09.2000
    Ort
    ch-8408 winterthur
    Beiträge
    150
    hi
    entschuldige das wegen dem missverstaendis cv3d.cpp
    dass wusste ich nicht. dass du den stuff verwendest.
    meinst du mit +mc einen microcontroller?
    wenn ja,
    - welchen typ: ich benutzt ein Propeller Professional Development Board von Parallax 32-bit
    mit 8 cores (cogs).
    - hast du den schon programmiert, also rs232-schnittstelle und servo-ansteuerung?
    - mein rs-232-stuff beruht auf der verwendung dieses boards.
    bei einem anderen mc sieht das vermutlich ganz anders aus.

    dein avi-film: habs schon mit winXP & mediaPlayer versucht -> geht nicht
    versuche unter suse 10.3. ->cinebench -> eine download kostet $ 28.--
    es ist auch ein problem da ich die 64-bit version benuetz.
    das mit dem avi-writer stimmt...... auch im opencv forum klagen die leute darueber.

    PS: mir machts nichts aus dein programm zu compilieren.

    zu den threads:
    (1)
    Threads gehen auch, man braucht aber den gcc-4.4 dazu, sonst kennt er std::thread nicht.
    -> gcc 4.4 ---> hab einen 4.2.1,
    und moechte nicht unbedingt auf 4.4. updaten... compatibilaet
    geht das auch nicht mit "c" ?

    (2)
    hab heute vormittag weitere versuche mit openmp angestellt
    ist bisschen heiss, muss dann mit 2 rechnern arbeiten
    1x linux 1x winXP fuer den microcontroller + das mc-board
    da kann recht viel schief gehen.
    nach einigen tests hab ich deutliche verbesserung (subjektiv) im ansprech-verhalten
    der webcam gehabt.
    openmp ist wirklich black magic
    ich musste die pragmas stufenweise einsetzen.
    als von pragma (while)
    pragma ausserhalb (funktion 1)
    innerhalb (function 1)
    pragma ausserhalb (funktion 2)
    innerhalb (funktion 2)
    recht kompliziert und unuebersichtlich
    dafuer ruckelt die webcam nicht mehr so stark.
    ich guck mal weiter.
    als attachment : ompCamHeadSystem045-cpp.txt
    da kannst du dir mal einen ueberblick verschaffen.
    vielen dank noch fuer deine arbeiten
    gruss nomad

Lesezeichen

Berechtigungen

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