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

hsvcolorchooser.h

gehe zur Dokumentation dieser Datei
00001 #ifndef HSVCOLORCHOOSER_H
00002 #define HSVCOLORCHOOSER_H
00003 
00004 #include <iostream>
00005 #include "output.h"
00006 #include "../image.h"
00007 #include "../opencvext.h"
00008 #include "../recognition/hsvrange.h"
00009 
00010 extern"C"
00011 {
00012   #include <opencv/highgui.h>
00013 }
00014 
00015 using namespace std;
00016 
00017 namespace seemicro
00018 {
00019 
00020 struct HSVColorChooser : public OutputModule
00021 {
00022   HSVRange& range;
00023   static HSVColorChooser *home;
00024   IplImage *img;
00025 
00026   HSVColorChooser(HSVRange& Arange) : range(Arange)
00027   {
00028     home = this;
00029     cvNamedWindow("HSVColorChooser", 1);
00030     img = cvCreateImage(cvSize(200, 220), IPL_DEPTH_8U, 3);
00031     cvCreateTrackbar("H min", "HSVColorChooser", &range.hmin, 360, callback);
00032     cvCreateTrackbar("H max", "HSVColorChooser", &range.hmax, 360, callback);
00033     cvCreateTrackbar("S min", "HSVColorChooser", &range.smin, 255, callback);
00034     cvCreateTrackbar("S max", "HSVColorChooser", &range.smax, 255, callback);
00035     cvCreateTrackbar("V min", "HSVColorChooser", &range.vmin, 255, callback);
00036     cvCreateTrackbar("V max", "HSVColorChooser", &range.vmax, 255, callback);
00037   }
00038 
00039   ~HSVColorChooser()
00040   {
00041     cvReleaseImage(&img);
00042     cvDestroyWindow("HSVColorChooser");
00043   }
00044 
00045   virtual void output(bool keyframe)
00046   {
00047 #ifdef DEBUG
00048     if(DEBUGLEVEL>=3) cerr << "->HSVColorChooser::output()\n";
00049 #endif
00050     if(!keyframe) return;
00051 
00052     if(range.hmin>range.hmax)
00053     {
00054       range.hmin=range.hmax;
00055       cvSetTrackbarPos("H min", "HSVColorChooser", range.hmin);
00056     }
00057     if(range.smin>range.smax)
00058     {
00059       range.smin=range.hmax;
00060       cvSetTrackbarPos("S min", "HSVColorChooser", range.smin);
00061     }
00062     if(range.vmin>range.vmax)
00063     {
00064       range.vmin=range.hmax;
00065       cvSetTrackbarPos("V min", "HSVColorChooser", range.vmin);
00066     }
00067 
00068     int h = (range.hmax+range.hmin)/2;
00069     //cerr << "h: " << h << endl;
00070     for(int x=0; x<200; x++)
00071       for(int y=0; y<200; y++)
00072       {
00073         int s = int(x*255/200);
00074         int v = int(y*255/200);
00075         int c = hsv2rgb(h, s, v);
00076         putPixel8u_3(img, x, y, c);
00077       }
00078 
00079     cvRectangle(img, cvPoint(range.smin*200/255, range.vmin*200/255),
00080                 cvPoint(range.smax*200/255, range.vmax*200/255),
00081                 CV_RGB(255, 255, 255));
00082 
00083     // Hue-Balken
00084     for(int x=0; x<200; x++)
00085     {
00086       int c = hsv2rgb(x*360/255, 255, 255);
00087       cvLine(img, cvPoint(x,200), cvPoint(x, 219), c);
00088     }
00089 
00090     const int nSpecialColors = 22;
00091     int specialColor[nSpecialColors] = {
00092       0x2c3311,
00093       0x2a3519,
00094       0x30391e,
00095       0x374628,
00096       0x3b421e,
00097       0x3d4c0a,
00098       0x434231,
00099       0x43552d,
00100       0x444537, // ziemlich grau...
00101       0x4c4d3f, // ziemlich grau...
00102       0x525a31,
00103       0x555c38,
00104       0x5b5539,
00105       0x606d27,
00106       0x646442,
00107       0x687e41,
00108       0x696a5a, // ziemlich grau...
00109       0x6d7a34,
00110       0x6d6e5e, // ziemlich grau...
00111       0x7c7a47,
00112       0x7d9356,
00113       0xa3b270,
00114       };
00115     for(int i=0;i<nSpecialColors; i++)
00116     {
00117       ushort hs, ss, vs;
00118       rgb2hsv(specialColor[i], &hs, &ss, &vs);
00119 
00120       cvCircle(img, cvPoint(ss*200/255, vs*200/255),
00121         3, CV_RGB(255, 255, 255), CV_FILLED);
00122       int hdiff = hs-h;
00123       if(hdiff>0)
00124         cvLine(img, cvPoint(ss*200/255, vs*200/255),
00125                     cvPoint(ss*200/255, vs*200/255+hdiff*2),
00126                     CV_RGB(255, 255, 255));
00127       else
00128         cvLine(img, cvPoint(ss*200/255, vs*200/255+hdiff*2),
00129                     cvPoint(ss*200/255, vs*200/255),
00130                     CV_RGB(255, 255, 255));
00131       // Kreis in HueBalken
00132       cvCircle(img, cvPoint(hs*200/360, 210),
00133         2, CV_RGB(255, 255, 255), CV_FILLED);
00134     }
00135 
00136     // hmin/hmax in HueBalken einzeichnen
00137     cvLine(img, cvPoint(range.hmin*200/360,200), cvPoint(range.hmin*200/360, 219),
00138       CV_RGB(255, 255, 255), 2);
00139     cvLine(img, cvPoint(range.hmax*200/360,200), cvPoint(range.hmax*200/360, 219),
00140       CV_RGB(255, 255, 255), 2);
00141 
00142     cvShowImage("HSVColorChooser", img);
00143     cvResizeWindow("HSVColorChooser", 200+5, 200+350);
00144   } // output()
00145 
00146   static void callback(int dummy=0)
00147   {
00148     if(!home) return;
00149     home->output(true);
00150     home->range.paramChanged = true;
00151     home->range.outputChanged = true;// könnte range selbst machen
00152   }
00153 
00154 }; // HSVColorChooser
00155 
00156 } // seemicro
00157 
00158 #endif
00159 

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