Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/samples/wp8/OcvRotatingCube/PhoneXamlDirect3DApp1/PhoneXamlDirect3DApp1Comp/Direct3DInterop.cpp
16354 views
1
#include "pch.h"
2
#include "Direct3DInterop.h"
3
#include "Direct3DContentProvider.h"
4
#include <windows.storage.streams.h>
5
#include <wrl.h>
6
#include <robuffer.h>
7
#include <opencv2\imgproc\types_c.h>
8
9
using namespace Windows::Storage::Streams;
10
using namespace Microsoft::WRL;
11
using namespace Windows::Foundation;
12
using namespace Windows::UI::Core;
13
using namespace Microsoft::WRL;
14
using namespace Windows::Phone::Graphics::Interop;
15
using namespace Windows::Phone::Input::Interop;
16
17
namespace PhoneXamlDirect3DApp1Comp
18
{
19
void Direct3DInterop::ApplyGrayFilter(const cv::Mat& image)
20
{
21
cv::Mat intermediateMat;
22
cv::cvtColor(image, intermediateMat, COLOR_RGBA2GRAY);
23
cv::cvtColor(intermediateMat, image, COLOR_GRAY2BGRA);
24
}
25
26
void Direct3DInterop::ApplyCannyFilter(const cv::Mat& image)
27
{
28
cv::Mat intermediateMat;
29
cv::Canny(image, intermediateMat, 80, 90);
30
cv::cvtColor(intermediateMat, image, COLOR_GRAY2BGRA);
31
}
32
33
void Direct3DInterop::ApplySepiaFilter(const cv::Mat& image)
34
{
35
const float SepiaKernelData[16] =
36
{
37
/* B */0.131f, 0.534f, 0.272f, 0.f,
38
/* G */0.168f, 0.686f, 0.349f, 0.f,
39
/* R */0.189f, 0.769f, 0.393f, 0.f,
40
/* A */0.000f, 0.000f, 0.000f, 1.f
41
};
42
43
const cv::Mat SepiaKernel(4, 4, CV_32FC1, (void*)SepiaKernelData);
44
cv::transform(image, image, SepiaKernel);
45
}
46
47
Direct3DInterop::Direct3DInterop() :
48
m_timer(ref new BasicTimer())
49
{
50
}
51
52
IDrawingSurfaceContentProvider^ Direct3DInterop::CreateContentProvider()
53
{
54
ComPtr<Direct3DContentProvider> provider = Make<Direct3DContentProvider>(this);
55
return reinterpret_cast<IDrawingSurfaceContentProvider^>(provider.Detach());
56
}
57
58
// IDrawingSurfaceManipulationHandler
59
void Direct3DInterop::SetManipulationHost(DrawingSurfaceManipulationHost^ manipulationHost)
60
{
61
manipulationHost->PointerPressed +=
62
ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerPressed);
63
64
manipulationHost->PointerMoved +=
65
ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerMoved);
66
67
manipulationHost->PointerReleased +=
68
ref new TypedEventHandler<DrawingSurfaceManipulationHost^, PointerEventArgs^>(this, &Direct3DInterop::OnPointerReleased);
69
}
70
71
void Direct3DInterop::RenderResolution::set(Windows::Foundation::Size renderResolution)
72
{
73
if (renderResolution.Width != m_renderResolution.Width ||
74
renderResolution.Height != m_renderResolution.Height)
75
{
76
m_renderResolution = renderResolution;
77
78
if (m_renderer)
79
{
80
m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
81
RecreateSynchronizedTexture();
82
}
83
}
84
}
85
86
// Event Handlers
87
88
void Direct3DInterop::OnPointerPressed(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
89
{
90
// Insert your code here.
91
}
92
93
void Direct3DInterop::OnPointerMoved(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
94
{
95
// Insert your code here.
96
}
97
98
void Direct3DInterop::OnPointerReleased(DrawingSurfaceManipulationHost^ sender, PointerEventArgs^ args)
99
{
100
// Insert your code here.
101
}
102
103
// Interface With Direct3DContentProvider
104
HRESULT Direct3DInterop::Connect(_In_ IDrawingSurfaceRuntimeHostNative* host)
105
{
106
m_renderer = ref new CubeRenderer();
107
m_renderer->Initialize();
108
m_renderer->UpdateForWindowSizeChange(WindowBounds.Width, WindowBounds.Height);
109
m_renderer->UpdateForRenderResolutionChange(m_renderResolution.Width, m_renderResolution.Height);
110
111
// Restart timer after renderer has finished initializing.
112
m_timer->Reset();
113
114
return S_OK;
115
}
116
117
void Direct3DInterop::Disconnect()
118
{
119
m_renderer = nullptr;
120
}
121
122
HRESULT Direct3DInterop::PrepareResources(_In_ const LARGE_INTEGER* presentTargetTime, _Out_ BOOL* contentDirty)
123
{
124
*contentDirty = true;
125
126
return S_OK;
127
}
128
129
HRESULT Direct3DInterop::GetTexture(_In_ const DrawingSurfaceSizeF* size, _Out_ IDrawingSurfaceSynchronizedTextureNative** synchronizedTexture, _Out_ DrawingSurfaceRectF* textureSubRectangle)
130
{
131
m_timer->Update();
132
m_renderer->Update(m_timer->Total, m_timer->Delta);
133
m_renderer->Render();
134
135
RequestAdditionalFrame();
136
137
return S_OK;
138
}
139
140
ID3D11Texture2D* Direct3DInterop::GetTexture()
141
{
142
return m_renderer->GetTexture();
143
}
144
145
void Direct3DInterop::CreateTexture(const Platform::Array<int>^ buffer,int width,int height, OCVFilterType filter)
146
{
147
if (m_renderer)
148
{
149
cv::Mat Lena = cv::Mat(height, width, CV_8UC4);
150
memcpy(Lena.data, buffer->Data, 4 * height*width);
151
152
switch (filter)
153
{
154
case OCVFilterType::ePreview:
155
break;
156
157
case OCVFilterType::eGray:
158
ApplyGrayFilter(Lena);
159
break;
160
161
case OCVFilterType::eCanny:
162
ApplyCannyFilter(Lena);
163
break;
164
165
case OCVFilterType::eSepia:
166
ApplySepiaFilter(Lena);
167
break;
168
}
169
170
m_renderer->CreateTextureFromByte(Lena.data, width, height);
171
}
172
}
173
174
byte* GetPointerToPixelData( Windows::Storage::Streams::IBuffer ^ pixelBuffer)
175
{
176
// Query the IBufferByteAccess interface.
177
ComPtr<IBufferByteAccess> bufferByteAccess;
178
reinterpret_cast<IInspectable*>( pixelBuffer)->QueryInterface(IID_PPV_ARGS(&bufferByteAccess));
179
180
// Retrieve the buffer data.
181
byte* pixels = nullptr;
182
bufferByteAccess->Buffer(&pixels);
183
return pixels;
184
}
185
186
}
187
188