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