Hauptseite | Liste aller Namensbereiche | Klassenhierarchie | Alphabetische Liste | Übersicht | Auflistung der Dateien | Elemente eines Namensbereiches | Datenstruktur-Elemente | Datei-Elemente

einzeichnen.h

gehe zur Dokumentation dieser Datei
00001 #ifndef EINZEICHNEN_H
00002 #define EINZEICHNEN_H
00003 
00004 #include <iostream>
00005 #include "output.h"
00006 #include "../micro.h"
00007 #include "../microadam.h"
00008 #include "../recognition/imagesource.h"
00009 #include "../recognition/searchanglesadam.h"
00010 #include "../polarline.h"
00011 extern "C"
00012 {
00013   #include <opencv/highgui.h>
00014 }
00015 
00016 using namespace std;
00017 
00018 namespace seemicro
00019 {
00020 
00025 class EinzeichnenOutput : public OutputModule
00026 {
00027   ImageSource& src;
00028   SearchAnglesAdam& sa;
00029   Micro& m;
00030   MicroAdam *adam;
00031   CvFont *font;
00032   static EinzeichnenOutput *home;
00033   IplImage *eingezeichnet;
00034   int drawHoughLines;
00035 
00036 public:
00037   EinzeichnenOutput(ImageSource& As, SearchAnglesAdam& Asa, CvFont *Af) :
00038     src(As), sa(Asa), m(sa.adam), font(Af)
00039   {
00040     home = this;
00041     adam = dynamic_cast<MicroAdam*>(&m);
00042     drawHoughLines = 0;
00043     if(1 != cvNamedWindow("SearchAnglesAdam", 1))
00044     { cerr << "cvNamedWindow(SearchAnglesAdam): error" << endl; }
00045 
00046 if(DEBUGLEVEL>=2) cerr << "EO:TBs\n";
00047     cvCreateTrackbar("Hough: Distance Resolution", "SearchAnglesAdam", &sa.distres, 400,
00048       callback);
00049     cvCreateTrackbar("Hough: Angle Resolution", "SearchAnglesAdam", &sa.angres, 360,
00050       callback);
00051     cvCreateTrackbar("Hough-Schwellwert", "SearchAnglesAdam", &sa.hough_threshold, 250,
00052       callback);
00053     cvCreateTrackbar("Hough: Max Gap", "SearchAnglesAdam", &sa.houghMaxGap, 200,
00054       callback);
00055     cvCreateTrackbar("Draw Hough Lines?", "SearchAnglesAdam", &drawHoughLines, 1,
00056       callback);
00057 if(DEBUGLEVEL>=2) cerr << "EinzeichnenOutput:Trackbars created\n";
00058 
00059     eingezeichnet = cvCreateImage(cvSize(src.img->width,src.img->height),
00060        IPL_DEPTH_8U, 3);
00061 
00062   };
00063 
00064   ~EinzeichnenOutput()
00065   {
00066     cvReleaseImage(&eingezeichnet);
00067     cvDestroyWindow("SearchAnglesAdam");
00068   }
00069 
00070   void output(bool keyframe)
00071   {
00072     // trackbarvariablen müssen von hand gesetzt
00073     // werden, da SetTrackbarPos die Callbackfunktion nicht aufruft
00074     einzeichnen(m);
00075   }
00076 
00077   void einzeichnen(Micro& p)
00078   {
00079 #ifdef DEBUG
00080     if(DEBUGLEVEL>=3) cerr << "->einzeichnen\n";
00081 #endif
00082 
00083     // gray2rgb
00084     cvConvertImage(src.img, eingezeichnet);// takes ~10000 usecs
00085     cvScale(eingezeichnet, eingezeichnet, 0.5);// takes ~4000 usecs
00086     
00087     // Invertieren
00088     cvConvertScale(eingezeichnet, eingezeichnet, -1, 255);
00089 
00090     if(p.mitteValid)
00091     {
00092       p.draw(eingezeichnet, false, double(CV_RGB(230, 70, 70)), false);
00093       // arme_auch?
00094 
00095       cvRectangle(eingezeichnet,
00096           cvPoint(int(p.mitte.p.x-p.radius),
00097             int(p.mitte.p.y-p.radius)),
00098           cvPoint(int(p.mitte.p.x+p.radius),
00099             int(p.mitte.p.y+p.radius)), 255);
00100       //    cout << "Mitte: " << p.mitte
00101       //      << " value: " << adam->correlationStrength << "\r";
00102 
00103       cvCircle(eingezeichnet, p.mitte, 4, CV_RGB(200,255,255));
00104 //      polarLine mline2 = adam->mline;
00105 //      mline2.r-=adam->dr2;
00106 //      mline2.draw(eingezeichnet, CV_RGB(0, 255, 0));
00107 
00108       char line[50];
00109       sprintf(line, "alpha= %2.0f", p.alpha*180/M_PI);
00110       cvPutText(eingezeichnet, line, cvPoint(src.img->width-100, 30), font,
00111             CV_RGB(0, 0, 0));
00112 //          CV_RGB(255, 255, 255));
00113       if(adam)
00114       {
00115         sprintf(line, "beta= %2.0f", adam->beta*180/M_PI);
00116         cvPutText(eingezeichnet, line, cvPoint(src.img->width-100, 60), font,
00117 //          CV_RGB(255, 255, 255));
00118             CV_RGB(0, 0, 0));
00119       }
00120 
00121       // falls mitte nicht stimmt (z.b. lange keine
00122       // korrelation durchgeführt), wird folgende
00123       // gelbe linie an falscher stelle eingezeichnet
00124 
00125       // searchStatus: 0 = OK, -1 = weniger als 2 Geraden gefunden,
00126       //    -2 = keine passenden Geraden im Bild
00127       if(sa.searchStatus==0)
00128         cvLine(eingezeichnet, sa.p1+p.mitte,
00129 //        sa.p2+p.mitte, CV_RGB(255, 255, 0));// gelb
00130           sa.p2+p.mitte, CV_RGB(128, 128, 0));// dunkleres gelb
00131     }
00132     if(!p.mitteValid || drawHoughLines)
00133     {
00134       // von hough transform erkannte linien einzeichnen
00135       if(sa.lines) for(int i = 0; i < sa.lines->total; i++)
00136       {
00137         CvPoint* line = (CvPoint*)cvGetSeqElem(sa.lines, i);
00138         cvLine(eingezeichnet, line[0], line[1], CV_RGB(255, 0, 255), 1);
00139       }
00140     }
00141 
00142     mypoint bildmitte = mypoint(src.img->width, src.img->height);
00143     cvCircle(eingezeichnet, bildmitte, 4, CV_RGB(200,255,255));
00144     cvShowImage("SearchAnglesAdam", eingezeichnet);//10000 usecs?
00145     cvResizeWindow("SearchAnglesAdam", src.img->width+15, src.img->height+280);
00146 #ifdef DEBUG
00147     if(DEBUGLEVEL>=3) cerr << "<-einzeichnen\n";
00148 #endif
00149   }
00150 
00151   void parametrize(void)
00152   {
00153     sa.paramChanged = true;
00154   }
00155 
00156   static void callback(int dummy=0)
00157   {
00158     if(!home) return;
00159     home->parametrize();
00160   }
00161 
00162 }; // EinzeichnenOutput
00163 
00164 } // seemicro
00165 
00166 #endif
00167 

Erzeugt am Sun Oct 3 12:52:47 2004 für seemicro von doxygen 1.3.2