Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
O
opencv
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
opencv
Commits
b33cb2e3
Commit
b33cb2e3
authored
Aug 25, 2018
by
Suleyman TURKMEN
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update samples
parent
f9c8bb40
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
174 additions
and
304 deletions
+174
-304
d3d10_interop.cpp
samples/directx/d3d10_interop.cpp
+35
-37
d3d11_interop.cpp
samples/directx/d3d11_interop.cpp
+31
-33
d3d9_interop.cpp
samples/directx/d3d9_interop.cpp
+26
-29
d3d9ex_interop.cpp
samples/directx/d3d9ex_interop.cpp
+26
-29
d3dsample.hpp
samples/directx/d3dsample.hpp
+19
-72
opengl_interop.cpp
samples/opengl/opengl_interop.cpp
+36
-55
winapp.hpp
samples/opengl/winapp.hpp
+1
-49
No files found.
samples/directx/d3d10_interop.cpp
View file @
b33cb2e3
/*
// Sample demonstrating interoperability of OpenCV UMat with Direct X surface
// At first, the data obtained from video file or camera and
// placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV UMat and call cv::Blur
// function. The result is mapped back to Direct X surface and rendered through
// Direct X API.
// A sample program demonstrating interoperability of OpenCV cv::UMat with Direct X surface
// At first, the data obtained from video file or camera and placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV cv::UMat and call cv::Blur function.
// The result is mapped back to Direct X surface and rendered through Direct X API.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <d3d10.h>
...
...
@@ -20,10 +19,6 @@
#pragma comment (lib, "d3d10.lib")
using
namespace
std
;
using
namespace
cv
;
class
D3D10WinApp
:
public
D3DSample
{
public
:
...
...
@@ -67,19 +62,19 @@ public:
&
m_pD3D10Dev
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
r
=
m_pD3D10SwapChain
->
GetBuffer
(
0
,
__uuidof
(
ID3D10Texture2D
),
(
LPVOID
*
)
&
m_pBackBuffer
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
r
=
m_pD3D10Dev
->
CreateRenderTargetView
(
m_pBackBuffer
,
NULL
,
&
m_pRenderTarget
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
m_pD3D10Dev
->
OMSetRenderTargets
(
1
,
&
m_pRenderTarget
,
NULL
);
...
...
@@ -110,7 +105,7 @@ public:
if
(
FAILED
(
r
))
{
std
::
cerr
<<
"Can't create texture with input image"
<<
std
::
endl
;
return
-
1
;
return
EXIT_FAILURE
;
}
// initialize OpenCL context of OpenCV lib from DirectX
...
...
@@ -123,7 +118,7 @@ public:
cv
::
ocl
::
Context
::
getDefault
().
device
(
0
).
name
()
:
"No OpenCL device"
;
return
0
;
return
EXIT_SUCCESS
;
}
// create()
...
...
@@ -133,9 +128,9 @@ public:
HRESULT
r
;
if
(
!
m_cap
.
read
(
m_frame_bgr
))
return
-
1
;
return
EXIT_FAILURE
;
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
COLOR_BGR2RGBA
);
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
cv
::
COLOR_BGR2RGBA
);
UINT
subResource
=
::
D3D10CalcSubresource
(
0
,
0
,
1
);
...
...
@@ -154,7 +149,7 @@ public:
*
ppSurface
=
m_pSurface
;
return
0
;
return
EXIT_SUCCESS
;
}
// get_surface()
...
...
@@ -164,7 +159,7 @@ public:
try
{
if
(
m_shutdown
)
return
0
;
return
EXIT_SUCCESS
;
// capture user input once
MODE
mode
=
(
m_mode
==
MODE_GPU_NV12
)
?
MODE_GPU_RGBA
:
m_mode
;
...
...
@@ -175,9 +170,10 @@ public:
r
=
get_surface
(
&
pSurface
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
m_timer
.
reset
();
m_timer
.
start
();
switch
(
mode
)
...
...
@@ -199,18 +195,20 @@ public:
if
(
m_demo_processing
)
{
// blur D3D10 surface with OpenCV on CPU
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
));
}
m_timer
.
stop
();
cv
::
String
strMode
=
cv
::
format
(
"mode: %s"
,
m_modeStr
[
MODE_CPU
].
c_str
());
cv
::
String
strProcessing
=
m_demo_processing
?
"blur frame"
:
"copy frame"
;
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
1f msec"
,
m_timer
.
time
(
Timer
::
UNITS
::
MSEC
));
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
3f msec"
,
m_timer
.
getTimeMilli
(
));
cv
::
String
strDevName
=
cv
::
format
(
"OpenCL device: %s"
,
m_oclDevName
.
c_str
());
cv
::
putText
(
m
,
strMode
,
cv
::
Point
(
0
,
16
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strProcessing
,
cv
::
Point
(
0
,
32
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strTime
,
cv
::
Point
(
0
,
48
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strDevName
,
cv
::
Point
(
0
,
64
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strMode
,
cv
::
Point
(
0
,
20
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
m
,
strProcessing
,
cv
::
Point
(
0
,
40
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
m
,
strTime
,
cv
::
Point
(
0
,
60
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
m
,
strDevName
,
cv
::
Point
(
0
,
80
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
pSurface
->
Unmap
(
subResource
);
...
...
@@ -227,18 +225,20 @@ public:
if
(
m_demo_processing
)
{
// blur D3D10 surface with OpenCV on GPU with OpenCL
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
));
}
m_timer
.
stop
();
cv
::
String
strMode
=
cv
::
format
(
"mode: %s"
,
m_modeStr
[
MODE_GPU_RGBA
].
c_str
());
cv
::
String
strProcessing
=
m_demo_processing
?
"blur frame"
:
"copy frame"
;
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
1f msec"
,
m_timer
.
time
(
Timer
::
UNITS
::
MSEC
));
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
3f msec"
,
m_timer
.
getTimeMilli
(
));
cv
::
String
strDevName
=
cv
::
format
(
"OpenCL device: %s"
,
m_oclDevName
.
c_str
());
cv
::
putText
(
u
,
strMode
,
cv
::
Point
(
0
,
16
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strProcessing
,
cv
::
Point
(
0
,
32
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strTime
,
cv
::
Point
(
0
,
48
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strDevName
,
cv
::
Point
(
0
,
64
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strMode
,
cv
::
Point
(
0
,
20
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
u
,
strProcessing
,
cv
::
Point
(
0
,
40
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
u
,
strTime
,
cv
::
Point
(
0
,
60
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
u
,
strDevName
,
cv
::
Point
(
0
,
80
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
directx
::
convertToD3D10Texture2D
(
u
,
pSurface
);
...
...
@@ -247,8 +247,6 @@ public:
}
// switch
m_timer
.
stop
();
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
m_pD3D10Dev
->
CopyResource
(
m_pBackBuffer
,
pSurface
);
...
...
@@ -258,7 +256,7 @@ public:
r
=
m_pD3D10SwapChain
->
Present
(
0
,
0
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
}
// try
...
...
@@ -268,7 +266,7 @@ public:
return
10
;
}
return
0
;
return
EXIT_SUCCESS
;
}
// render()
...
...
@@ -280,7 +278,7 @@ public:
SAFE_RELEASE
(
m_pRenderTarget
);
SAFE_RELEASE
(
m_pD3D10Dev
);
D3DSample
::
cleanup
();
return
0
;
return
EXIT_SUCCESS
;
}
// cleanup()
private
:
...
...
samples/directx/d3d11_interop.cpp
View file @
b33cb2e3
/*
// Sample demonstrating interoperability of OpenCV UMat with Direct X surface
// At first, the data obtained from video file or camera and
// placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV UMat and call cv::Blur
// function. The result is mapped back to Direct X surface and rendered through
// Direct X API.
// A sample program demonstrating interoperability of OpenCV cv::UMat with Direct X surface
// At first, the data obtained from video file or camera and placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV cv::UMat and call cv::Blur function.
// The result is mapped back to Direct X surface and rendered through Direct X API.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <d3d11.h>
...
...
@@ -20,10 +19,6 @@
#pragma comment (lib, "d3d11.lib")
using
namespace
std
;
using
namespace
cv
;
class
D3D11WinApp
:
public
D3DSample
{
public
:
...
...
@@ -188,7 +183,7 @@ public:
cv
::
ocl
::
Context
::
getDefault
().
device
(
0
).
name
()
:
"No OpenCL device"
;
return
0
;
return
EXIT_SUCCESS
;
}
// create()
...
...
@@ -198,11 +193,11 @@ public:
HRESULT
r
;
if
(
!
m_cap
.
read
(
m_frame_bgr
))
return
-
1
;
return
EXIT_FAILURE
;
if
(
use_nv12
)
{
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_i420
,
COLOR_BGR2YUV_I420
);
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_i420
,
cv
::
COLOR_BGR2YUV_I420
);
convert_I420_to_NV12
(
m_frame_i420
,
m_frame_nv12
,
m_width
,
m_height
);
...
...
@@ -210,7 +205,7 @@ public:
}
else
{
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
COLOR_BGR2RGBA
);
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
cv
::
COLOR_BGR2RGBA
);
// process video frame on CPU
UINT
subResource
=
::
D3D11CalcSubresource
(
0
,
0
,
1
);
...
...
@@ -230,7 +225,7 @@ public:
*
ppSurface
=
use_nv12
?
m_pSurfaceNV12
:
m_pSurfaceRGBA
;
return
0
;
return
EXIT_SUCCESS
;
}
// get_surface()
...
...
@@ -240,7 +235,7 @@ public:
try
{
if
(
m_shutdown
)
return
0
;
return
EXIT_SUCCESS
;
// capture user input once
MODE
mode
=
(
m_mode
==
MODE_GPU_NV12
&&
!
m_nv12_available
)
?
MODE_GPU_RGBA
:
m_mode
;
...
...
@@ -254,6 +249,7 @@ public:
throw
std
::
runtime_error
(
"get_surface() failed!"
);
}
m_timer
.
reset
();
m_timer
.
start
();
switch
(
mode
)
...
...
@@ -275,18 +271,20 @@ public:
if
(
m_demo_processing
)
{
// blur data from D3D11 surface with OpenCV on CPU
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
));
}
m_timer
.
stop
();
cv
::
String
strMode
=
cv
::
format
(
"mode: %s"
,
m_modeStr
[
MODE_CPU
].
c_str
());
cv
::
String
strProcessing
=
m_demo_processing
?
"blur frame"
:
"copy frame"
;
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
1f msec"
,
m_timer
.
time
(
Timer
::
UNITS
::
MSEC
));
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
3f msec"
,
m_timer
.
getTimeMilli
(
));
cv
::
String
strDevName
=
cv
::
format
(
"OpenCL device: %s"
,
m_oclDevName
.
c_str
());
cv
::
putText
(
m
,
strMode
,
cv
::
Point
(
0
,
16
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strProcessing
,
cv
::
Point
(
0
,
32
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strTime
,
cv
::
Point
(
0
,
48
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strDevName
,
cv
::
Point
(
0
,
64
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
m
,
strMode
,
cv
::
Point
(
0
,
20
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
m
,
strProcessing
,
cv
::
Point
(
0
,
40
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
m
,
strTime
,
cv
::
Point
(
0
,
60
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
m
,
strDevName
,
cv
::
Point
(
0
,
80
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
m_pD3D11Ctx
->
Unmap
(
pSurface
,
subResource
);
...
...
@@ -304,18 +302,20 @@ public:
if
(
m_demo_processing
)
{
// blur data from D3D11 surface with OpenCV on GPU with OpenCL
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
));
}
m_timer
.
stop
();
cv
::
String
strMode
=
cv
::
format
(
"mode: %s"
,
m_modeStr
[
mode
].
c_str
());
cv
::
String
strProcessing
=
m_demo_processing
?
"blur frame"
:
"copy frame"
;
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
1f msec"
,
m_timer
.
time
(
Timer
::
UNITS
::
MSEC
));
cv
::
String
strTime
=
cv
::
format
(
"time: %4.
3f msec"
,
m_timer
.
getTimeMilli
(
));
cv
::
String
strDevName
=
cv
::
format
(
"OpenCL device: %s"
,
m_oclDevName
.
c_str
());
cv
::
putText
(
u
,
strMode
,
cv
::
Point
(
0
,
16
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strProcessing
,
cv
::
Point
(
0
,
32
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strTime
,
cv
::
Point
(
0
,
48
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strDevName
,
cv
::
Point
(
0
,
64
),
1
,
0.8
,
cv
::
Scalar
(
0
,
0
,
0
)
);
cv
::
putText
(
u
,
strMode
,
cv
::
Point
(
0
,
20
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
u
,
strProcessing
,
cv
::
Point
(
0
,
40
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
u
,
strTime
,
cv
::
Point
(
0
,
60
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
putText
(
u
,
strDevName
,
cv
::
Point
(
0
,
80
),
cv
::
FONT_HERSHEY_SIMPLEX
,
0.8
,
cv
::
Scalar
(
0
,
0
,
200
),
2
);
cv
::
directx
::
convertToD3D11Texture2D
(
u
,
pSurface
);
...
...
@@ -336,7 +336,7 @@ public:
}
cv
::
Mat
frame_nv12
(
m_height
+
(
m_height
/
2
),
m_width
,
CV_8UC1
,
mappedTex
.
pData
,
mappedTex
.
RowPitch
);
cv
::
cvtColor
(
frame_nv12
,
m_frame_rgba
,
COLOR_YUV2RGBA_NV12
);
cv
::
cvtColor
(
frame_nv12
,
m_frame_rgba
,
cv
::
COLOR_YUV2RGBA_NV12
);
m_pD3D11Ctx
->
Unmap
(
m_pSurfaceNV12_cpu_copy
,
subResource
);
}
...
...
@@ -365,8 +365,6 @@ public:
}
// switch
m_timer
.
stop
();
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
m_pD3D11Ctx
->
CopyResource
(
m_pBackBuffer
,
pSurface
);
...
...
@@ -394,7 +392,7 @@ public:
return
11
;
}
return
0
;
return
EXIT_SUCCESS
;
}
// render()
...
...
@@ -409,7 +407,7 @@ public:
SAFE_RELEASE
(
m_pD3D11Dev
);
SAFE_RELEASE
(
m_pD3D11Ctx
);
D3DSample
::
cleanup
();
return
0
;
return
EXIT_SUCCESS
;
}
// cleanup()
protected
:
...
...
samples/directx/d3d9_interop.cpp
View file @
b33cb2e3
/*
// Sample demonstrating interoperability of OpenCV UMat with Direct X surface
// At first, the data obtained from video file or camera and
// placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV UMat and call cv::Blur
// function. The result is mapped back to Direct X surface and rendered through
// Direct X API.
// A sample program demonstrating interoperability of OpenCV cv::UMat with Direct X surface
// At first, the data obtained from video file or camera and placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV cv::UMat and call cv::Blur function.
// The result is mapped back to Direct X surface and rendered through Direct X API.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <d3d9.h>
...
...
@@ -21,9 +20,6 @@
#pragma comment (lib, "d3d9.lib")
using
namespace
std
;
using
namespace
cv
;
class
D3D9WinApp
:
public
D3DSample
{
public
:
...
...
@@ -43,7 +39,7 @@ public:
m_pD3D9
=
::
Direct3DCreate9
(
D3D_SDK_VERSION
);
if
(
NULL
==
m_pD3D9
)
{
return
-
1
;
return
EXIT_FAILURE
;
}
DWORD
flags
=
D3DCREATE_HARDWARE_VERTEXPROCESSING
|
...
...
@@ -70,20 +66,20 @@ public:
r
=
m_pD3D9
->
CreateDevice
(
D3DADAPTER_DEFAULT
,
D3DDEVTYPE_HAL
,
m_hWnd
,
flags
,
&
d3dpp
,
&
m_pD3D9Dev
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
r
=
m_pD3D9Dev
->
GetBackBuffer
(
0
,
0
,
D3DBACKBUFFER_TYPE_MONO
,
&
m_pBackBuffer
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
r
=
m_pD3D9Dev
->
CreateOffscreenPlainSurface
(
m_width
,
m_height
,
D3DFMT_A8R8G8B8
,
D3DPOOL_DEFAULT
,
&
m_pSurface
,
NULL
);
if
(
FAILED
(
r
))
{
std
::
cerr
<<
"Can't create surface for result"
<<
std
::
endl
;
return
-
1
;
return
EXIT_FAILURE
;
}
// initialize OpenCL context of OpenCV lib from DirectX
...
...
@@ -96,7 +92,7 @@ public:
cv
::
ocl
::
Context
::
getDefault
().
device
(
0
).
name
()
:
"No OpenCL device"
;
return
0
;
return
EXIT_SUCCESS
;
}
// create()
...
...
@@ -106,9 +102,9 @@ public:
HRESULT
r
;
if
(
!
m_cap
.
read
(
m_frame_bgr
))
return
-
1
;
return
EXIT_FAILURE
;
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
COLOR_BGR2BGRA
);
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
cv
::
COLOR_BGR2BGRA
);
D3DLOCKED_RECT
memDesc
=
{
0
,
NULL
};
RECT
rc
=
{
0
,
0
,
m_width
,
m_height
};
...
...
@@ -131,7 +127,7 @@ public:
*
ppSurface
=
m_pSurface
;
return
0
;
return
EXIT_SUCCESS
;
}
// get_surface()
...
...
@@ -141,7 +137,7 @@ public:
try
{
if
(
m_shutdown
)
return
0
;
return
EXIT_SUCCESS
;
// capture user input once
MODE
mode
=
(
m_mode
==
MODE_GPU_NV12
)
?
MODE_GPU_RGBA
:
m_mode
;
...
...
@@ -152,9 +148,10 @@ public:
r
=
get_surface
(
&
pSurface
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
m_timer
.
reset
();
m_timer
.
start
();
switch
(
mode
)
...
...
@@ -168,7 +165,7 @@ public:
r
=
pSurface
->
LockRect
(
&
memDesc
,
&
rc
,
0
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
cv
::
Mat
m
(
m_height
,
m_width
,
CV_8UC4
,
memDesc
.
pBits
,
memDesc
.
Pitch
);
...
...
@@ -176,13 +173,13 @@ public:
if
(
m_demo_processing
)
{
// blur D3D9 surface with OpenCV on CPU
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
));
}
r
=
pSurface
->
UnlockRect
();
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
break
;
...
...
@@ -198,7 +195,7 @@ public:
if
(
m_demo_processing
)
{
// blur D3D9 surface with OpenCV on GPU with OpenCL
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
));
}
cv
::
directx
::
convertToDirect3DSurface9
(
u
,
pSurface
);
...
...
@@ -210,21 +207,21 @@ public:
m_timer
.
stop
();
print_info
(
pSurface
,
mode
,
m_timer
.
time
(
Timer
::
UNITS
::
MSEC
),
m_oclDevName
);
print_info
(
pSurface
,
mode
,
m_timer
.
getTimeMilli
(
),
m_oclDevName
);
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
r
=
m_pD3D9Dev
->
StretchRect
(
pSurface
,
NULL
,
m_pBackBuffer
,
NULL
,
D3DTEXF_NONE
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
// present the back buffer contents to the display
r
=
m_pD3D9Dev
->
Present
(
NULL
,
NULL
,
NULL
,
NULL
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
}
// try
...
...
@@ -234,11 +231,11 @@ public:
return
10
;
}
return
0
;
return
EXIT_SUCCESS
;
}
// render()
void
print_info
(
LPDIRECT3DSURFACE9
pSurface
,
int
mode
,
float
time
,
cv
::
String
oclDevName
)
void
print_info
(
LPDIRECT3DSURFACE9
pSurface
,
int
mode
,
double
time
,
cv
::
String
oclDevName
)
{
HDC
hDC
;
...
...
@@ -295,7 +292,7 @@ public:
SAFE_RELEASE
(
m_pD3D9Dev
);
SAFE_RELEASE
(
m_pD3D9
);
D3DSample
::
cleanup
();
return
0
;
return
EXIT_SUCCESS
;
}
// cleanup()
private
:
...
...
samples/directx/d3d9ex_interop.cpp
View file @
b33cb2e3
/*
// Sample demonstrating interoperability of OpenCV UMat with Direct X surface
// At first, the data obtained from video file or camera and
// placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV UMat and call cv::Blur
// function. The result is mapped back to Direct X surface and rendered through
// Direct X API.
// A sample program demonstrating interoperability of OpenCV cv::UMat with Direct X surface
// At first, the data obtained from video file or camera and placed onto Direct X surface,
// following mapping of this Direct X surface to OpenCV cv::UMat and call cv::Blur function.
// The result is mapped back to Direct X surface and rendered through Direct X API.
*/
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <d3d9.h>
...
...
@@ -21,9 +20,6 @@
#pragma comment (lib, "d3d9.lib")
using
namespace
std
;
using
namespace
cv
;
class
D3D9ExWinApp
:
public
D3DSample
{
public
:
...
...
@@ -43,7 +39,7 @@ public:
r
=
::
Direct3DCreate9Ex
(
D3D_SDK_VERSION
,
&
m_pD3D9Ex
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
DWORD
flags
=
D3DCREATE_HARDWARE_VERTEXPROCESSING
|
...
...
@@ -70,20 +66,20 @@ public:
r
=
m_pD3D9Ex
->
CreateDeviceEx
(
D3DADAPTER_DEFAULT
,
D3DDEVTYPE_HAL
,
m_hWnd
,
flags
,
&
d3dpp
,
NULL
,
&
m_pD3D9DevEx
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
r
=
m_pD3D9DevEx
->
GetBackBuffer
(
0
,
0
,
D3DBACKBUFFER_TYPE_MONO
,
&
m_pBackBuffer
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
r
=
m_pD3D9DevEx
->
CreateOffscreenPlainSurface
(
m_width
,
m_height
,
D3DFMT_A8R8G8B8
,
D3DPOOL_DEFAULT
,
&
m_pSurface
,
NULL
);
if
(
FAILED
(
r
))
{
std
::
cerr
<<
"Can't create surface for result"
<<
std
::
endl
;
return
-
1
;
return
EXIT_FAILURE
;
}
// initialize OpenCL context of OpenCV lib from DirectX
...
...
@@ -96,7 +92,7 @@ public:
cv
::
ocl
::
Context
::
getDefault
().
device
(
0
).
name
()
:
"No OpenCL device"
;
return
0
;
return
EXIT_SUCCESS
;
}
// create()
...
...
@@ -106,9 +102,9 @@ public:
HRESULT
r
;
if
(
!
m_cap
.
read
(
m_frame_bgr
))
return
-
1
;
return
EXIT_FAILURE
;
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
COLOR_BGR2BGRA
);
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
cv
::
COLOR_BGR2BGRA
);
D3DLOCKED_RECT
memDesc
=
{
0
,
NULL
};
RECT
rc
=
{
0
,
0
,
m_width
,
m_height
};
...
...
@@ -131,7 +127,7 @@ public:
*
ppSurface
=
m_pSurface
;
return
0
;
return
EXIT_SUCCESS
;
}
// get_surface()
...
...
@@ -141,7 +137,7 @@ public:
try
{
if
(
m_shutdown
)
return
0
;
return
EXIT_SUCCESS
;
// capture user input once
MODE
mode
=
m_mode
==
MODE_GPU_NV12
?
MODE_GPU_RGBA
:
m_mode
;
...
...
@@ -152,9 +148,10 @@ public:
r
=
get_surface
(
&
pSurface
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
m_timer
.
reset
();
m_timer
.
start
();
switch
(
mode
)
...
...
@@ -168,7 +165,7 @@ public:
r
=
pSurface
->
LockRect
(
&
memDesc
,
&
rc
,
0
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
cv
::
Mat
m
(
m_height
,
m_width
,
CV_8UC4
,
memDesc
.
pBits
,
memDesc
.
Pitch
);
...
...
@@ -176,13 +173,13 @@ public:
if
(
m_demo_processing
)
{
// blur D3D9 surface with OpenCV on CPU
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
m
,
m
,
cv
::
Size
(
15
,
15
));
}
r
=
pSurface
->
UnlockRect
();
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
break
;
...
...
@@ -198,7 +195,7 @@ public:
if
(
m_demo_processing
)
{
// blur D3D9 surface with OpenCV on GPU with OpenCL
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
)
,
cv
::
Point
(
-
7
,
-
7
)
);
cv
::
blur
(
u
,
u
,
cv
::
Size
(
15
,
15
));
}
cv
::
directx
::
convertToDirect3DSurface9
(
u
,
pSurface
);
...
...
@@ -210,21 +207,21 @@ public:
m_timer
.
stop
();
print_info
(
pSurface
,
m_mode
,
m_timer
.
time
(
Timer
::
UNITS
::
MSEC
),
m_oclDevName
);
print_info
(
pSurface
,
m_mode
,
m_timer
.
getTimeMilli
(
),
m_oclDevName
);
// traditional DX render pipeline:
// BitBlt surface to backBuffer and flip backBuffer to frontBuffer
r
=
m_pD3D9DevEx
->
StretchRect
(
pSurface
,
NULL
,
m_pBackBuffer
,
NULL
,
D3DTEXF_NONE
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
// present the back buffer contents to the display
r
=
m_pD3D9DevEx
->
Present
(
NULL
,
NULL
,
NULL
,
NULL
);
if
(
FAILED
(
r
))
{
return
-
1
;
return
EXIT_FAILURE
;
}
}
// try
...
...
@@ -235,11 +232,11 @@ public:
return
10
;
}
return
0
;
return
EXIT_SUCCESS
;
}
// render()
void
print_info
(
LPDIRECT3DSURFACE9
pSurface
,
int
mode
,
float
time
,
cv
::
String
oclDevName
)
void
print_info
(
LPDIRECT3DSURFACE9
pSurface
,
int
mode
,
double
time
,
cv
::
String
oclDevName
)
{
HDC
hDC
;
...
...
@@ -296,7 +293,7 @@ public:
SAFE_RELEASE
(
m_pD3D9DevEx
);
SAFE_RELEASE
(
m_pD3D9Ex
);
D3DSample
::
cleanup
();
return
0
;
return
EXIT_SUCCESS
;
}
// cleanup()
private
:
...
...
samples/directx/d3dsample.hpp
View file @
b33cb2e3
...
...
@@ -17,50 +17,6 @@
#define SAFE_RELEASE(p) if (p) { p->Release(); p = NULL; }
class
Timer
{
public
:
enum
UNITS
{
USEC
=
0
,
MSEC
,
SEC
};
Timer
()
:
m_t0
(
0
),
m_diff
(
0
)
{
m_tick_frequency
=
(
float
)
cv
::
getTickFrequency
();
m_unit_mul
[
USEC
]
=
1000000
;
m_unit_mul
[
MSEC
]
=
1000
;
m_unit_mul
[
SEC
]
=
1
;
}
void
start
()
{
m_t0
=
cv
::
getTickCount
();
}
void
stop
()
{
m_diff
=
cv
::
getTickCount
()
-
m_t0
;
}
float
time
(
UNITS
u
=
UNITS
::
MSEC
)
{
float
sec
=
m_diff
/
m_tick_frequency
;
return
sec
*
m_unit_mul
[
u
];
}
public
:
float
m_tick_frequency
;
int64
m_t0
;
int64
m_diff
;
int
m_unit_mul
[
3
];
};
class
D3DSample
:
public
WinApp
{
public
:
...
...
@@ -102,22 +58,22 @@ protected:
if
(
wParam
==
'1'
)
{
m_mode
=
MODE_CPU
;
return
0
;
return
EXIT_SUCCESS
;
}
if
(
wParam
==
'2'
)
{
m_mode
=
MODE_GPU_RGBA
;
return
0
;
return
EXIT_SUCCESS
;
}
if
(
wParam
==
'3'
)
{
m_mode
=
MODE_GPU_NV12
;
return
0
;
return
EXIT_SUCCESS
;
}
else
if
(
wParam
==
VK_SPACE
)
{
m_demo_processing
=
!
m_demo_processing
;
return
0
;
return
EXIT_SUCCESS
;
}
else
if
(
wParam
==
VK_ESCAPE
)
{
...
...
@@ -130,7 +86,7 @@ protected:
case
WM_DESTROY
:
::
PostQuitMessage
(
0
);
return
0
;
return
EXIT_SUCCESS
;
}
return
::
DefWindowProc
(
hWnd
,
message
,
wParam
,
lParam
);
...
...
@@ -147,28 +103,14 @@ protected:
cv
::
VideoCapture
m_cap
;
cv
::
Mat
m_frame_bgr
;
cv
::
Mat
m_frame_rgba
;
Timer
m_timer
;
cv
::
TickMeter
m_timer
;
};
static
void
help
()
{
printf
(
"
\n
Sample demonstrating interoperability of DirectX and OpenCL with OpenCV.
\n
"
"Hot keys:
\n
"
" SPACE - turn processing on/off
\n
"
" 1 - process DX surface through OpenCV on CPU
\n
"
" 2 - process DX RGBA surface through OpenCV on GPU (via OpenCL)
\n
"
" 3 - process DX NV12 surface through OpenCV on GPU (via OpenCL)
\n
"
" ESC - exit
\n\n
"
);
}
static
const
char
*
keys
=
{
"{c camera |
true | use camera or not
}"
"{c camera |
0 | camera id
}"
"{f file | | movie file name }"
"{h help | | print help info }"
};
...
...
@@ -177,25 +119,30 @@ int d3d_app(int argc, char** argv, std::string& title)
{
cv
::
CommandLineParser
parser
(
argc
,
argv
,
keys
);
std
::
string
file
=
parser
.
get
<
std
::
string
>
(
"file"
);
bool
useCamera
=
parser
.
has
(
"camera"
);
bool
showHelp
=
parser
.
has
(
"help"
);
int
camera_id
=
parser
.
get
<
int
>
(
"camera"
);
if
(
showHelp
)
help
();
parser
.
about
(
"
\n
A sample program demonstrating interoperability of DirectX and OpenCL with OpenCV.
\n\n
"
"Hot keys:
\n
"
" SPACE - turn processing on/off
\n
"
" 1 - process DX surface through OpenCV on CPU
\n
"
" 2 - process DX RGBA surface through OpenCV on GPU (via OpenCL)
\n
"
" 3 - process DX NV12 surface through OpenCV on GPU (via OpenCL)
\n
"
" ESC - exit
\n\n
"
);
parser
.
printMessage
();
cv
::
VideoCapture
cap
;
if
(
useCamera
)
cap
.
open
(
0
);
if
(
file
.
empty
()
)
cap
.
open
(
camera_id
);
else
cap
.
open
(
file
.
c_str
());
if
(
!
cap
.
isOpened
())
{
printf
(
"can not open camera or video file
\n
"
);
return
-
1
;
return
EXIT_FAILURE
;
}
int
width
=
(
int
)
cap
.
get
(
cv
::
CAP_PROP_FRAME_WIDTH
);
...
...
samples/opengl/opengl_interop.cpp
View file @
b33cb2e3
...
...
@@ -32,16 +32,6 @@
# pragma comment(lib, "glu32.lib")
#endif
using
namespace
cv
;
/*
// Press key to
// 1 processing on CPU
// 2 processing on GPU
// 9 toggle texture/buffer
// space toggle processing on/off, preserve mode
// esc quit
*/
class
GLWinApp
:
public
WinApp
{
...
...
@@ -85,37 +75,37 @@ public:
if
(
wParam
==
'1'
)
{
set_mode
(
MODE_CPU
);
return
0
;
return
EXIT_SUCCESS
;
}
if
(
wParam
==
'2'
)
{
set_mode
(
MODE_GPU
);
return
0
;
return
EXIT_SUCCESS
;
}
else
if
(
wParam
==
'9'
)
{
toggle_buffer
();
return
0
;
return
EXIT_SUCCESS
;
}
else
if
(
wParam
==
VK_SPACE
)
{
m_demo_processing
=
!
m_demo_processing
;
return
0
;
return
EXIT_SUCCESS
;
}
else
if
(
wParam
==
VK_ESCAPE
)
{
cleanup
();
return
0
;
return
EXIT_SUCCESS
;
}
break
;
case
WM_CLOSE
:
cleanup
();
return
0
;
return
EXIT_SUCCESS
;
case
WM_DESTROY
:
::
PostQuitMessage
(
0
);
return
0
;
return
EXIT_SUCCESS
;
}
return
::
DefWindowProc
(
hWnd
,
message
,
wParam
,
lParam
);
...
...
@@ -135,7 +125,7 @@ public:
}
else
{
return
0
;
return
EXIT_SUCCESS
;
}
break
;
case
Expose
:
...
...
@@ -163,7 +153,7 @@ public:
}
break
;
default
:
return
0
;
return
EXIT_SUCCESS
;
}
return
1
;
}
...
...
@@ -177,7 +167,7 @@ public:
if
(
setup_pixel_format
()
!=
0
)
{
std
::
cerr
<<
"Can't setup pixel format"
<<
std
::
endl
;
return
-
1
;
return
EXIT_FAILURE
;
}
m_hRC
=
wglCreateContext
(
m_hDC
);
...
...
@@ -201,25 +191,25 @@ public:
cv
::
ocl
::
Context
::
getDefault
().
device
(
0
).
name
()
:
(
char
*
)
"No OpenCL device"
;
return
0
;
return
EXIT_SUCCESS
;
}
// init()
int
get_frame
(
cv
::
ogl
::
Texture2D
&
texture
,
cv
::
ogl
::
Buffer
&
buffer
,
bool
do_buffer
)
{
if
(
!
m_cap
.
read
(
m_frame_bgr
))
return
-
1
;
return
EXIT_FAILURE
;
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
COLOR_RGB2RGBA
);
cv
::
cvtColor
(
m_frame_bgr
,
m_frame_rgba
,
cv
::
COLOR_RGB2RGBA
);
if
(
do_buffer
)
buffer
.
copyFrom
(
m_frame_rgba
,
cv
::
ogl
::
Buffer
::
PIXEL_UNPACK_BUFFER
,
true
);
else
texture
.
copyFrom
(
m_frame_rgba
,
true
);
return
0
;
return
EXIT_SUCCESS
;
}
void
print_info
(
MODE
mode
,
float
time
,
cv
::
String
&
oclDevName
)
void
print_info
(
MODE
mode
,
double
time
,
cv
::
String
&
oclDevName
)
{
#if defined(_WIN32)
HDC
hDC
=
m_hDC
;
...
...
@@ -270,7 +260,7 @@ public:
try
{
if
(
m_shutdown
)
return
0
;
return
EXIT_SUCCESS
;
int
r
;
cv
::
ogl
::
Texture2D
texture
;
...
...
@@ -285,7 +275,7 @@ public:
r
=
get_frame
(
texture
,
buffer
,
do_buffer
);
if
(
r
!=
0
)
{
return
-
1
;
return
EXIT_FAILURE
;
}
switch
(
mode
)
...
...
@@ -331,7 +321,7 @@ public:
glXSwapBuffers
(
m_display
,
m_window
);
#endif
print_info
(
mode
,
m_timer
.
time
(
Timer
::
MSEC
),
m_oclDevName
);
print_info
(
mode
,
m_timer
.
getTimeMilli
(
),
m_oclDevName
);
}
...
...
@@ -341,7 +331,7 @@ public:
return
10
;
}
return
0
;
return
EXIT_SUCCESS
;
}
protected
:
...
...
@@ -350,6 +340,7 @@ protected:
{
cv
::
Mat
m
(
m_height
,
m_width
,
CV_8UC4
);
m_timer
.
reset
();
m_timer
.
start
();
if
(
do_buffer
)
...
...
@@ -375,6 +366,7 @@ protected:
{
cv
::
UMat
u
;
m_timer
.
reset
();
m_timer
.
start
();
if
(
do_buffer
)
...
...
@@ -430,12 +422,12 @@ protected:
int
pfmt
=
ChoosePixelFormat
(
m_hDC
,
&
pfd
);
if
(
pfmt
==
0
)
return
-
1
;
return
EXIT_FAILURE
;
if
(
SetPixelFormat
(
m_hDC
,
pfmt
,
&
pfd
)
==
0
)
return
-
2
;
return
0
;
return
EXIT_SUCCESS
;
}
#endif
...
...
@@ -473,23 +465,10 @@ private:
cv
::
String
m_oclDevName
;
};
static
void
help
()
{
printf
(
"
\n
Sample demonstrating interoperability of OpenGL and OpenCL with OpenCV.
\n
"
"Hot keys:
\n
"
" SPACE - turn processing on/off
\n
"
" 1 - process GL data through OpenCV on CPU
\n
"
" 2 - process GL data through OpenCV on GPU (via OpenCL)
\n
"
" 9 - toggle use of GL texture/GL buffer
\n
"
" ESC - exit
\n\n
"
);
}
static
const
char
*
keys
=
{
"{c camera |
true | use camera or not
}"
"{c camera |
0 | camera id
}"
"{f file | | movie file name }"
"{h help | false | print help info }"
};
using
namespace
cv
;
...
...
@@ -498,29 +477,31 @@ using namespace std;
int
main
(
int
argc
,
char
**
argv
)
{
cv
::
CommandLineParser
parser
(
argc
,
argv
,
keys
);
bool
useCamera
=
parser
.
get
<
bool
>
(
"camera"
);
int
camera_id
=
parser
.
get
<
int
>
(
"camera"
);
string
file
=
parser
.
get
<
string
>
(
"file"
);
bool
showHelp
=
parser
.
get
<
bool
>
(
"help"
);
if
(
showHelp
)
{
help
();
return
0
;
}
parser
.
about
(
"
\n
A sample program demonstrating interoperability of OpenGL and OpenCL with OpenCV.
\n\n
"
"Hot keys:
\n
"
" SPACE - turn processing on/off
\n
"
" 1 - process GL data through OpenCV on CPU
\n
"
" 2 - process GL data through OpenCV on GPU (via OpenCL)
\n
"
" 9 - toggle use of GL texture/GL buffer
\n
"
" ESC - exit
\n\n
"
);
parser
.
printMessage
();
cv
::
VideoCapture
cap
;
if
(
useCamera
)
cap
.
open
(
0
);
if
(
file
.
empty
()
)
cap
.
open
(
camera_id
);
else
cap
.
open
(
file
.
c_str
());
if
(
!
cap
.
isOpened
())
{
printf
(
"can not open camera or video file
\n
"
);
return
-
1
;
return
EXIT_FAILURE
;
}
int
width
=
(
int
)
cap
.
get
(
CAP_PROP_FRAME_WIDTH
);
...
...
samples/opengl/winapp.hpp
View file @
b33cb2e3
...
...
@@ -22,54 +22,6 @@
#define SAFE_RELEASE(p) if (p) { p->Release(); p = NULL; }
class
Timer
{
public
:
enum
UNITS
{
USEC
=
0
,
MSEC
,
SEC
};
Timer
()
:
m_t0
(
0
),
m_diff
(
0
)
{
m_tick_frequency
=
(
float
)
cv
::
getTickFrequency
();
m_unit_mul
[
USEC
]
=
1000000
;
m_unit_mul
[
MSEC
]
=
1000
;
m_unit_mul
[
SEC
]
=
1
;
}
void
clear
()
{
m_t0
=
m_diff
=
0
;
}
void
start
()
{
m_t0
=
cv
::
getTickCount
();
}
void
stop
()
{
m_diff
=
cv
::
getTickCount
()
-
m_t0
;
}
float
time
(
UNITS
u
=
MSEC
)
{
float
sec
=
m_diff
/
m_tick_frequency
;
return
sec
*
m_unit_mul
[
u
];
}
public
:
float
m_tick_frequency
;
int64
m_t0
;
int64
m_diff
;
int
m_unit_mul
[
3
];
};
class
WinApp
{
public
:
...
...
@@ -266,5 +218,5 @@ protected:
int
m_width
;
int
m_height
;
std
::
string
m_window_name
;
Timer
m_timer
;
cv
::
TickMeter
m_timer
;
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment