SOL9 Sample: VideoImageSharpening
|
1 Screenshot
2 Source code
/*
* VideoImageSharpening.cpp
* Copyright (c) 2015 Antillia.com TOSHIYUKI ARAI. ALL RIGHTS RESERVED.
*/
//2017/07/25
//This is a simple example to capture video input and display the captured frames
//to an original image view and a sharpened (blurred) image view.
// See: "http://docs.opencv.org/2.4/doc/tutorials/core/adding_images/adding_images.html"
// Adding (blending) two images using OpenCV
#define _CONSOLE_
#include <sol/ModuleFileName.h>
#include <sol/LabeledTrackBar.h>
#include <sol/FileDialog.h>
#include <sol/opencv/OpenCVVideoApplication.h>
#include <sol/opencv/OpenCVVideoCaptureView.h>
#include <sol/opencv/OpenCVNamedWindow.h>
namespace SOL {
class MainView :public OpenCVVideoCaptureView {
private:
////////////////////////////////////////////////////////////////////////////////////////
//Inner class starts.
class OriginalImageView :public OpenCVNamedWindow {
private:
cv::Mat originalImage;
public:
void display()
{
show(originalImage);
}
public:
OriginalImageView(View* parent, const char* name, Args& args)
:OpenCVNamedWindow(parent, name, args)
{
}
void setImage(cv::Mat image)
{
originalImage = image;
}
};
class BlurredImageView :public OpenCVNamedWindow {
private:
cv::Mat originalImage;
cv::Mat blurredImage;
public:
void display()
{
show(blurredImage);
}
public:
BlurredImageView(View* parent, const char* name, Args& args)
:OpenCVNamedWindow(parent, name, args)
{
}
~BlurredImageView()
{
}
void setImage(cv::Mat& image)
{
originalImage = image;
}
void blur(int ksize, int sigma)
{
//void GaussianBlur(const Mat& src, Mat& dst, Size ksize,
// double sigmaX,
// double sigmaY = 0,
// int borderType = BORDER_DEFAULT)
cv::Mat newImage = cv::Mat::zeros(originalImage.size(), originalImage.type() );
cv::GaussianBlur(originalImage, newImage, cv::Size(ksize, ksize),
(double)sigma, //sigmaX,
(double)sigma, //sigmaY
BORDER_DEFAULT);
// void addWeighted(InputArray src1, double alpha, InputArray src2,
// double beta, double gamma, OutputArray dst, int dtype=-1)
double alpha = 2.5;
double beta = 1.0 - alpha;
cv::addWeighted(originalImage, alpha, newImage, beta, 0.0, newImage);
blurredImage = newImage;
refresh();
}
};
//Inner class ends.
////////////////////////////////////////////////////////////////////////////////////////
SmartPtr<OriginalImageView> originalImage;
SmartPtr<BlurredImageView> blurredImage;
int ksize;
SmartPtr<LabeledTrackBar> ksizeTrackBar;
int sigma;
SmartPtr<LabeledTrackBar> sigmaTrackBar;
//Horizontal Scroll event by TrackBars
void trackBarScrolled(Action& action)
{
ksize = ksizeTrackBar->getPosition();
sigma = sigmaTrackBar->getPosition();
ksize = (ksize/2)*2 +1;
}
void resize(int w, int h)
{
if (originalImage && blurredImage && ksizeTrackBar && sigmaTrackBar) {
originalImage -> reshape(2, 2, (w-160)/2-1, h-4);
blurredImage -> reshape((w-160)/2+1, 2, (w-160)/2-1, h-4);
ksizeTrackBar -> reshape(w-155 + 10, 40, 140, 60);
sigmaTrackBar -> reshape(w-155 + 10, 140, 140, 60);
}
}
void confirm(Action& action)
{
int rc = MessageBox(NULL, "Are you sure to close this window?", "Confirmation",
MB_OKCANCEL|MB_ICONEXCLAMATION);
if (rc == IDOK) {
exit(action);
}
}
public:
MainView(OpenCVVideoApplication& applet, const char* name, Args& args)
:OpenCVVideoCaptureView(applet, name, args)
{
try {
Args ar;
originalImage = new OriginalImageView(this, "cvwindow1", ar);
ar.reset();
blurredImage = new BlurredImageView(this, "cvwindow2", ar);
ksize = 23;
sigma = 18;
ar.reset();
ar.set(XmNminimum, 0);
ar.set(XmNmaximum, 31);
ar.set(XmNposition, ksize);
ksizeTrackBar = new LabeledTrackBar(this, "KernelSize", ar);
ksizeTrackBar -> addCallback(XmNtrackBarScrollCallback, this,
(Callback)&MainView::trackBarScrolled, NULL);
ar.reset();
ar.set(XmNminimum, 0);
ar.set(XmNmaximum, 30);
ar.set(XmNposition, sigma);
ar.set(XmNdisplayOddValue, false);
sigmaTrackBar = new LabeledTrackBar(this, "SigmaSize", ar);
sigmaTrackBar -> addCallback(XmNtrackBarScrollCallback, this,
(Callback)&MainView::trackBarScrolled, NULL);
addCallback(XmNmenuCallback, IDM_EXIT, this,
(Callback)&MainView::confirm, NULL);
ksize = (ksize/2)*2 +1;
} catch (Exception& ex) {
caught(ex);
}
}
~MainView()
{
}
virtual void render()
{
cv::Mat frame;
if (readVideoFrame(frame)) {
if (!frame.empty() && originalImage && blurredImage) {
originalImage -> setImage(frame);
originalImage -> display();
blurredImage -> setImage(frame);
blurredImage -> blur(ksize, sigma);
blurredImage -> display();
}
}
}
};
}
//
void main(int argc, char** argv)
{
try {
ModuleFileName module(argv[0]);
const char* name = module.getAppName();
OpenCVVideoApplication applet(name, argc, argv);
Args args;
args.set(XmNwidth, 900);
args.set(XmNheight, 440);
args.set(XmNvideoDeviceIndex, 0);
args.set(XmNcaptureAutoStart, true);
MainView view(applet, name, args);
view.realize();
applet.run(view);
} catch (SOL::Exception& ex) {
caught(ex);
}
}
Last modified: 2 Dec. 2017
Copyright (c) 2017 Antillia.com ALL RIGHTS RESERVED.