1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// MainPage.xaml.cpp
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Implementation of the MainPage class.
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler//
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "pch.h"
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "MainPage.xaml.h"
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <ppltasks.h>
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <wrl\client.h>
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <Robuffer.h>
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <vector>
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <opencv2\imgproc\types_c.h>
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <opencv2\imgcodecs\imgcodecs.hpp>
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <opencv2\core\core.hpp>
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include <windows.storage.h>
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace OcvImageProcessing;
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Microsoft::WRL;
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace concurrency;
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Platform;
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Foundation;
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Storage::Streams;
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Storage;
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Media::Imaging;
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Graphics::Imaging;
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::Foundation::Collections;
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml;
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Controls;
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Controls::Primitives;
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Data;
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Input;
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Media;
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace Windows::UI::Xaml::Navigation;
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerUri^ InputImageUri = ref new Uri(L"ms-appx:///Assets/Lena.png");
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// The Blank Page item template is documented at http://go.microsoft.com/fwlink/?LinkId=234238
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerMainPage::MainPage()
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    InitializeComponent();
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef __OPENCV_IMGCODECS_HPP__
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Image loading OpenCV way ... way more simple
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat image = cv::imread("Assets/Lena.png");
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Lena = cv::Mat(image.rows, image.cols, CV_8UC4);
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cvtColor(image, Lena, CV_BGR2BGRA);
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    UpdateImage(Lena);
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#else
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Image loading WinRT way
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RandomAccessStreamReference^ streamRef = RandomAccessStreamReference::CreateFromUri(InputImageUri);
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    task<IRandomAccessStreamWithContentType^> (streamRef->OpenReadAsync()).
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    then([](task<IRandomAccessStreamWithContentType^> thisTask)
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        IRandomAccessStreamWithContentType^ fileStream = thisTask.get();
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return BitmapDecoder::CreateAsync(fileStream);
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }).
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    then([](task<BitmapDecoder^> thisTask)
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        BitmapDecoder^ decoder = thisTask.get();
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return decoder->GetFrameAsync(0);
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }).
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    then([this](task<BitmapFrame^> thisTask)
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        BitmapFrame^ frame = thisTask.get();
72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        // Save some information as fields
74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        frameWidth = frame->PixelWidth;
75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        frameHeight = frame->PixelHeight;
76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return frame->GetPixelDataAsync();
78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }).
79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    then([this](task<PixelDataProvider^> thisTask)
80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        PixelDataProvider^ pixelProvider = thisTask.get();
82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        Platform::Array<byte>^ srcPixels = pixelProvider->DetachPixelData();
83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        Lena = cv::Mat(frameHeight, frameWidth, CV_8UC4);
84793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        memcpy(Lena.data, srcPixels->Data, 4*frameWidth*frameHeight);
85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(Lena);
86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    });
87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif
89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <summary>
92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Temporary file creation example. Will be created in WinRT application temporary directory
93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// which usually is "C:\Users\{username}\AppData\Local\Packages\{package_id}\TempState\{random_name}.{suffix}"
94793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// </summary>
95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <param name="suffix">Temporary file suffix, e.g. "tmp"</param>
96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstd::string OcvImageProcessing::MainPage::CreateTempFile(const std::string &suffix) {
97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return cv::tempfile(suffix.c_str());
98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <summary>
101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Creating/writing a file in the application local directory
102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// </summary>
103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <param name="path">Image to save</param>
104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerbool OcvImageProcessing::MainPage::SaveImage(cv::Mat image) {
105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    StorageFolder^ localFolderRT = ApplicationData::Current->LocalFolder;
106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::String localFile = ConvertPath(ApplicationData::Current->LocalFolder->Path) + "\\Lena.png";
107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return cv::imwrite(localFile, image);
109793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <summary>
112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Getting std::string from managed string via std::wstring.
113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Provides an example of three ways to do it.
114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Can't use this one: https://msdn.microsoft.com/en-us/library/bb384865.aspx, not available on WinRT.
115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// </summary>
116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <param name="path">Path to be converted</param>
117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercv::String OcvImageProcessing::MainPage::ConvertPath(Platform::String^ path) {
118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::wstring localPathW(path->Begin());
119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Opt #1
121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //std::string localPath(localPathW.begin(), localPathW.end());
122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Opt #2
124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    //std::string localPath(StrToWStr(localPathW));
125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Opt #3
127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t outSize = localPathW.length() + 1;
128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    char* localPathC = new char[outSize];
129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t charsConverted = 0;
130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    wcstombs_s(&charsConverted, localPathC, outSize, localPathW.c_str(), localPathW.length());
131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::String localPath(localPathC);
132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Implicit conversion from std::string to cv::String
134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return localPath;
135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstd::string OcvImageProcessing::MainPage::StrToWStr(const std::wstring &input) {
138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    if (input.empty()) {
139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        return std::string();
140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int size = WideCharToMultiByte(CP_UTF8, 0, &input[0], (int)input.size(), NULL, 0, NULL, NULL);
143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::string result(size, 0);
144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    WideCharToMultiByte(CP_UTF8, 0, &input[0], (int)input.size(), &result[0], size, NULL, NULL);
146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <summary>
151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// Invoked when this page is about to be displayed in a Frame.
152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// </summary>
153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// <param name="e">Event data that describes how this page was reached.  The Parameter
154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/// property is typically used to configure the page.</param>
155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid MainPage::OnNavigatedTo(NavigationEventArgs^ e)
156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    (void) e;    // Unused parameter
158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid OcvImageProcessing::MainPage::UpdateImage(const cv::Mat& image)
161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Create the WriteableBitmap
163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    WriteableBitmap^ bitmap = ref new WriteableBitmap(image.cols, image.rows);
164793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Get access to the pixels
166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    IBuffer^ buffer = bitmap->PixelBuffer;
167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    unsigned char* dstPixels;
168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Obtain IBufferByteAccess
170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ComPtr<IBufferByteAccess> pBufferByteAccess;
171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    ComPtr<IInspectable> pBuffer((IInspectable*)buffer);
172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    pBuffer.As(&pBufferByteAccess);
173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
174793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Get pointer to pixel bytes
175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    pBufferByteAccess->Buffer(&dstPixels);
176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    memcpy(dstPixels, image.data, image.step.buf[1]*image.cols*image.rows);
177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
178793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    // Set the bitmap to the Image element
179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    PreviewWidget->Source = bitmap;
180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercv::Mat OcvImageProcessing::MainPage::ApplyGrayFilter(const cv::Mat& image)
184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
185793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat result;
186793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat intermediateMat;
187793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::cvtColor(image, intermediateMat, CV_RGBA2GRAY);
188793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::cvtColor(intermediateMat, result, CV_GRAY2BGRA);
189793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
190793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
191793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
192793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercv::Mat OcvImageProcessing::MainPage::ApplyCannyFilter(const cv::Mat& image)
193793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
194793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat result;
195793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat intermediateMat;
196793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Canny(image, intermediateMat, 80, 90);
197793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::cvtColor(intermediateMat, result, CV_GRAY2BGRA);
198793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
199793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
200793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
201793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercv::Mat OcvImageProcessing::MainPage::ApplyBlurFilter(const cv::Mat& image)
202793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
203793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat result;
204793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::blur(image, result, cv::Size(3,3));
205793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
206793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
207793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
208793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercv::Mat OcvImageProcessing::MainPage::ApplyFindFeaturesFilter(const cv::Mat& image)
209793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
210793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat result;
211793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat intermediateMat;
212793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Ptr<cv::FastFeatureDetector> detector = cv::FastFeatureDetector::create(50);
213793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    std::vector<cv::KeyPoint> features;
214793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
215793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    image.copyTo(result);
216793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::cvtColor(image, intermediateMat, CV_RGBA2GRAY);
217793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    detector->detect(intermediateMat, features);
218793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
219793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( unsigned int i = 0; i < std::min(features.size(), (size_t)50); i++ )
220793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
221793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        const cv::KeyPoint& kp = features[i];
222793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        cv::circle(result, cv::Point((int)kp.pt.x, (int)kp.pt.y), 10, cv::Scalar(255,0,0,255));
223793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
224793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
225793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
226793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
227793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
228793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslercv::Mat OcvImageProcessing::MainPage::ApplySepiaFilter(const cv::Mat& image)
229793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
230793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const float SepiaKernelData[16] =
231793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
232793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* B */0.131f, 0.534f, 0.272f, 0.f,
233793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* G */0.168f, 0.686f, 0.349f, 0.f,
234793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* R */0.189f, 0.769f, 0.393f, 0.f,
235793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        /* A */0.000f, 0.000f, 0.000f, 1.f
236793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    };
237793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const cv::Mat SepiaKernel(4, 4, CV_32FC1, (void*)SepiaKernelData);
238793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::Mat result;
239793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::transform(image, result, SepiaKernel);
240793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    return result;
241793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
242793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
243793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslervoid OcvImageProcessing::MainPage::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
244793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
245793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    switch(FilterTypeWidget->SelectedIndex)
246793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
247793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case PREVIEW:
248793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(Lena);
249793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
250793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case GRAY:
251793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(ApplyGrayFilter(Lena));
252793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
253793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case CANNY:
254793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(ApplyCannyFilter(Lena));
255793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
256793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case BLUR:
257793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(ApplyBlurFilter(Lena));
258793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
259793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case FEATURES:
260793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(ApplyFindFeaturesFilter(Lena));
261793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
262793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    case SEPIA:
263793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(ApplySepiaFilter(Lena));
264793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        break;
265793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    default:
266793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        UpdateImage(Lena);
267793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
268793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
269