From b0854c605adec7c227a90c776418e8ef32412609 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 19 Jun 2013 03:57:26 -0700 Subject: [PATCH] Windows RT sample improved. Corrent histogram output on YUV image implemented; Some code refactoring done. --- .../C++/AdvancedCapture.xaml.cpp | 111 +------ .../C++/AdvancedCapture.xaml.h | 3 - .../ImageManipulations/C++/MediaCapture.sln | 2 +- .../C++/MediaCapture.vcxproj | 10 +- .../C++/MediaCapture.vcxproj.filters | 101 ------- .../Grayscale/Grayscale.vcxproj.filters | 22 -- .../OcvTransform/OcvImageManipulations.h | 92 ++++++ .../OcvImageManipulations.idl} | 4 +- .../OcvTransform.cpp} | 284 +++++------------- .../OcvTransform.def} | 0 .../OcvTransform.h} | 17 +- .../OcvTransform.vcxproj} | 24 +- .../{Grayscale => OcvTransform}/dllmain.cpp | 4 +- .../C++/Package.appxmanifest | 8 +- .../C++/assets/microsoft-sdk.png | Bin 1583 -> 0 bytes .../C++/assets/opencv-logo-150.png | Bin 0 -> 4609 bytes .../C++/assets/opencv-logo-30.png | Bin 0 -> 1099 bytes .../C++/assets/placeholder-sdk.png | Bin 8991 -> 0 bytes .../C++/assets/smallTile-sdk.png | Bin 1248 -> 0 bytes .../C++/assets/squareTile-sdk.png | Bin 2482 -> 0 bytes .../C++/assets/storeLogo-sdk.png | Bin 1550 -> 0 bytes .../C++/assets/tile-sdk.png | Bin 2665 -> 0 bytes 22 files changed, 194 insertions(+), 488 deletions(-) delete mode 100644 samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj.filters delete mode 100644 samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj.filters create mode 100644 samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.h rename samples/winrt/ImageManipulations/C++/MediaExtensions/{Grayscale/GrayscaleTransform.idl => OcvTransform/OcvImageManipulations.idl} (59%) rename samples/winrt/ImageManipulations/C++/MediaExtensions/{Grayscale/Grayscale.cpp => OcvTransform/OcvTransform.cpp} (82%) rename samples/winrt/ImageManipulations/C++/MediaExtensions/{Grayscale/Grayscale.def => OcvTransform/OcvTransform.def} (100%) rename samples/winrt/ImageManipulations/C++/MediaExtensions/{Grayscale/Grayscale.h => OcvTransform/OcvTransform.h} (95%) rename samples/winrt/ImageManipulations/C++/MediaExtensions/{Grayscale/Grayscale.vcxproj => OcvTransform/OcvTransform.vcxproj} (96%) rename samples/winrt/ImageManipulations/C++/MediaExtensions/{Grayscale => OcvTransform}/dllmain.cpp (96%) delete mode 100644 samples/winrt/ImageManipulations/C++/assets/microsoft-sdk.png create mode 100644 samples/winrt/ImageManipulations/C++/assets/opencv-logo-150.png create mode 100644 samples/winrt/ImageManipulations/C++/assets/opencv-logo-30.png delete mode 100644 samples/winrt/ImageManipulations/C++/assets/placeholder-sdk.png delete mode 100644 samples/winrt/ImageManipulations/C++/assets/smallTile-sdk.png delete mode 100644 samples/winrt/ImageManipulations/C++/assets/squareTile-sdk.png delete mode 100644 samples/winrt/ImageManipulations/C++/assets/storeLogo-sdk.png delete mode 100644 samples/winrt/ImageManipulations/C++/assets/tile-sdk.png diff --git a/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.cpp b/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.cpp index 066891dacc..cff0a5a799 100644 --- a/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.cpp +++ b/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.cpp @@ -313,7 +313,7 @@ void AdvancedCapture::AddEffectToImageStream() changeTypeTask.get(); ShowStatusMessage("Change type on photo stream successful"); //Now add the effect on the image pin - task(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"GrayscaleTransform.GrayscaleEffect", nullptr)).then([this](task effectTask3) + task(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task effectTask3) { try { @@ -348,7 +348,7 @@ void AdvancedCapture::AddEffectToImageStream() else { //Add the effect to the image pin if the type is already "Video" - task(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"GrayscaleTransform.GrayscaleEffect", nullptr)).then([this](task effectTask3) + task(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::Photo,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task effectTask3) { try { @@ -368,103 +368,6 @@ void AdvancedCapture::AddEffectToImageStream() } } - -void AdvancedCapture::chkAddRemoveEffect_Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) -{ -} - -void AdvancedCapture::chkAddRemoveEffect_Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) -{ - try - { - EffectTypeCombo->IsEnabled = false; - m_bEffectAdded = false; - create_task(m_mediaCaptureMgr->ClearEffectsAsync(Windows::Media::Capture::MediaStreamType::VideoPreview)).then([this](task effectTask) - { - try - { - effectTask.get(); - ShowStatusMessage("Remove effect from video preview stream successful"); - if(m_bEffectAddedToRecord) - { - task(m_mediaCaptureMgr->ClearEffectsAsync(Windows::Media::Capture::MediaStreamType::VideoRecord)).then([this](task effectTask) - { - try - { - effectTask.get(); - ShowStatusMessage("Remove effect from video record stream successful"); - m_bEffectAddedToRecord = false; - if(m_bEffectAddedToPhoto) - { - task(m_mediaCaptureMgr->ClearEffectsAsync(Windows::Media::Capture::MediaStreamType::Photo)).then([this](task effectTask) - { - try - { - effectTask.get(); - ShowStatusMessage("Remove effect from Photo stream successful"); - m_bEffectAddedToPhoto = false; - - } - catch(Exception ^e) - { - ShowExceptionMessage(e); - EffectTypeCombo->IsEnabled = true; - } - - }); - } - else - { - } - EffectTypeCombo->IsEnabled = true; - } - catch(Exception ^e) - { - ShowExceptionMessage(e); - EffectTypeCombo->IsEnabled = true; - } - - }); - - } - else if(m_bEffectAddedToPhoto) - { - task(m_mediaCaptureMgr->ClearEffectsAsync(Windows::Media::Capture::MediaStreamType::Photo)).then([this](task effectTask) - { - try - { - effectTask.get(); - ShowStatusMessage("Remove effect from Photo stream successful"); - m_bEffectAddedToPhoto = false; - - } - catch(Exception ^e) - { - ShowExceptionMessage(e); - EffectTypeCombo->IsEnabled = true; - } - - }); - } - else - { - EffectTypeCombo->IsEnabled = true; - } - } - catch (Exception ^e) - { - ShowExceptionMessage(e); - EffectTypeCombo->IsEnabled = true; - } - }); - } - catch (Platform::Exception ^e) - { - ShowExceptionMessage(e); - EffectTypeCombo->IsEnabled = true; - } -} - void AdvancedCapture::ShowStatusMessage(Platform::String^ text) { rootPage->NotifyUser(text, NotifyType::StatusMessage); @@ -637,12 +540,6 @@ Windows::Media::Capture::VideoRotation AdvancedCapture::VideoRotationLookup( } } - -void SDKSample::MediaCapture::AdvancedCapture::EffectTypeCombo_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e) -{ -} - - void SDKSample::MediaCapture::AdvancedCapture::Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e) { try @@ -653,7 +550,7 @@ void SDKSample::MediaCapture::AdvancedCapture::Button_Click(Platform::Object^ se int index = EffectTypeCombo->SelectedIndex; PropertySet^ props = ref new PropertySet(); props->Insert(L"{698649BE-8EAE-4551-A4CB-3EC98FBD3D86}", index); - create_task(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoPreview,"GrayscaleTransform.GrayscaleEffect", props)).then([this](task effectTask) + create_task(m_mediaCaptureMgr->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoPreview,"OcvTransform.OcvImageManipulations", props)).then([this](task effectTask) { try { @@ -670,7 +567,7 @@ void SDKSample::MediaCapture::AdvancedCapture::Button_Click(Platform::Object^ se Windows::Media::MediaProperties::VideoEncodingProperties ^videoEncodingProperties = static_cast(props); if(!videoEncodingProperties->Subtype->Equals("H264")) //Cant add an effect to an H264 stream { - task(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoRecord,"GrayscaleTransform.GrayscaleEffect", nullptr)).then([this](task effectTask2) + task(mediaCapture->AddEffectAsync(Windows::Media::Capture::MediaStreamType::VideoRecord,"OcvTransform.OcvImageManipulations", nullptr)).then([this](task effectTask2) { try { diff --git a/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.h b/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.h index fb754de327..94fa87c615 100644 --- a/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.h +++ b/samples/winrt/ImageManipulations/C++/AdvancedCapture.xaml.h @@ -58,8 +58,6 @@ namespace SDKSample void lstEnumedDevices_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e); void EnumerateWebcamsAsync(); - void chkAddRemoveEffect_Checked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); - void chkAddRemoveEffect_Unchecked(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); void AddEffectToImageStream(); void ShowStatusMessage(Platform::String^ text); @@ -91,7 +89,6 @@ namespace SDKSample bool m_bRotateVideoOnOrientationChange; bool m_bReversePreviewRotation; Windows::Foundation::EventRegistrationToken m_orientationChangedEventToken; - void EffectTypeCombo_SelectionChanged(Platform::Object^ sender, Windows::UI::Xaml::Controls::SelectionChangedEventArgs^ e); void Button_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e); }; } diff --git a/samples/winrt/ImageManipulations/C++/MediaCapture.sln b/samples/winrt/ImageManipulations/C++/MediaCapture.sln index 7b99bce314..e1f9aa3859 100644 --- a/samples/winrt/ImageManipulations/C++/MediaCapture.sln +++ b/samples/winrt/ImageManipulations/C++/MediaCapture.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 11 Express for Windows 8 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MediaCapture", "MediaCapture.vcxproj", "{C5B886A7-8300-46FF-B533-9613DE2AF637}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GrayscaleTransform", "MediaExtensions\Grayscale\Grayscale.vcxproj", "{BA69218F-DA5C-4D14-A78D-21A9E4DEC669}" +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GrayscaleTransform", "MediaExtensions\OcvTransform\OcvTransform.vcxproj", "{BA69218F-DA5C-4D14-A78D-21A9E4DEC669}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj b/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj index 88cb456707..f4eceef61c 100644 --- a/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj +++ b/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj @@ -156,17 +156,13 @@ - - - + + - - - - + {ba69218f-da5c-4d14-a78d-21a9e4dec669} diff --git a/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj.filters b/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj.filters deleted file mode 100644 index 403e5ea1f1..0000000000 --- a/samples/winrt/ImageManipulations/C++/MediaCapture.vcxproj.filters +++ /dev/null @@ -1,101 +0,0 @@ - - - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - Assets - - - - - - - - - - - - Common - - - Sample-Utils - - - - - - - - - Common - - - Common - - - - - - - - - - Common - - - Common - - - - - - - {132eec18-b164-4b15-a746-643880e9c5d9} - - - {476b4177-f316-4458-8e13-cab3dc2381c5} - - - {54f287f8-e4cb-4f47-97d0-4c469de6992e} - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj.filters b/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj.filters deleted file mode 100644 index 92c2c9cfec..0000000000 --- a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj.filters +++ /dev/null @@ -1,22 +0,0 @@ - - - - - bdc52ff6-58cb-464b-bf4f-0c1804b135ff - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.h b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.h new file mode 100644 index 0000000000..5fce7322c2 --- /dev/null +++ b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.h @@ -0,0 +1,92 @@ + + +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + + /* File created by MIDL compiler version 8.00.0595 */ +/* at Wed Jun 19 03:47:25 2013 + */ +/* Compiler settings for C:\Users\ASMORK~1\AppData\Local\Temp\OcvImageManipulations.idl-2e8e757e: + Oicf, W1, Zp8, env=Win32 (32b run), target_arch=X86 8.00.0595 + protocol : dce , ms_ext, c_ext, robust + error checks: allocation ref bounds_check enum stub_data + VC __declspec() decoration level: + __declspec(uuid()), __declspec(selectany), __declspec(novtable) + DECLSPEC_UUID(), MIDL_INTERFACE() +*/ +/* @@MIDL_FILE_HEADING( ) */ + +#pragma warning( disable: 4049 ) /* more than 64k source lines */ + + +/* verify that the version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 475 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of +#endif // __RPCNDR_H_VERSION__ + + +#ifndef __OcvImageManipulations_h__ +#define __OcvImageManipulations_h__ + +#if defined(_MSC_VER) && (_MSC_VER >= 1020) +#pragma once +#endif + +#if defined(__cplusplus) +#if defined(__MIDL_USE_C_ENUM) +#define MIDL_ENUM enum +#else +#define MIDL_ENUM enum class +#endif +#endif + + +/* Forward Declarations */ + +/* header files for imported files */ +#include "Windows.Media.h" + +#ifdef __cplusplus +extern "C"{ +#endif + + +/* interface __MIDL_itf_OcvImageManipulations_0000_0000 */ +/* [local] */ + +#pragma warning(push) +#pragma warning(disable:4001) +#pragma once +#pragma warning(pop) +#ifndef RUNTIMECLASS_OcvTransform_OcvImageManipulations_DEFINED +#define RUNTIMECLASS_OcvTransform_OcvImageManipulations_DEFINED +extern const __declspec(selectany) WCHAR RuntimeClass_OcvTransform_OcvImageManipulations[] = L"OcvTransform.OcvImageManipulations"; +#endif + + +/* interface __MIDL_itf_OcvImageManipulations_0000_0000 */ +/* [local] */ + + + +extern RPC_IF_HANDLE __MIDL_itf_OcvImageManipulations_0000_0000_v0_0_c_ifspec; +extern RPC_IF_HANDLE __MIDL_itf_OcvImageManipulations_0000_0000_v0_0_s_ifspec; + +/* Additional Prototypes for ALL interfaces */ + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif + + diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/GrayscaleTransform.idl b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.idl similarity index 59% rename from samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/GrayscaleTransform.idl rename to samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.idl index de81380eca..120ef7dbb4 100644 --- a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/GrayscaleTransform.idl +++ b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvImageManipulations.idl @@ -2,10 +2,10 @@ import "Windows.Media.idl"; #include -namespace GrayscaleTransform +namespace OcvTransform { [version(NTDDI_WIN8)] - runtimeclass GrayscaleEffect + runtimeclass OcvImageManipulations { } } \ No newline at end of file diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.cpp b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.cpp similarity index 82% rename from samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.cpp rename to samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.cpp index 87121ef297..bf98128158 100644 --- a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.cpp +++ b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.cpp @@ -5,49 +5,23 @@ // // Copyright (c) Microsoft Corporation. All rights reserved. -#include "Grayscale.h" +#include "OcvTransform.h" #include "bufferlock.h" #include "opencv2\core\core.hpp" #include "opencv2\imgproc\imgproc.hpp" -#pragma comment(lib, "d2d1") - using namespace Microsoft::WRL; /* This sample implements a video effect as a Media Foundation transform (MFT). -The video effect manipulates chroma values in a YUV image. In the default setting, -the entire image is converted to grayscale. Optionally, the application may set any -of the following attributes: - -MFT_GRAYSCALE_DESTINATION_RECT (type = blob, UINT32[4] array) - - Sets the destination rectangle for the effect. Pixels outside the destination - rectangle are not altered. - -MFT_GRAYSCALE_SATURATION (type = double) - - Sets the saturation level. The nominal range is [0...1]. Values beyond 1.0f - result in supersaturated colors. Values below 0.0f create inverted colors. - -MFT_GRAYSCALE_CHROMA_ROTATION (type = double) - - Rotates the chroma values of each pixel. The attribue value is the angle of - rotation in degrees. The result is a shift in hue. - -The effect is implemented by treating the chroma value of each pixel as a vector [u,v], -and applying a transformation matrix to the vector. The saturation parameter is applied -as a scaling transform. - - NOTES ON THE MFT IMPLEMENTATION 1. The MFT has fixed streams: One input stream and one output stream. -2. The MFT supports the following formats: UYVY, YUY2, NV12. +2. The MFT supports NV12 format only. 3. If the MFT is holding an input sample, SetInputType and SetOutputType both fail. @@ -82,18 +56,13 @@ NOTES ON THE MFT IMPLEMENTATION */ -// Video FOURCC codes. -const DWORD FOURCC_NV12 = '21VN'; - // Static array of media types (preferred and accepted). const GUID g_MediaSubtypes[] = { MFVideoFormat_NV12 }; -HRESULT GetImageSize(DWORD fcc, UINT32 width, UINT32 height, DWORD* pcbImage); HRESULT GetDefaultStride(IMFMediaType *pType, LONG *plStride); -bool ValidateRect(const RECT& rc); template inline T clamp(const T& val, const T& minVal, const T& maxVal) @@ -101,92 +70,7 @@ inline T clamp(const T& val, const T& minVal, const T& maxVal) return (val < minVal ? minVal : (val > maxVal ? maxVal : val)); } -//------------------------------------------------------------------- -// Functions to convert a YUV images to grayscale. -// -// In all cases, the same transformation is applied to the 8-bit -// chroma values, but the pixel layout in memory differs. -// -// The image conversion functions take the following parameters: -// -// mat Transfomation matrix for chroma values. -// rcDest Destination rectangle. -// pDest Pointer to the destination buffer. -// lDestStride Stride of the destination buffer, in bytes. -// pSrc Pointer to the source buffer. -// lSrcStride Stride of the source buffer, in bytes. -// dwWidthInPixels Frame width in pixels. -// dwHeightInPixels Frame height, in pixels. -//------------------------------------------------------------------- - -// Convert NV12 image - -void TransformImage_NV12( - const D2D1::Matrix3x2F& mat, - const D2D_RECT_U& rcDest, - _Inout_updates_(_Inexpressible_(2 * lDestStride * dwHeightInPixels)) BYTE *pDest, - _In_ LONG lDestStride, - _In_reads_(_Inexpressible_(2 * lSrcStride * dwHeightInPixels)) const BYTE* pSrc, - _In_ LONG lSrcStride, - _In_ DWORD dwWidthInPixels, - _In_ DWORD dwHeightInPixels) -{ - // NV12 is planar: Y plane, followed by packed U-V plane. - - // Y plane - for (DWORD y = 0; y < dwHeightInPixels; y++) - { - CopyMemory(pDest, pSrc, dwWidthInPixels); - pDest += lDestStride; - pSrc += lSrcStride; - } - - // U-V plane - - // NOTE: The U-V plane has 1/2 the number of lines as the Y plane. - - // Lines above the destination rectangle. - DWORD y = 0; - - const DWORD y0 = rcDest.bottom < dwHeightInPixels ? rcDest.bottom : dwHeightInPixels; - - for ( ; y < rcDest.top/2; y++) - { - memcpy(pDest, pSrc, dwWidthInPixels); - pSrc += lSrcStride; - pDest += lDestStride; - } - - // Lines within the destination rectangle. - for ( ; y < y0/2; y++) - { - for (DWORD x = 0; (x + 1) < dwWidthInPixels; x += 2) - { - if (x >= rcDest.left && x < rcDest.right) - { - pDest[x] = 0; - pDest[x+1] = 0; - } - else - { - pDest[x] = pSrc[x]; - pDest[x+1] = pSrc[x+1]; - } - } - pDest += lDestStride; - pSrc += lSrcStride; - } - - // Lines below the destination rectangle. - for ( ; y < dwHeightInPixels/2; y++) - { - memcpy(pDest, pSrc, dwWidthInPixels); - pSrc += lSrcStride; - pDest += lDestStride; - } -} - -CGrayscale::CGrayscale() : +OcvImageManipulations::OcvImageManipulations() : m_pSample(NULL), m_pInputType(NULL), m_pOutputType(NULL), m_imageWidthInPixels(0), m_imageHeightInPixels(0), m_cbImageSize(0), m_TransformType(Preview), m_bStreamingInitialized(false), @@ -195,7 +79,7 @@ CGrayscale::CGrayscale() : InitializeCriticalSectionEx(&m_critSec, 3000, 0); } -CGrayscale::~CGrayscale() +OcvImageManipulations::~OcvImageManipulations() { SafeRelease(&m_pInputType); SafeRelease(&m_pOutputType); @@ -205,7 +89,7 @@ CGrayscale::~CGrayscale() } // Initialize the instance. -STDMETHODIMP CGrayscale::RuntimeClassInitialize() +STDMETHODIMP OcvImageManipulations::RuntimeClassInitialize() { // Create the attribute store. return MFCreateAttributes(&m_pAttributes, 3); @@ -217,7 +101,7 @@ STDMETHODIMP CGrayscale::RuntimeClassInitialize() // SetProperties // Sets the configuration of the effect //------------------------------------------------------------------- -HRESULT CGrayscale::SetProperties(ABI::Windows::Foundation::Collections::IPropertySet *pConfiguration) +HRESULT OcvImageManipulations::SetProperties(ABI::Windows::Foundation::Collections::IPropertySet *pConfiguration) { HRESULT hr = S_OK; @@ -237,14 +121,16 @@ HRESULT CGrayscale::SetProperties(ABI::Windows::Foundation::Collections::IProper spSetting->Lookup(key, &value); Microsoft::WRL::ComPtr> ref; - value->QueryInterface(IID_PPV_ARGS(&ref)); + hr = value->QueryInterface(IID_PPV_ARGS(&ref)); int effect = InvalidEffect; - ref->get_Value(&effect); + hr = ref->get_Value(&effect); if ((effect >= 0) && (effect < InvalidEffect)) { m_TransformType = (ProcessingType)effect; } } + + return hr; } // IMFTransform methods. Refer to the Media Foundation SDK documentation for details. @@ -254,7 +140,7 @@ HRESULT CGrayscale::SetProperties(ABI::Windows::Foundation::Collections::IProper // Returns the minimum and maximum number of streams. //------------------------------------------------------------------- -HRESULT CGrayscale::GetStreamLimits( +HRESULT OcvImageManipulations::GetStreamLimits( DWORD *pdwInputMinimum, DWORD *pdwInputMaximum, DWORD *pdwOutputMinimum, @@ -283,7 +169,7 @@ HRESULT CGrayscale::GetStreamLimits( // Returns the actual number of streams. //------------------------------------------------------------------- -HRESULT CGrayscale::GetStreamCount( +HRESULT OcvImageManipulations::GetStreamCount( DWORD *pcInputStreams, DWORD *pcOutputStreams ) @@ -307,7 +193,7 @@ HRESULT CGrayscale::GetStreamCount( // Returns stream IDs for the input and output streams. //------------------------------------------------------------------- -HRESULT CGrayscale::GetStreamIDs( +HRESULT OcvImageManipulations::GetStreamIDs( DWORD dwInputIDArraySize, DWORD *pdwInputIDs, DWORD dwOutputIDArraySize, @@ -328,7 +214,7 @@ HRESULT CGrayscale::GetStreamIDs( // Returns information about an input stream. //------------------------------------------------------------------- -HRESULT CGrayscale::GetInputStreamInfo( +HRESULT OcvImageManipulations::GetInputStreamInfo( DWORD dwInputStreamID, MFT_INPUT_STREAM_INFO * pStreamInfo ) @@ -375,7 +261,7 @@ HRESULT CGrayscale::GetInputStreamInfo( // Returns information about an output stream. //------------------------------------------------------------------- -HRESULT CGrayscale::GetOutputStreamInfo( +HRESULT OcvImageManipulations::GetOutputStreamInfo( DWORD dwOutputStreamID, MFT_OUTPUT_STREAM_INFO * pStreamInfo ) @@ -424,7 +310,7 @@ HRESULT CGrayscale::GetOutputStreamInfo( // Returns the attributes for the MFT. //------------------------------------------------------------------- -HRESULT CGrayscale::GetAttributes(IMFAttributes** ppAttributes) +HRESULT OcvImageManipulations::GetAttributes(IMFAttributes** ppAttributes) { if (ppAttributes == NULL) { @@ -446,7 +332,7 @@ HRESULT CGrayscale::GetAttributes(IMFAttributes** ppAttributes) // Returns stream-level attributes for an input stream. //------------------------------------------------------------------- -HRESULT CGrayscale::GetInputStreamAttributes( +HRESULT OcvImageManipulations::GetInputStreamAttributes( DWORD dwInputStreamID, IMFAttributes **ppAttributes ) @@ -461,7 +347,7 @@ HRESULT CGrayscale::GetInputStreamAttributes( // Returns stream-level attributes for an output stream. //------------------------------------------------------------------- -HRESULT CGrayscale::GetOutputStreamAttributes( +HRESULT OcvImageManipulations::GetOutputStreamAttributes( DWORD dwOutputStreamID, IMFAttributes **ppAttributes ) @@ -475,7 +361,7 @@ HRESULT CGrayscale::GetOutputStreamAttributes( // DeleteInputStream //------------------------------------------------------------------- -HRESULT CGrayscale::DeleteInputStream(DWORD dwStreamID) +HRESULT OcvImageManipulations::DeleteInputStream(DWORD dwStreamID) { // This MFT has a fixed number of input streams, so the method is not supported. return E_NOTIMPL; @@ -486,7 +372,7 @@ HRESULT CGrayscale::DeleteInputStream(DWORD dwStreamID) // AddInputStreams //------------------------------------------------------------------- -HRESULT CGrayscale::AddInputStreams( +HRESULT OcvImageManipulations::AddInputStreams( DWORD cStreams, DWORD *adwStreamIDs ) @@ -501,7 +387,7 @@ HRESULT CGrayscale::AddInputStreams( // Returns a preferred input type. //------------------------------------------------------------------- -HRESULT CGrayscale::GetInputAvailableType( +HRESULT OcvImageManipulations::GetInputAvailableType( DWORD dwInputStreamID, DWORD dwTypeIndex, // 0-based IMFMediaType **ppType @@ -549,7 +435,7 @@ HRESULT CGrayscale::GetInputAvailableType( // Returns a preferred output type. //------------------------------------------------------------------- -HRESULT CGrayscale::GetOutputAvailableType( +HRESULT OcvImageManipulations::GetOutputAvailableType( DWORD dwOutputStreamID, DWORD dwTypeIndex, // 0-based IMFMediaType **ppType @@ -594,7 +480,7 @@ HRESULT CGrayscale::GetOutputAvailableType( // SetInputType //------------------------------------------------------------------- -HRESULT CGrayscale::SetInputType( +HRESULT OcvImageManipulations::SetInputType( DWORD dwInputStreamID, IMFMediaType *pType, // Can be NULL to clear the input type. DWORD dwFlags @@ -656,7 +542,7 @@ done: // SetOutputType //------------------------------------------------------------------- -HRESULT CGrayscale::SetOutputType( +HRESULT OcvImageManipulations::SetOutputType( DWORD dwOutputStreamID, IMFMediaType *pType, // Can be NULL to clear the output type. DWORD dwFlags @@ -718,7 +604,7 @@ done: // Returns the current input type. //------------------------------------------------------------------- -HRESULT CGrayscale::GetInputCurrentType( +HRESULT OcvImageManipulations::GetInputCurrentType( DWORD dwInputStreamID, IMFMediaType **ppType ) @@ -755,7 +641,7 @@ HRESULT CGrayscale::GetInputCurrentType( // Returns the current output type. //------------------------------------------------------------------- -HRESULT CGrayscale::GetOutputCurrentType( +HRESULT OcvImageManipulations::GetOutputCurrentType( DWORD dwOutputStreamID, IMFMediaType **ppType ) @@ -793,7 +679,7 @@ HRESULT CGrayscale::GetOutputCurrentType( // Query if the MFT is accepting more input. //------------------------------------------------------------------- -HRESULT CGrayscale::GetInputStatus( +HRESULT OcvImageManipulations::GetInputStatus( DWORD dwInputStreamID, DWORD *pdwFlags ) @@ -840,7 +726,7 @@ HRESULT CGrayscale::GetInputStatus( // Query if the MFT can produce output. //------------------------------------------------------------------- -HRESULT CGrayscale::GetOutputStatus(DWORD *pdwFlags) +HRESULT OcvImageManipulations::GetOutputStatus(DWORD *pdwFlags) { if (pdwFlags == NULL) { @@ -869,7 +755,7 @@ HRESULT CGrayscale::GetOutputStatus(DWORD *pdwFlags) // Sets the range of time stamps that the MFT will output. //------------------------------------------------------------------- -HRESULT CGrayscale::SetOutputBounds( +HRESULT OcvImageManipulations::SetOutputBounds( LONGLONG hnsLowerBound, LONGLONG hnsUpperBound ) @@ -884,7 +770,7 @@ HRESULT CGrayscale::SetOutputBounds( // Sends an event to an input stream. //------------------------------------------------------------------- -HRESULT CGrayscale::ProcessEvent( +HRESULT OcvImageManipulations::ProcessEvent( DWORD dwInputStreamID, IMFMediaEvent *pEvent ) @@ -900,7 +786,7 @@ HRESULT CGrayscale::ProcessEvent( // ProcessMessage //------------------------------------------------------------------- -HRESULT CGrayscale::ProcessMessage( +HRESULT OcvImageManipulations::ProcessMessage( MFT_MESSAGE_TYPE eMessage, ULONG_PTR ulParam ) @@ -965,7 +851,7 @@ HRESULT CGrayscale::ProcessMessage( // Process an input sample. //------------------------------------------------------------------- -HRESULT CGrayscale::ProcessInput( +HRESULT OcvImageManipulations::ProcessInput( DWORD dwInputStreamID, IMFSample *pSample, DWORD dwFlags @@ -1030,7 +916,7 @@ done: // Process an output sample. //------------------------------------------------------------------- -HRESULT CGrayscale::ProcessOutput( +HRESULT OcvImageManipulations::ProcessOutput( DWORD dwFlags, DWORD cOutputBufferCount, MFT_OUTPUT_DATA_BUFFER *pOutputSamples, // one per stream @@ -1150,7 +1036,7 @@ done: // dwTypeIndex: Index into the list of peferred media types. // ppmt: Receives a pointer to the media type. -HRESULT CGrayscale::OnGetPartialType(DWORD dwTypeIndex, IMFMediaType **ppmt) +HRESULT OcvImageManipulations::OnGetPartialType(DWORD dwTypeIndex, IMFMediaType **ppmt) { if (dwTypeIndex >= ARRAYSIZE(g_MediaSubtypes)) { @@ -1188,7 +1074,7 @@ done: // Validate an input media type. -HRESULT CGrayscale::OnCheckInputType(IMFMediaType *pmt) +HRESULT OcvImageManipulations::OnCheckInputType(IMFMediaType *pmt) { assert(pmt != NULL); @@ -1217,7 +1103,7 @@ HRESULT CGrayscale::OnCheckInputType(IMFMediaType *pmt) // Validate an output media type. -HRESULT CGrayscale::OnCheckOutputType(IMFMediaType *pmt) +HRESULT OcvImageManipulations::OnCheckOutputType(IMFMediaType *pmt) { assert(pmt != NULL); @@ -1247,7 +1133,7 @@ HRESULT CGrayscale::OnCheckOutputType(IMFMediaType *pmt) // Validate a media type (input or output) -HRESULT CGrayscale::OnCheckMediaType(IMFMediaType *pmt) +HRESULT OcvImageManipulations::OnCheckMediaType(IMFMediaType *pmt) { BOOL bFoundMatchingSubtype = FALSE; @@ -1307,7 +1193,7 @@ done: // // Prerequisite: The input type was already validated. -void CGrayscale::OnSetInputType(IMFMediaType *pmt) +void OcvImageManipulations::OnSetInputType(IMFMediaType *pmt) { // if pmt is NULL, clear the type. // if pmt is non-NULL, set the type. @@ -1328,7 +1214,7 @@ void CGrayscale::OnSetInputType(IMFMediaType *pmt) // // Prerequisite: The output type was already validated. -void CGrayscale::OnSetOutputType(IMFMediaType *pmt) +void OcvImageManipulations::OnSetOutputType(IMFMediaType *pmt) { // If pmt is NULL, clear the type. Otherwise, set the type. @@ -1346,7 +1232,7 @@ void CGrayscale::OnSetOutputType(IMFMediaType *pmt) // This method is called if the client sends the MFT_MESSAGE_NOTIFY_BEGIN_STREAMING // message, or when the client processes a sample, whichever happens first. -HRESULT CGrayscale::BeginStreaming() +HRESULT OcvImageManipulations::BeginStreaming() { HRESULT hr = S_OK; @@ -1366,7 +1252,7 @@ HRESULT CGrayscale::BeginStreaming() // message, or when the media type changes. In general, it should be called whenever // the streaming parameters need to be reset. -HRESULT CGrayscale::EndStreaming() +HRESULT OcvImageManipulations::EndStreaming() { m_bStreamingInitialized = false; return S_OK; @@ -1376,7 +1262,7 @@ HRESULT CGrayscale::EndStreaming() // Generate output data. -HRESULT CGrayscale::OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut) +HRESULT OcvImageManipulations::OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut) { BYTE *pDest = NULL; // Destination buffer. LONG lDestStride = 0; // Destination stride. @@ -1447,10 +1333,17 @@ HRESULT CGrayscale::OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut) const int mHistSize[] = {25}; const float baseRabge[] = {0.f,256.f}; const float* ranges[] = {baseRabge}; - const cv::Scalar mColorsRGB[] = { cv::Scalar(200, 0, 0, 255), cv::Scalar(0, 200, 0, 255), - cv::Scalar(0, 0, 200, 255) }; + + const cv::Scalar mColorsY[] = { cv::Scalar(76), cv::Scalar(149), cv::Scalar(29) }; + const cv::Scalar mColorsUV[] = { cv::Scalar(84, 255), cv::Scalar(43, 21), cv::Scalar(255, 107) }; + cv::Mat OutputY(m_imageHeightInPixels, m_imageWidthInPixels, CV_8UC1, pDest, lDestStride); + cv::Mat OutputUV(m_imageHeightInPixels/2, m_imageWidthInPixels/2, + CV_8UC2, pDest+m_imageHeightInPixels*lDestStride, lDestStride); cv::Mat BgrFrame; + + InputFrame.copyTo(OutputFrame); + cv::cvtColor(InputFrame, BgrFrame, cv::COLOR_YUV420sp2BGR); int thikness = (int) (BgrFrame.cols / (mHistSizeNum + 10) / 5); if(thikness > 5) thikness = 5; @@ -1464,14 +1357,20 @@ HRESULT CGrayscale::OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut) cv::normalize(hist, hist, BgrFrame.rows/2, 0, cv::NORM_INF); for(int h=0; h(h); - cv::line(BgrFrame, mP1, mP2, mColorsRGB[c], thikness); - } - } + mP2.y = mP1.y - 2 - (int)hist.at(h); + cv::line(OutputY, mP1, mP2, mColorsY[c], thikness); - cv::cvtColor(BgrFrame, OutputFrame, cv::COLOR_BGR2YUV_I420); + // Draw on UV planes + mP1.x /= 2; + mP1.y /= 2; + mP2.x /= 2; + mP2.y /= 2; + cv::line(OutputUV, mP1, mP2, mColorsUV[c], thikness/2); + } + } } break; default: break; @@ -1486,7 +1385,7 @@ HRESULT CGrayscale::OnProcessOutput(IMFMediaBuffer *pIn, IMFMediaBuffer *pOut) // Flush the MFT. -HRESULT CGrayscale::OnFlush() +HRESULT OcvImageManipulations::OnFlush() { // For this MFT, flushing just means releasing the input sample. SafeRelease(&m_pSample); @@ -1497,7 +1396,7 @@ HRESULT CGrayscale::OnFlush() // Update the format information. This method is called whenever the // input type is set. -HRESULT CGrayscale::UpdateFormatInfo() +HRESULT OcvImageManipulations::UpdateFormatInfo() { HRESULT hr = S_OK; @@ -1526,8 +1425,8 @@ HRESULT CGrayscale::UpdateFormatInfo() goto done; } - // Calculate the image size (not including padding) - hr = GetImageSize(subtype.Data1, m_imageWidthInPixels, m_imageHeightInPixels, &m_cbImageSize); + // Calculate the image size for YUV NV12 image(not including padding) + m_cbImageSize = (m_imageHeightInPixels + m_imageHeightInPixels/2)*m_imageWidthInPixels; } done: @@ -1535,35 +1434,6 @@ done: } -// Calculate the size of the buffer needed to store the image. - -// fcc: The FOURCC code of the video format. - -HRESULT GetImageSize(DWORD fcc, UINT32 width, UINT32 height, DWORD* pcbImage) -{ - HRESULT hr = S_OK; - - switch (fcc) - { - case FOURCC_NV12: - // check overflow - if ((height/2 > MAXDWORD - height) || ((height + height/2) > MAXDWORD / width)) - { - hr = E_INVALIDARG; - } - else - { - // 12 bpp - *pcbImage = width * (height + (height/2)); - } - break; - - default: - hr = E_FAIL; // Unsupported type. - } - return hr; -} - // Get the default stride for a video format. HRESULT GetDefaultStride(IMFMediaType *pType, LONG *plStride) { @@ -1614,23 +1484,3 @@ HRESULT GetDefaultStride(IMFMediaType *pType, LONG *plStride) return hr; } - -// Validate that a rectangle meets the following criteria: -// -// - All coordinates are non-negative. -// - The rectangle is not flipped (top > bottom, left > right) -// -// These are the requirements for the destination rectangle. - -bool ValidateRect(const RECT& rc) -{ - if (rc.left < 0 || rc.top < 0) - { - return false; - } - if (rc.left > rc.right || rc.top > rc.bottom) - { - return false; - } - return true; -} diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.def b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.def similarity index 100% rename from samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.def rename to samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.def diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.h b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.h similarity index 95% rename from samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.h rename to samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.h index a1030160bf..118f6e432b 100644 --- a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.h +++ b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.h @@ -18,14 +18,11 @@ #include #include -// Note: The Direct2D helper library is included for its 2D matrix operations. -#include - #include #include #include -#include "GrayscaleTransform.h" +#include "OcvImageManipulations.h" // CLSID of the MFT. DEFINE_GUID(CLSID_GrayscaleMFT, @@ -38,7 +35,7 @@ DEFINE_GUID(CLSID_GrayscaleMFT, // Configuration attributes // {698649BE-8EAE-4551-A4CB-3EC98FBD3D86} -DEFINE_GUID(MFT_IMAGE_EFFECT, +DEFINE_GUID(OCV_IMAGE_EFFECT, 0x698649be, 0x8eae, 0x4551, 0xa4, 0xcb, 0x3e, 0xc9, 0x8f, 0xbd, 0x3d, 0x86); @@ -61,21 +58,21 @@ template void SafeRelease(T **ppT) } } -// CGrayscale class: +// OcvImageManipulations class: // Implements a grayscale video effect. -class CGrayscale +class OcvImageManipulations : public Microsoft::WRL::RuntimeClass< Microsoft::WRL::RuntimeClassFlags< Microsoft::WRL::RuntimeClassType::WinRtClassicComMix >, ABI::Windows::Media::IMediaExtension, IMFTransform > { - InspectableClass(RuntimeClass_GrayscaleTransform_GrayscaleEffect, BaseTrust) + InspectableClass(RuntimeClass_OcvTransform_OcvImageManipulations, BaseTrust) public: - CGrayscale(); + OcvImageManipulations(); - ~CGrayscale(); + ~OcvImageManipulations(); STDMETHOD(RuntimeClassInitialize)(); diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.vcxproj similarity index 96% rename from samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj rename to samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.vcxproj index c7e905936d..fbe768cc93 100644 --- a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/Grayscale.vcxproj +++ b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/OcvTransform.vcxproj @@ -30,8 +30,8 @@ $(VCTargetsPath11) {BA69218F-DA5C-4D14-A78D-21A9E4DEC669} Win32Proj - GrayscaleTransform - GrayscaleTransform + OcvTransform + OcvTransform 11.0 true @@ -129,7 +129,7 @@ Console runtimeobject.lib;%(AdditionalDependencies);mf.lib;mfuuid.lib;mfplat.lib;opencv_core245.lib;opencv_imgproc245.lib false - Grayscale.def + OcvTransform.def $(OPENCV_DIR)\lib;%(AdditionalLibraryDirectories) @@ -153,7 +153,7 @@ Console runtimeobject.lib;%(AdditionalDependencies);mf.lib;mfuuid.lib;mfplat.lib false - Grayscale.def + OcvTransform.def $(OPENCV_DIR)\lib;%(AdditionalLibraryDirectories) @@ -177,7 +177,7 @@ Console runtimeobject.lib;%(AdditionalDependencies);mf.lib;mfuuid.lib;mfplat.lib false - Grayscale.def + OcvTransform.def $(OPENCV_DIR)\lib;%(AdditionalLibraryDirectories) @@ -201,7 +201,7 @@ Console runtimeobject.lib;%(AdditionalDependencies);mf.lib;mfuuid.lib;mfplat.lib false - Grayscale.def + OcvTransform.def $(OPENCV_DIR)\lib;%(AdditionalLibraryDirectories) @@ -225,7 +225,7 @@ Console runtimeobject.lib;%(AdditionalDependencies);mf.lib;mfuuid.lib;mfplat.lib false - Grayscale.def + OcvTransform.def $(OPENCV_DIR)\lib;%(AdditionalLibraryDirectories) @@ -249,7 +249,7 @@ Console runtimeobject.lib;%(AdditionalDependencies);mf.lib;mfuuid.lib;mfplat.lib false - Grayscale.def + OcvTransform.def $(OPENCV_DIR)\lib;%(AdditionalLibraryDirectories) @@ -258,17 +258,17 @@ - + - + - + - + diff --git a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/dllmain.cpp b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/dllmain.cpp similarity index 96% rename from samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/dllmain.cpp rename to samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/dllmain.cpp index ad67670110..d11bceaf07 100644 --- a/samples/winrt/ImageManipulations/C++/MediaExtensions/Grayscale/dllmain.cpp +++ b/samples/winrt/ImageManipulations/C++/MediaExtensions/OcvTransform/dllmain.cpp @@ -12,12 +12,12 @@ ////////////////////////////////////////////////////////////////////////// #include -#include "Grayscale.h" +#include "OcvTransform.h" using namespace Microsoft::WRL; namespace Microsoft { namespace Samples { - ActivatableClass(CGrayscale); + ActivatableClass(OcvImageManipulations); }} BOOL WINAPI DllMain( _In_ HINSTANCE hInstance, _In_ DWORD dwReason, _In_opt_ LPVOID lpReserved ) diff --git a/samples/winrt/ImageManipulations/C++/Package.appxmanifest b/samples/winrt/ImageManipulations/C++/Package.appxmanifest index 5b4bbd2326..9d63dea7cc 100644 --- a/samples/winrt/ImageManipulations/C++/Package.appxmanifest +++ b/samples/winrt/ImageManipulations/C++/Package.appxmanifest @@ -15,8 +15,8 @@ - - + + @@ -28,8 +28,8 @@ - GrayscaleTransform.dll - + OcvTransform.dll + diff --git a/samples/winrt/ImageManipulations/C++/assets/microsoft-sdk.png b/samples/winrt/ImageManipulations/C++/assets/microsoft-sdk.png deleted file mode 100644 index 1a1aec25b67aa1dc55663bdc58da2083107eac0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1583 zcmV+~2GIG5P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGmbN~PnbOGLGA9w%&02y>eSaefwW^{L9 za%BKeVQFr3E>1;MAa*k@H7+-&gq_R)00o~(L_t(oN9~visFhU^$9--EX8GC_#TFqg zGsMa^)1tx*B!f1x#mt4MtcW-#S%BUan9FL&TqXX@G&Z||Ep!@D z+1O23l5Bln^t!^c!t;TdO&cXe2h?ylf!crt^xI$fp@!Vy;*S+hGz@8aWB)@1vTyg~ zg9k;A3j6(FPi%VoQhH%YUEk&vBGx6E9r@~hvn7zcm zKq$ItKZo&^0P6b#)BmWx9|;=%U;$py`oD{Rsn9L-4AS=tCHDNPvE$9*eMR4%_V4T5 zsIi_xM~Tj&eZhNN*g=>sOl>GIn!stK=+{!dmBwb5jNhxV{nPl>qSq0gsl%8llA)>a z^*zWhX^i0e_;;cStn+3?V4gBQdhQgs0lyd@ds~G80!@$W;ShbFc;}1$qz+rM56Lq4 zZ<4T2qk*BD$_m{vyJ`IMl1-6Law?oE-mPg4H(sJx zY@GFWO6#KYHG%w3Iw2+Y5V{K!l5Y0c%TgSjrtfK_XimQK=7voK&G}>N4nQqIDZC{q zT_l>mytaQf)?T3v{;*Hu4qnguZuS$@n05AtLU<{ zk6wHU?4~6LqqoL?G9AnHO;<(1^`-%X*Rm5$V?kPCZ4Ssi0ylwqrwOFCY(tf%GkhbB z4>jFgHHN)@IH^Z38jm3Ni@-R4MN>fug+&ibYRb|AqqwfLsctOSowtkg+LBQi;Ez;t z?_@)+FV*ybyO}l!OkPqMe;=Pyl-Pd%FPh;HZwFPfD z-V)t{ZHeFhZv-ZHQ=Cv7vN&yw)5U3Ak@y7bj>H=$+H*fat8^s#Jwou*NTGPMzd~Vl$Y0Tv~?T3WHpPF3dVVdelQCh9)!ilHE znj`f6Mai1X;V_&P^3;)=OXQKAC-e;Yg-Lc~@cA!CKCsLFaZo}jZ7Ox5iV?v-#(3j{ z$0>7JYRmA%n{G~}2p=cVO5=QrF-~q1`iD;546buZHb~=iP`rKk5BAprL8a-Swyg5+ z717j~a|LPww}cyt(^d+c{Lv}!1m{qJw8mSFhb0G*zfnncPTFfFU}48-jq#YI2J>Dz hxT(Obp8Vf?;4d8suiatp%?AJg002ovPDHLkV1jTD8!rF= diff --git a/samples/winrt/ImageManipulations/C++/assets/opencv-logo-150.png b/samples/winrt/ImageManipulations/C++/assets/opencv-logo-150.png new file mode 100644 index 0000000000000000000000000000000000000000..ea685d651ace9ce7ed2463b84bbff6ea2d891f9c GIT binary patch literal 4609 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 literal 0 HcmV?d00001 diff --git a/samples/winrt/ImageManipulations/C++/assets/opencv-logo-30.png b/samples/winrt/ImageManipulations/C++/assets/opencv-logo-30.png new file mode 100644 index 0000000000000000000000000000000000000000..efaf5468a19d1fd00f0aa95a51b47f849408fbba GIT binary patch literal 1099 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 LTB?Ottseaktfbe2 diff --git a/samples/winrt/ImageManipulations/C++/assets/smallTile-sdk.png b/samples/winrt/ImageManipulations/C++/assets/smallTile-sdk.png deleted file mode 100644 index 5546e8b24a69738114bc17b2b2d493a6872d67ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248 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 diff --git a/samples/winrt/ImageManipulations/C++/assets/tile-sdk.png b/samples/winrt/ImageManipulations/C++/assets/tile-sdk.png deleted file mode 100644 index cdec0dbdccad7ae5dd0e92e3c3015449fffb7450..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2665 zcma)8dpwj`AD^(gN@_z1&pSR_@0Ph|CX;bDv1_Dpuf%xfF$Ocwm>HL$5^q~u7S+3& zTD-Ok5}6Q6nB-Pe79nQGbi)dHH^jK^u&Le8=e6%Xf1Kx>^ZS0kzu!6M_xYW3%GG6$ z)~d~`5D0{plcPNyfmlXV_0O-+RJHCMS4UL8O+p86p&J}1jAZa3gbfo8fB+{Bg9Xtc z22&LF5VAlZ)B(1;x6qsBOa@^NnlX<-M{#&6HUeQ`6~$wKA&?LVfLLrU1vz|IiUin9 z3ewArhNbcBpdhwmG#_${c5w%zLqKyT(#jIBh$5>5IFOJ5L~%m70&)}uxu8o{_2;KC zNMHdX451)@56YY73fRGX2rxrqQ6QFx1&BB_j|#1#k`To7`yryx~)G@H#N6A9)HW;k;^k$|?KuS)BlTqYX-%Ae=h|P1LEg9mWlnv{$CwipSRw5W!7=Gl{Lv|$c&&wI(fkRs zU|z&5m=`hsM?z)(;O1{jWK<1uq7yUx#%3OaYE=>Oc0k_VAnz%Ys)BE!w}l;RWk)8z z(VENsO!gwpvfivAyHe0KY8rXrP=K=c_{hkX#>B^dA*a(?jrF?TX05mq{A2T$rv-;I z$g)GLQthe-50+`?nAorF8~K&f1xcDT?^m3L8awoS^t+|B+_)o2M|S0bvx#3RHK)Q97{jhg}3G8uH@@X&CJqU`E#W{P30#``^{%(OwJD-=-tyauopL0;VGqI3c5q4 zr*$ObhOaD=K;y>j@OB(*Y&F$>fHn1Sym(M#EK#3=slAk%n1|!amZGMfQyrkraP~!> z)-W|mGF&kTS}6x41?jgc3I-VXbg1n0kWp%YDJoLz5y0_884jFCy2t_@V*^{WqK&Vj z#j#K7hFadS*9^0nR!#e8^3SKrl7nC8{Bpi&c{jLWmq)wKWPA5!c}o(GC~7L-m_Cc3yhuqVprfBOTg1$Tmq++%`0NgQG)Qb0okCcS zk9B*@D2`=mr`HE}>8<&1fBcQj`m7M-x`@t+M|s|8?Qg!+3NgcXlQ8jD%v&B1)xof_ zvtup#a{1X2R~F;h=%WFHf!+0#aD@pljC}qB!EZ!qJ$7e9@Zl7H8MCd!Rj(*Pv;3cG z%mXw7edEMLDMZOdby>zc2ah&@JVyxK?m{O#8snd zB#U9q_hK$7E?2vRqqBV^4jt&zytD1ruf;jKdWR&rv&!4_1MZjmDJ7le!AZhu7>vQR ziRvEGNi$i|(y(#Xj$-A#llvm;X70rrh34!dIf$7uw@y^y^HeXtkYnZ^naWn(qCtz- zRfkyezQXmBx(s)(K7(yCY7o(?6Gf}9*p%~{3*O1hsxMwH+d6PUivpeTLWS#Ui1`h) zOGVoG;&%DQ#y)xL)3(9rUc+2ZFQ0p;CVlP^Kc4g1q`SM{{bQW6-Q`7Hn^&lZr_L>t z#!LgqOV2XP*X;0WYFjJkQF7Q(Tf|d!5BC1jHIkC(IW;IO;F=`B;PJKz%Ko~rjCVcv zvZ7<@FI+af-v2L@hhJkH+H-cbpZ4+lUtE7MhDOPlqpA&Q6Tso6^`10k( zB-VRlVRfHXfnwSz-fc%$z3I=vkI#gxDJkFIxg}>XP@`eQuV@r|{P(a>u6% zbshAL;`_fWk*`fVne`@i^!iZ$+wJrA7$N>k51Z_K`RLmbsqYJ5Ae zpDHirz501}!eNS?kO8L1^C!)ktV)`Jj^`)VJh@*TSEK%sN(#lz}UAsoG zRciR3+%kN&g+^=xSy?_x3snMB(~e+cy^QWP;%#Cq>n)f`f3<94`odnN$+D3+?MvMI zW0MyJYI6zx>iRu%7OIN=he92%^@l>eWF=PB=s(r^zbEmR*TvEjf4XsIX4m^8zOJ*{ V^V80WL-UV6CkGe%d|Utc-vFTWTn+#L