11#include " cinder/app/App.h"
22#include " cinder/app/RendererGl.h"
33#include " cinder/gl/gl.h"
4- #include " cinder/params/Params.h"
54#include " cinder/ip/Threshold.h"
65#include " cinder/ip/Grayscale.h"
6+ #include " cinder/Log.h"
7+ #include " cinder/CinderImGui.h"
8+
9+ #include < algorithm>
710
811using namespace std ;
912using namespace ci ;
@@ -14,41 +17,35 @@ class ThresholdTestApp : public App {
1417 void setup () override ;
1518 void update () override ;
1619 void draw () override ;
20+ void keyDown ( KeyEvent event ) override ;
1721
1822 private:
1923 void loadFile ( const fs::path &path );
24+ void drawGui ();
2025
2126 bool mUseAdaptiveThreshold = false ;
2227 bool mUseAdaptivePercentage = false ;
2328 bool mShowOriginalGrayScale = false ;
2429 bool mUseClassVersion = true ;
2530 int mThresholdValue , mAdaptiveThresholdKernel ;
2631 float mAdaptiveThresholdPercentage ;
27- params::InterfaceGlRef mParams ;
2832 gl::TextureRef mTexture ;
2933 Surface8uRef mSurface ;
3034 Channel8u mGraySurface , mThresholded ;
35+ bool mShowGui = true ;
36+ bool mRequestOpenDialog = false ;
3137
3238 ip::AdaptiveThreshold mThresholdClass ;
3339};
3440
3541void ThresholdTestApp::setup ()
3642{
37- mParams = params::InterfaceGl::create ( " Parameters" , ivec2 ( 300 , 240 ) );
38- mParams ->addParam ( " Threshold" , &mThresholdValue , " min=0 max=255 keyIncr=v keyDecr=V" );
39- mParams ->addButton ( " open file" , [this ] { loadFile ( getOpenFilePath () ); }, " key=o" );
40- mParams ->addSeparator ();
41- mParams ->addParam ( " Use Adapative" , &mUseAdaptiveThreshold );
42- mParams ->addParam ( " Use Adapative class" , &mUseClassVersion );
43- mParams ->addParam ( " Use Adapative percentage" , &mUseAdaptivePercentage );
44- mParams ->addParam ( " Show Grayscale" , &mShowOriginalGrayScale );
45- mParams ->addParam ( " Adaptive Kernel" , &mAdaptiveThresholdKernel , " min=0 max=1000 keyIncr=k keyDecr=K" );
46- mParams ->addParam ( " Adaptive Percentage" , &mAdaptiveThresholdPercentage , " min=0 max=1.0 step=0.01 keyIncr=p keyDecr=P" );
47-
43+ ImGui::Initialize ();
44+
4845 mThresholdValue = 128 ;
4946 mAdaptiveThresholdPercentage = 0 .01f ;
5047 mAdaptiveThresholdKernel = 64 ;
51-
48+
5249 loadFile ( getOpenFilePath () );
5350}
5451
@@ -89,14 +86,105 @@ void ThresholdTestApp::update()
8986 }
9087}
9188
89+ void ThresholdTestApp::keyDown ( KeyEvent event )
90+ {
91+ const int code = event.getCode ();
92+ if ( code == KeyEvent::KEY_ESCAPE ) {
93+ quit ();
94+ return ;
95+ }
96+
97+ if ( ! event.isControlDown () )
98+ return ;
99+
100+ switch ( code ) {
101+ case KeyEvent::KEY_o:
102+ mRequestOpenDialog = true ;
103+ break ;
104+ case KeyEvent::KEY_a:
105+ mUseAdaptiveThreshold = ! mUseAdaptiveThreshold ;
106+ CI_LOG_I ( " Use adaptive threshold: " << std::boolalpha << mUseAdaptiveThreshold );
107+ break ;
108+ case KeyEvent::KEY_c:
109+ mUseClassVersion = ! mUseClassVersion ;
110+ CI_LOG_I ( " Use adaptive class: " << std::boolalpha << mUseClassVersion );
111+ break ;
112+ case KeyEvent::KEY_d:
113+ mUseAdaptivePercentage = ! mUseAdaptivePercentage ;
114+ CI_LOG_I ( " Use adaptive percentage: " << std::boolalpha << mUseAdaptivePercentage );
115+ break ;
116+ case KeyEvent::KEY_g:
117+ mShowOriginalGrayScale = ! mShowOriginalGrayScale ;
118+ CI_LOG_I ( " Show grayscale: " << std::boolalpha << mShowOriginalGrayScale );
119+ break ;
120+ case KeyEvent::KEY_h:
121+ case KeyEvent::KEY_QUESTION:
122+ mShowGui = ! mShowGui ;
123+ break ;
124+ case KeyEvent::KEY_v:
125+ if ( event.isShiftDown () )
126+ mThresholdValue = std::max ( mThresholdValue - 1 , 0 );
127+ else
128+ mThresholdValue = std::min ( mThresholdValue + 1 , 255 );
129+ CI_LOG_I ( " Threshold value: " << mThresholdValue );
130+ break ;
131+ case KeyEvent::KEY_k:
132+ if ( event.isShiftDown () )
133+ mAdaptiveThresholdKernel = std::max ( mAdaptiveThresholdKernel - 1 , 0 );
134+ else
135+ mAdaptiveThresholdKernel = std::min ( mAdaptiveThresholdKernel + 1 , 1000 );
136+ CI_LOG_I ( " Adaptive kernel: " << mAdaptiveThresholdKernel );
137+ break ;
138+ case KeyEvent::KEY_p:
139+ if ( event.isShiftDown () )
140+ mAdaptiveThresholdPercentage = std::max ( mAdaptiveThresholdPercentage - 0 .01f , 0 .0f );
141+ else
142+ mAdaptiveThresholdPercentage = std::min ( mAdaptiveThresholdPercentage + 0 .01f , 1 .0f );
143+ CI_LOG_I ( " Adaptive percentage: " << mAdaptiveThresholdPercentage );
144+ break ;
145+ default :
146+ break ;
147+ }
148+ }
149+
92150void ThresholdTestApp::draw ()
93151{
94152 gl::clear ( Color ( 0 .1f , 0 .1f , 0 .15f ) );
95153
96154 if ( mTexture )
97155 gl::draw ( mTexture );
98-
99- mParams ->draw ();
156+
157+ if ( mRequestOpenDialog ) {
158+ mRequestOpenDialog = false ;
159+ loadFile ( getOpenFilePath () );
160+ }
161+
162+ if ( mShowGui )
163+ drawGui ();
164+ }
165+
166+ void ThresholdTestApp::drawGui ()
167+ {
168+ ImGui::ScopedWindow window ( " Threshold Controls" );
169+ if ( ImGui::Button ( " Open Image..." ) )
170+ mRequestOpenDialog = true ;
171+
172+ ImGui::SameLine ();
173+ ImGui::Checkbox ( " Show Grayscale" , &mShowOriginalGrayScale );
174+
175+ ImGui::Separator ();
176+ ImGui::Text ( " Processing Mode" );
177+ ImGui::Checkbox ( " Use Adaptive Threshold" , &mUseAdaptiveThreshold );
178+ ImGui::Checkbox ( " Use Adaptive Class" , &mUseClassVersion );
179+ ImGui::Checkbox ( " Use Adaptive Percentage" , &mUseAdaptivePercentage );
180+
181+ ImGui::Separator ();
182+ ImGui::SliderInt ( " Threshold" , &mThresholdValue , 0 , 255 );
183+ ImGui::SliderInt ( " Adaptive Kernel" , &mAdaptiveThresholdKernel , 0 , 1000 );
184+ ImGui::SliderFloat ( " Adaptive Percent" , &mAdaptiveThresholdPercentage , 0 .0f , 1 .0f , " %.2f" );
185+
186+ ImGui::Separator ();
187+ ImGui::TextUnformatted ( " Shortcuts: O=open, H=toggle GUI" );
100188}
101189
102190CINDER_APP ( ThresholdTestApp, RendererGl )
0 commit comments