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
00073
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
00084 cvConvertImage(src.img, eingezeichnet);
00085 cvScale(eingezeichnet, eingezeichnet, 0.5);
00086
00087
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
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
00101
00102
00103 cvCircle(eingezeichnet, p.mitte, 4, CV_RGB(200,255,255));
00104
00105
00106
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
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
00118 CV_RGB(0, 0, 0));
00119 }
00120
00121
00122
00123
00124
00125
00126
00127 if(sa.searchStatus==0)
00128 cvLine(eingezeichnet, sa.p1+p.mitte,
00129
00130 sa.p2+p.mitte, CV_RGB(128, 128, 0));
00131 }
00132 if(!p.mitteValid || drawHoughLines)
00133 {
00134
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);
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 };
00163
00164 }
00165
00166 #endif
00167