OZ++ Sample: VideoImageSharpening

/******************************************************************************  *  * Copyright (c) 2017 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.  *  * Redistribution and use in source and binary forms, with or without  * modification, are permitted provided that the following conditions  * are met:  * 1. Redistributions of source code must retain the above copyright  *    notice, this list of conditions, and the following disclaimer.  *  * 2. The name of the author may not be used to endorse or promote products  *    derived from this software without specific prior written permission.  *  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  *  *  *  VideoImageSharpening.cpp  *  *****************************************************************************/ //#include <oz++/StringT.h> #include <oz++/Mutex.h> #include <oz++/motif/RowColumn.h> #include <oz++/motif/LabeledTrackBar.h> #include <oz++/opencv/OpenCVVideoCaptureView.h> #include <oz++/opencv/OpenCVImageView.h> #include <oz++/opencv/OpenCVScaleComboBox.h> #include <oz++/opencv/OpenCVScrolledImageView.h> namespace OZ { class MainView :public OpenCVVideoCaptureView { private:   //Inner classes start.   class OriginalImageView: public OpenCVImageView {   private:     cv::Mat image;      cv::Mat scaledImage;   public:     void display()     {       show(scaledImage);     }   public:     OriginalImageView(View* parent, const char* name, Args& args)     :OpenCVImageView(parent, name, args)     {     }      void render(cv::Mat& frame, int scalingRatio)     {       image = frame;       rescale(image, scaledImage, scalingRatio);       invalidate();       refresh();     }   };   class SharpenedImageView: public OpenCVImageView {   private:     cv::Mat image;     cv::Mat scaledImage;   public:     void display()     {       show(scaledImage);     }   public:     SharpenedImageView(View* parent, const char* name, Args& args)     :OpenCVImageView(parent, name, args)     {     }     void render(cv::Mat& frame, int ksize, int sigma, int scalingRatio)     {       image = frame;       ksize = (ksize*2)/2 + 1;       cv::Mat newImage = cv::Mat::zeros(image.size(), image.type() );       cv::GaussianBlur(image, newImage, cv::Size(ksize, ksize),              (double)sigma, //sigmaX,              (double)sigma, //sigmaY             BORDER_DEFAULT);              double alpha = 2.5;       double beta  = 1.0 - alpha;       cv::addWeighted(image, alpha, newImage, beta, 0.0, newImage);              rescale(newImage, scaledImage, scalingRatio);       invalidate();       refresh();     }   };   //Inner classes end      private:   SmartPtr<OriginalImageView>  originalView;   SmartPtr<SharpenedImageView>   sharpenedImage;   SmartPtr<RowColumn>          controlPane;   int                          imageScalingRatio;   SmartPtr<LabeledTrackBar>    ksizeTrackBar;   int                          ksize;   SmartPtr<LabeledTrackBar>    sigmaTrackBar;   int                          sigma;   SmartPtr<OpenCVScaleComboBox> scaleComboBox;   void resize(Dimension w, Dimension h)   {     int CP_WIDTH = 160;     w = w- CP_WIDTH;     if (originalView && sharpenedImage && controlPane) {       originalView-> resize(0,     0, w/2-1, h, 0);       sharpenedImage -> resize(w/2+1, 0, w/2-2, h, 0);       controlPane -> reshape(w+2,  0, CP_WIDTH-4, h);     }   }   void scaleChanged(Action& action)   {     int val = scaleComboBox->getScale();     if (val > 0 && imageScalingRatio != val) {       imageScalingRatio = val;       printf("ScalingRatio %d\n", val);     }   }    void ksizeChanged(Action& action)   {     ksize = (int)ksizeTrackBar->get(XmNvalue);   }   void sigmaChanged(Action& action)   {     sigma = sigmaTrackBar->get(XmNvalue);     printf("sigmaChanged sigma=%d\n", sigma);   } public:   MainView(OpenCVApplication& applet, const char* name, Args& args)   :OpenCVVideoCaptureView(applet, name, args)    ,imageScalingRatio(100)   ,ksize(8)   {     try {       BulletinBoard* bboard = getBulletinBoard();       Args ar;        ar.reset();       originalView = new OriginalImageView(bboard, "", ar);       ar.reset();       sharpenedImage = new SharpenedImageView(bboard, "", ar);       ar.reset();       controlPane = new RowColumn(bboard, "", ar);       const char* defaultScale = "100%";       ar.reset();       CompoundString scaler("Scale");       ar.set(XmNlabelString, scaler);       ar.set(XmNdefaultScale, defaultScale);       scaleComboBox = new OpenCVScaleComboBox(controlPane, "", ar);       scaleComboBox->addCallback(XmNselectionCallback, this,         (Callback)&MainView::scaleChanged, NULL);       ksize =8;       ar.reset();       CompoundString ksizecs("KernelSize:[0,31]");       ar.set(XmNminimum, 0);       ar.set(XmNmaximum,  31);       ar.set(XmNvalue,    ksize);        ar.set(XmNtitleString, ksizecs);       ksizeTrackBar = new LabeledTrackBar(controlPane, "", ar);       ksizeTrackBar->addCallback(XmNvalueChangedCallback, this,         (Callback)&MainView::ksizeChanged, NULL);       ar.reset();       CompoundString sigmacs("Sigma[0,20]");       sigma = 12;       ar.set(XmNminimum, 0);       ar.set(XmNmaximum, 20);       ar.set(XmNvalue,   sigma );       ar.set(XmNtitleString, sigmacs);       sigmaTrackBar = new LabeledTrackBar(controlPane, "", ar);       sigmaTrackBar->addCallback(XmNvalueChangedCallback, this,         (Callback)&MainView::sigmaChanged, NULL);       sendConfigureEvent();      } catch(OZ::Exception& ex) {       caught(ex);     }   }   ~MainView()   {   }   virtual void render()   {     try {       cv::Mat frame;       if (readVideoFrame(frame)) {         if (originalView && sharpenedImage) {           originalView->render(frame, imageScalingRatio);           sharpenedImage ->render(frame, ksize, sigma, imageScalingRatio);         }       }     } catch (...) {     }   } }; } // int main(int argc, char** argv)  {   try {     const char*  appclass = argv[0];     OpenCVApplication applet(appclass, argc, argv);     Args args;     args.set(XmNwidth,  900);     args.set(XmNheight, 400);     args.set(XmNvideoDeviceIndex, 0);     args.set(XmNcaptureAutoStart, true);     MainView view(applet, argv[0], args);     view.realize();     applet.run(&view, 100); //100msec        } catch (OZ::Exception& ex) {     caught(ex);   }   return 0; }