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
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
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,
00101 0x4c4d3f,
00102 0x525a31,
00103 0x555c38,
00104 0x5b5539,
00105 0x606d27,
00106 0x646442,
00107 0x687e41,
00108 0x696a5a,
00109 0x6d7a34,
00110 0x6d6e5e,
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
00132 cvCircle(img, cvPoint(hs*200/360, 210),
00133 2, CV_RGB(255, 255, 255), CV_FILLED);
00134 }
00135
00136
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 }
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;
00152 }
00153
00154 };
00155
00156 }
00157
00158 #endif
00159