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
a0411054
Commit
a0411054
authored
9 years ago
by
Andrey Pavlenko
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
refactoring Tutorial-4 using new OpenCV CameraGLSurfaceView
parent
15db8243
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
172 additions
and
917 deletions
+172
-917
.cproject
samples/android/tutorial-4-opencl/.cproject
+2
-2
Android.mk
samples/android/tutorial-4-opencl/jni/Android.mk
+3
-2
CLprocessor.cpp
samples/android/tutorial-4-opencl/jni/CLprocessor.cpp
+72
-4
GLrender.cpp
samples/android/tutorial-4-opencl/jni/GLrender.cpp
+0
-375
common.hpp
samples/android/tutorial-4-opencl/jni/common.hpp
+1
-1
jni.c
samples/android/tutorial-4-opencl/jni/jni.c
+9
-21
Camera2Renderer.java
...ncl/src/org/opencv/samples/tutorial4/Camera2Renderer.java
+0
-281
CameraRenderer.java
...encl/src/org/opencv/samples/tutorial4/CameraRenderer.java
+0
-75
MyGLRendererBase.java
...cl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java
+0
-117
MyGLSurfaceView.java
...ncl/src/org/opencv/samples/tutorial4/MyGLSurfaceView.java
+73
-26
NativePart.java
...4-opencl/src/org/opencv/samples/tutorial4/NativePart.java
+5
-7
Tutorial4Activity.java
...l/src/org/opencv/samples/tutorial4/Tutorial4Activity.java
+7
-6
No files found.
samples/android/tutorial-4-opencl/.cproject
View file @
a0411054
...
...
@@ -5,6 +5,7 @@
<storageModule
buildSystemId=
"org.eclipse.cdt.managedbuilder.core.configurationDataProvider"
id=
"com.android.toolchain.gcc.2119826334"
moduleId=
"org.eclipse.cdt.core.settings"
name=
"Default"
>
<externalSettings/>
<extensions>
<extension
id=
"org.eclipse.cdt.core.ELF"
point=
"org.eclipse.cdt.core.BinaryParser"
/>
<extension
id=
"org.eclipse.cdt.core.GASErrorParser"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
<extension
id=
"org.eclipse.cdt.core.GmakeErrorParser"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
<extension
id=
"org.eclipse.cdt.core.GLDErrorParser"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
...
...
@@ -12,7 +13,6 @@
<extension
id=
"org.eclipse.cdt.core.VCErrorParser"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
<extension
id=
"org.eclipse.cdt.core.CWDLocator"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
<extension
id=
"org.eclipse.cdt.core.GCCErrorParser"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
<extension
id=
"org.eclipse.cdt.core.ELF"
point=
"org.eclipse.cdt.core.BinaryParser"
/>
</extensions>
</storageModule>
<storageModule
moduleId=
"cdtBuildSystem"
version=
"4.0.0"
>
...
...
@@ -28,7 +28,7 @@
</builder>
<tool
id=
"com.android.gcc.compiler.1725706653"
name=
"Android GCC Compiler"
superClass=
"com.android.gcc.compiler"
>
<option
id=
"com.android.gcc.option.includePath.1852635009"
superClass=
"com.android.gcc.option.includePath"
valueType=
"includePath"
>
<listOptionValue
builtIn=
"false"
value=
"
../$(O4A_SDK_ROOT)/sdk/native/jni/include
"
/>
<listOptionValue
builtIn=
"false"
value=
"
"${OPENCV_ANDROID_SDK}/sdk/native/jni/include"
"
/>
</option>
<inputType
id=
"com.android.gcc.inputType.193477776"
superClass=
"com.android.gcc.inputType"
/>
</tool>
...
...
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/jni/Android.mk
View file @
a0411054
...
...
@@ -21,7 +21,7 @@ endif
LOCAL_C_INCLUDES += $(OPENCL_SDK)/include
LOCAL_LDLIBS += -L$(OPENCL_SDK)/lib/$(TARGET_ARCH_ABI) -lOpenCL
LOCAL_MODULE := JNI
render
LOCAL_SRC_FILES := jni.c
GLrender.cpp
CLprocessor.cpp
LOCAL_MODULE := JNI
part
LOCAL_SRC_FILES := jni.c CLprocessor.cpp
LOCAL_LDLIBS += -llog -lGLESv2 -lEGL
include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/jni/CLprocessor.cpp
View file @
a0411054
...
...
@@ -2,6 +2,7 @@
#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
/*let's give a chance for OpenCL 1.1 devices*/
#include <CL/cl.hpp>
#include <GLES2/gl2.h>
#include <EGL/egl.h>
#include <opencv2/core.hpp>
...
...
@@ -82,7 +83,7 @@ cl::CommandQueue theQueue;
cl
::
Program
theProgB2B
,
theProgI2B
,
theProgI2I
;
bool
haveOpenCL
=
false
;
void
initCL
()
extern
"C"
void
initCL
()
{
dumpCLinfo
();
...
...
@@ -144,14 +145,19 @@ void initCL()
LOGD
(
"initCL completed"
);
}
void
closeCL
()
extern
"C"
void
closeCL
()
{
}
#define GL_TEXTURE_2D 0x0DE1
void
procOCL_I2I
(
int
texIn
,
int
texOut
,
int
w
,
int
h
)
{
if
(
!
haveOpenCL
)
return
;
LOGD
(
"Processing OpenCL Direct (image2d)"
);
if
(
!
haveOpenCL
)
{
LOGE
(
"OpenCL isn't initialized"
);
return
;
}
LOGD
(
"procOCL_I2I(%d, %d, %d, %d)"
,
texIn
,
texOut
,
w
,
h
);
cl
::
ImageGL
imgIn
(
theContext
,
CL_MEM_READ_ONLY
,
GL_TEXTURE_2D
,
0
,
texIn
);
...
...
@@ -185,7 +191,12 @@ void procOCL_I2I(int texIn, int texOut, int w, int h)
void
procOCL_OCV
(
int
texIn
,
int
texOut
,
int
w
,
int
h
)
{
if
(
!
haveOpenCL
)
return
;
LOGD
(
"Processing OpenCL via OpenCV"
);
if
(
!
haveOpenCL
)
{
LOGE
(
"OpenCL isn't initialized"
);
return
;
}
int64_t
t
=
getTimeMs
();
cl
::
ImageGL
imgIn
(
theContext
,
CL_MEM_READ_ONLY
,
GL_TEXTURE_2D
,
0
,
texIn
);
...
...
@@ -219,3 +230,60 @@ void procOCL_OCV(int texIn, int texOut, int w, int h)
cv
::
ocl
::
finish
();
LOGD
(
"uploading results to texture costs %d ms"
,
getTimeInterval
(
t
));
}
void
drawFrameProcCPU
(
int
w
,
int
h
,
int
texOut
)
{
LOGD
(
"Processing on CPU"
);
int64_t
t
;
// let's modify pixels in FBO texture in C++ code (on CPU)
const
int
BUFF_SIZE
=
1
<<
24
;
//2k*2k*4;
static
char
tmpBuff
[
BUFF_SIZE
];
if
(
w
*
h
>
BUFF_SIZE
)
{
LOGE
(
"Internal temp buffer is too small, can't make CPU frame processing"
);
return
;
}
// read
t
=
getTimeMs
();
// expecting FBO to be bound
glReadPixels
(
0
,
0
,
w
,
h
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
tmpBuff
);
LOGD
(
"glReadPixels() costs %d ms"
,
getTimeInterval
(
t
));
// modify
t
=
getTimeMs
();
cv
::
Mat
m
(
h
,
w
,
CV_8UC4
,
tmpBuff
);
cv
::
Laplacian
(
m
,
m
,
CV_8U
);
m
*=
10
;
LOGD
(
"Laplacian() costs %d ms"
,
getTimeInterval
(
t
));
// write back
glActiveTexture
(
GL_TEXTURE0
);
glBindTexture
(
GL_TEXTURE_2D
,
texOut
);
t
=
getTimeMs
();
glTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
0
,
0
,
w
,
h
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
tmpBuff
);
LOGD
(
"glTexSubImage2D() costs %d ms"
,
getTimeInterval
(
t
));
}
enum
ProcMode
{
PROC_MODE_NO_PROC
=
0
,
PROC_MODE_CPU
=
1
,
PROC_MODE_OCL_DIRECT
=
2
,
PROC_MODE_OCL_OCV
=
3
};
extern
"C"
void
processFrame
(
int
tex1
,
int
tex2
,
int
w
,
int
h
,
int
mode
)
{
switch
(
mode
)
{
//case PROC_MODE_NO_PROC:
case
PROC_MODE_CPU
:
drawFrameProcCPU
(
w
,
h
,
tex2
);
break
;
case
PROC_MODE_OCL_DIRECT
:
procOCL_I2I
(
tex1
,
tex2
,
w
,
h
);
break
;
case
PROC_MODE_OCL_OCV
:
procOCL_OCV
(
tex1
,
tex2
,
w
,
h
);
break
;
default
:
LOGE
(
"Unexpected processing mode: %d"
,
mode
);
}
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/jni/GLrender.cpp
deleted
100644 → 0
View file @
15db8243
#include <GLES2/gl2.h>
#include <GLES2/gl2ext.h>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include "common.hpp"
float
vertices
[]
=
{
-
1.0
f
,
-
1.0
f
,
-
1.0
f
,
1.0
f
,
1.0
f
,
-
1.0
f
,
1.0
f
,
1.0
f
};
float
texCoordOES
[]
=
{
0.0
f
,
1.0
f
,
0.0
f
,
0.0
f
,
1.0
f
,
1.0
f
,
1.0
f
,
0.0
f
};
float
texCoord2D
[]
=
{
0.0
f
,
0.0
f
,
0.0
f
,
1.0
f
,
1.0
f
,
0.0
f
,
1.0
f
,
1.0
f
};
const
char
vss
[]
=
\
"attribute vec2 vPosition;
\n
"
\
"attribute vec2 vTexCoord;
\n
"
\
"varying vec2 texCoord;
\n
"
\
"void main() {
\n
"
\
" texCoord = vTexCoord;
\n
"
\
" gl_Position = vec4 ( vPosition, 0.0, 1.0 );
\n
"
\
"}"
;
const
char
fssOES
[]
=
\
"#extension GL_OES_EGL_image_external : require
\n
"
\
"precision mediump float;
\n
"
\
"uniform samplerExternalOES sTexture;
\n
"
\
"varying vec2 texCoord;
\n
"
\
"void main() {
\n
"
\
" gl_FragColor = texture2D(sTexture,texCoord);
\n
"
\
"}"
;
const
char
fss2D
[]
=
\
"precision mediump float;
\n
"
\
"uniform sampler2D sTexture;
\n
"
\
"varying vec2 texCoord;
\n
"
\
"void main() {
\n
"
\
" gl_FragColor = texture2D(sTexture,texCoord);
\n
"
\
"}"
;
GLuint
progOES
=
0
;
GLuint
prog2D
=
0
;
GLint
vPosOES
,
vTCOES
;
GLint
vPos2D
,
vTC2D
;
GLuint
FBOtex
=
0
,
FBOtex2
=
0
;
GLuint
FBO
=
0
;
GLuint
texOES
=
0
;
int
texWidth
=
0
,
texHeight
=
0
;
enum
ProcMode
{
PROC_MODE_NO_PROC
=
0
,
PROC_MODE_CPU
=
1
,
PROC_MODE_OCL_DIRECT
=
2
,
PROC_MODE_OCL_OCV
=
3
};
ProcMode
procMode
=
PROC_MODE_NO_PROC
;
static
inline
void
deleteTex
(
GLuint
*
tex
)
{
if
(
tex
&&
*
tex
)
{
glDeleteTextures
(
1
,
tex
);
*
tex
=
0
;
}
}
static
void
releaseFBO
()
{
if
(
FBO
!=
0
)
{
glBindFramebuffer
(
GL_FRAMEBUFFER
,
0
);
glDeleteFramebuffers
(
1
,
&
FBO
);
FBO
=
0
;
}
deleteTex
(
&
FBOtex
);
deleteTex
(
&
FBOtex2
);
glDeleteProgram
(
prog2D
);
prog2D
=
0
;
}
static
inline
void
logShaderCompileError
(
GLuint
shader
,
bool
isProgram
=
false
)
{
GLchar
msg
[
512
];
msg
[
0
]
=
0
;
GLsizei
len
;
if
(
isProgram
)
glGetProgramInfoLog
(
shader
,
sizeof
(
msg
)
-
1
,
&
len
,
msg
);
else
glGetShaderInfoLog
(
shader
,
sizeof
(
msg
)
-
1
,
&
len
,
msg
);
LOGE
(
"Could not compile shader/program: %s"
,
msg
);
}
static
int
makeShaderProg
(
const
char
*
vss
,
const
char
*
fss
)
{
LOGD
(
"makeShaderProg: setup GL_VERTEX_SHADER"
);
GLuint
vshader
=
glCreateShader
(
GL_VERTEX_SHADER
);
const
GLchar
*
text
=
vss
;
glShaderSource
(
vshader
,
1
,
&
text
,
0
);
glCompileShader
(
vshader
);
GLint
compiled
;
glGetShaderiv
(
vshader
,
GL_COMPILE_STATUS
,
&
compiled
);
if
(
!
compiled
)
{
logShaderCompileError
(
vshader
);
glDeleteShader
(
vshader
);
vshader
=
0
;
}
LOGD
(
"makeShaderProg: setup GL_FRAGMENT_SHADER"
);
GLuint
fshader
=
glCreateShader
(
GL_FRAGMENT_SHADER
);
text
=
fss
;
glShaderSource
(
fshader
,
1
,
&
text
,
0
);
glCompileShader
(
fshader
);
glGetShaderiv
(
fshader
,
GL_COMPILE_STATUS
,
&
compiled
);
if
(
!
compiled
)
{
logShaderCompileError
(
fshader
);
glDeleteShader
(
fshader
);
fshader
=
0
;
}
LOGD
(
"makeShaderProg: glCreateProgram"
);
GLuint
program
=
glCreateProgram
();
glAttachShader
(
program
,
vshader
);
glAttachShader
(
program
,
fshader
);
glLinkProgram
(
program
);
GLint
linked
;
glGetProgramiv
(
program
,
GL_LINK_STATUS
,
&
linked
);
if
(
!
linked
)
{
logShaderCompileError
(
program
,
true
);
glDeleteProgram
(
program
);
program
=
0
;
}
glValidateProgram
(
program
);
GLint
validated
;
glGetProgramiv
(
program
,
GL_VALIDATE_STATUS
,
&
validated
);
if
(
!
validated
)
{
logShaderCompileError
(
program
,
true
);
glDeleteProgram
(
program
);
program
=
0
;
}
if
(
vshader
)
glDeleteShader
(
vshader
);
if
(
fshader
)
glDeleteShader
(
fshader
);
return
program
;
}
static
void
initFBO
(
int
width
,
int
height
)
{
LOGD
(
"initFBO(%d, %d)"
,
width
,
height
);
releaseFBO
();
glGenTextures
(
1
,
&
FBOtex2
);
glBindTexture
(
GL_TEXTURE_2D
,
FBOtex2
);
glTexImage2D
(
GL_TEXTURE_2D
,
0
,
GL_RGBA
,
width
,
height
,
0
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
0
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MIN_FILTER
,
GL_NEAREST
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MAG_FILTER
,
GL_NEAREST
);
glGenTextures
(
1
,
&
FBOtex
);
glBindTexture
(
GL_TEXTURE_2D
,
FBOtex
);
glTexImage2D
(
GL_TEXTURE_2D
,
0
,
GL_RGBA
,
width
,
height
,
0
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
0
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MIN_FILTER
,
GL_NEAREST
);
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MAG_FILTER
,
GL_NEAREST
);
//int hFBO;
glGenFramebuffers
(
1
,
&
FBO
);
glBindFramebuffer
(
GL_FRAMEBUFFER
,
FBO
);
glFramebufferTexture2D
(
GL_FRAMEBUFFER
,
GL_COLOR_ATTACHMENT0
,
GL_TEXTURE_2D
,
FBOtex
,
0
);
LOGD
(
"initFBO status: %d"
,
glGetError
());
if
(
glCheckFramebufferStatus
(
GL_FRAMEBUFFER
)
!=
GL_FRAMEBUFFER_COMPLETE
)
LOGE
(
"initFBO failed: %d"
,
glCheckFramebufferStatus
(
GL_FRAMEBUFFER
));
prog2D
=
makeShaderProg
(
vss
,
fss2D
);
vPos2D
=
glGetAttribLocation
(
prog2D
,
"vPosition"
);
vTC2D
=
glGetAttribLocation
(
prog2D
,
"vTexCoord"
);
glEnableVertexAttribArray
(
vPos2D
);
glEnableVertexAttribArray
(
vTC2D
);
}
void
drawTex
(
int
tex
,
GLenum
texType
,
GLuint
fbo
)
{
int64_t
t
=
getTimeMs
();
//draw texture to FBO or to screen
glBindFramebuffer
(
GL_FRAMEBUFFER
,
fbo
);
glViewport
(
0
,
0
,
texWidth
,
texHeight
);
glClear
(
GL_COLOR_BUFFER_BIT
);
GLuint
prog
=
texType
==
GL_TEXTURE_EXTERNAL_OES
?
progOES
:
prog2D
;
GLint
vPos
=
texType
==
GL_TEXTURE_EXTERNAL_OES
?
vPosOES
:
vPos2D
;
GLint
vTC
=
texType
==
GL_TEXTURE_EXTERNAL_OES
?
vTCOES
:
vTC2D
;
float
*
texCoord
=
texType
==
GL_TEXTURE_EXTERNAL_OES
?
texCoordOES
:
texCoord2D
;
glUseProgram
(
prog
);
glVertexAttribPointer
(
vPos
,
2
,
GL_FLOAT
,
false
,
4
*
2
,
vertices
);
glVertexAttribPointer
(
vTC
,
2
,
GL_FLOAT
,
false
,
4
*
2
,
texCoord
);
glActiveTexture
(
GL_TEXTURE0
);
glBindTexture
(
texType
,
tex
);
glUniform1i
(
glGetUniformLocation
(
prog
,
"sTexture"
),
0
);
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
glFlush
();
LOGD
(
"drawTex(%u) costs %d ms"
,
tex
,
getTimeInterval
(
t
));
}
void
drawFrameOrig
()
{
drawTex
(
texOES
,
GL_TEXTURE_EXTERNAL_OES
,
0
);
}
void
procCPU
(
char
*
buff
,
int
w
,
int
h
)
{
int64_t
t
=
getTimeMs
();
cv
::
Mat
m
(
h
,
w
,
CV_8UC4
,
buff
);
cv
::
Laplacian
(
m
,
m
,
CV_8U
);
m
*=
10
;
LOGD
(
"procCPU() costs %d ms"
,
getTimeInterval
(
t
));
}
void
drawFrameProcCPU
()
{
int64_t
t
;
drawTex
(
texOES
,
GL_TEXTURE_EXTERNAL_OES
,
FBO
);
// let's modify pixels in FBO texture in C++ code (on CPU)
const
int
BUFF_SIZE
=
1
<<
24
;
//2k*2k*4;
static
char
tmpBuff
[
BUFF_SIZE
];
if
(
texWidth
*
texHeight
>
BUFF_SIZE
)
{
LOGE
(
"Internal temp buffer is too small, can't make CPU frame processing"
);
return
;
}
// read
t
=
getTimeMs
();
glReadPixels
(
0
,
0
,
texWidth
,
texHeight
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
tmpBuff
);
LOGD
(
"glReadPixels() costs %d ms"
,
getTimeInterval
(
t
));
// modify
procCPU
(
tmpBuff
,
texWidth
,
texHeight
);
// write back
t
=
getTimeMs
();
glTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
0
,
0
,
texWidth
,
texHeight
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
tmpBuff
);
LOGD
(
"glTexSubImage2D() costs %d ms"
,
getTimeInterval
(
t
));
// render to screen
drawTex
(
FBOtex
,
GL_TEXTURE_2D
,
0
);
}
void
procOCL_I2I
(
int
texIn
,
int
texOut
,
int
w
,
int
h
);
void
procOCL_OCV
(
int
texIn
,
int
texOut
,
int
w
,
int
h
);
void
drawFrameProcOCL
()
{
drawTex
(
texOES
,
GL_TEXTURE_EXTERNAL_OES
,
FBO
);
// modify pixels in FBO texture using OpenCL and CL-GL interop
procOCL_I2I
(
FBOtex
,
FBOtex2
,
texWidth
,
texHeight
);
// render to screen
drawTex
(
FBOtex2
,
GL_TEXTURE_2D
,
0
);
}
void
drawFrameProcOCLOCV
()
{
drawTex
(
texOES
,
GL_TEXTURE_EXTERNAL_OES
,
FBO
);
// modify pixels in FBO texture using OpenCL and CL-GL interop
procOCL_OCV
(
FBOtex
,
FBOtex2
,
texWidth
,
texHeight
);
// render to screen
drawTex
(
FBOtex2
,
GL_TEXTURE_2D
,
0
);
}
extern
"C"
void
drawFrame
()
{
LOGD
(
"*** drawFrame() ***"
);
int64_t
t
=
getTimeMs
();
switch
(
procMode
)
{
case
PROC_MODE_NO_PROC
:
drawFrameOrig
();
break
;
case
PROC_MODE_CPU
:
drawFrameProcCPU
();
break
;
case
PROC_MODE_OCL_DIRECT
:
drawFrameProcOCL
();
break
;
case
PROC_MODE_OCL_OCV
:
drawFrameProcOCLOCV
();
break
;
default
:
drawFrameOrig
();
}
glFinish
();
LOGD
(
"*** drawFrame() costs %d ms ***"
,
getTimeInterval
(
t
));
}
void
closeCL
();
extern
"C"
void
closeGL
()
{
closeCL
();
LOGD
(
"closeGL"
);
deleteTex
(
&
texOES
);
glUseProgram
(
0
);
glDeleteProgram
(
progOES
);
progOES
=
0
;
releaseFBO
();
}
void
initCL
();
extern
"C"
int
initGL
()
{
LOGD
(
"initGL"
);
closeGL
();
const
char
*
vs
=
(
const
char
*
)
glGetString
(
GL_VERSION
);
LOGD
(
"GL_VERSION = %s"
,
vs
);
progOES
=
makeShaderProg
(
vss
,
fssOES
);
vPosOES
=
glGetAttribLocation
(
progOES
,
"vPosition"
);
vTCOES
=
glGetAttribLocation
(
progOES
,
"vTexCoord"
);
glEnableVertexAttribArray
(
vPosOES
);
glEnableVertexAttribArray
(
vTCOES
);
glClearColor
(
1.0
f
,
1.0
f
,
1.0
f
,
1.0
f
);
texOES
=
0
;
glGenTextures
(
1
,
&
texOES
);
glBindTexture
(
GL_TEXTURE_EXTERNAL_OES
,
texOES
);
glTexParameteri
(
GL_TEXTURE_EXTERNAL_OES
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
GL_TEXTURE_EXTERNAL_OES
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
glTexParameteri
(
GL_TEXTURE_EXTERNAL_OES
,
GL_TEXTURE_MIN_FILTER
,
GL_NEAREST
);
glTexParameteri
(
GL_TEXTURE_EXTERNAL_OES
,
GL_TEXTURE_MAG_FILTER
,
GL_NEAREST
);
initCL
();
return
texOES
;
}
extern
"C"
void
changeSize
(
int
width
,
int
height
)
{
const
int
MAX_W
=
1
<<
11
,
MAX_H
=
1
<<
11
;
LOGD
(
"changeSize: %dx%d"
,
width
,
height
);
texWidth
=
width
<=
MAX_W
?
width
:
MAX_W
;
texHeight
=
height
<=
MAX_H
?
height
:
MAX_H
;
initFBO
(
texWidth
,
texHeight
);
}
extern
"C"
void
setProcessingMode
(
int
mode
)
{
switch
(
mode
)
{
case
PROC_MODE_NO_PROC
:
procMode
=
PROC_MODE_NO_PROC
;
break
;
case
PROC_MODE_CPU
:
procMode
=
PROC_MODE_CPU
;
break
;
case
PROC_MODE_OCL_DIRECT
:
procMode
=
PROC_MODE_OCL_DIRECT
;
break
;
case
PROC_MODE_OCL_OCV
:
procMode
=
PROC_MODE_OCL_OCV
;
break
;
}
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/jni/common.hpp
View file @
a0411054
#include <android/log.h>
#define LOG_TAG "JNI
Renderer
"
#define LOG_TAG "JNI
part
"
//#define LOGD(...)
#define LOGD(...) ((void)__android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__))
#define LOGE(...) ((void)__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__))
...
...
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/jni/jni.c
View file @
a0411054
#include <jni.h>
int
initGL
();
void
closeGL
();
void
changeSize
(
int
width
,
int
height
);
void
drawFrame
();
void
setProcessingMode
(
int
mode
);
int
initCL
();
void
closeCL
();
void
processFrame
(
int
tex1
,
int
tex2
,
int
w
,
int
h
,
int
mode
);
JNIEXPORT
jint
JNICALL
Java_org_opencv_samples_tutorial4_Native
GLRenderer_initG
L
(
JNIEnv
*
env
,
jclass
cls
)
JNIEXPORT
jint
JNICALL
Java_org_opencv_samples_tutorial4_Native
Part_initC
L
(
JNIEnv
*
env
,
jclass
cls
)
{
return
init
G
L
();
return
init
C
L
();
}
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_Native
GLRenderer_closeG
L
(
JNIEnv
*
env
,
jclass
cls
)
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_Native
Part_closeC
L
(
JNIEnv
*
env
,
jclass
cls
)
{
close
G
L
();
close
C
L
();
}
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_Native
GLRenderer_changeSize
(
JNIEnv
*
env
,
jclass
cls
,
jint
width
,
jint
height
)
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_Native
Part_processFrame
(
JNIEnv
*
env
,
jclass
cls
,
jint
tex1
,
jint
tex2
,
jint
w
,
jint
h
,
jint
mode
)
{
changeSize
(
width
,
height
);
}
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_NativeGLRenderer_drawFrame
(
JNIEnv
*
env
,
jclass
cls
)
{
drawFrame
();
}
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_NativeGLRenderer_setProcessingMode
(
JNIEnv
*
env
,
jclass
cls
,
jint
mode
)
{
setProcessingMode
(
mode
);
processFrame
(
tex1
,
tex2
,
w
,
h
,
mode
);
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java
deleted
100644 → 0
View file @
15db8243
package
org
.
opencv
.
samples
.
tutorial4
;
import
java.util.Arrays
;
import
java.util.concurrent.Semaphore
;
import
java.util.concurrent.TimeUnit
;
import
android.annotation.SuppressLint
;
import
android.content.Context
;
import
android.graphics.SurfaceTexture
;
import
android.hardware.camera2.CameraAccessException
;
import
android.hardware.camera2.CameraCaptureSession
;
import
android.hardware.camera2.CameraCharacteristics
;
import
android.hardware.camera2.CameraDevice
;
import
android.hardware.camera2.CameraManager
;
import
android.hardware.camera2.CaptureRequest
;
import
android.hardware.camera2.params.StreamConfigurationMap
;
import
android.os.Handler
;
import
android.os.HandlerThread
;
import
android.util.Log
;
import
android.util.Size
;
import
android.view.Surface
;
@SuppressLint
(
"NewApi"
)
public
class
Camera2Renderer
extends
MyGLRendererBase
{
protected
final
String
LOGTAG
=
"Camera2Renderer"
;
private
CameraDevice
mCameraDevice
;
private
CameraCaptureSession
mCaptureSession
;
private
CaptureRequest
.
Builder
mPreviewRequestBuilder
;
private
String
mCameraID
;
private
Size
mPreviewSize
=
new
Size
(
1280
,
720
);
private
HandlerThread
mBackgroundThread
;
private
Handler
mBackgroundHandler
;
private
Semaphore
mCameraOpenCloseLock
=
new
Semaphore
(
1
);
Camera2Renderer
(
MyGLSurfaceView
view
)
{
super
(
view
);
}
public
void
onResume
()
{
stopBackgroundThread
();
super
.
onResume
();
startBackgroundThread
();
}
public
void
onPause
()
{
super
.
onPause
();
stopBackgroundThread
();
}
boolean
cacPreviewSize
(
final
int
width
,
final
int
height
)
{
Log
.
i
(
LOGTAG
,
"cacPreviewSize: "
+
width
+
"x"
+
height
);
if
(
mCameraID
==
null
)
return
false
;
CameraManager
manager
=
(
CameraManager
)
mView
.
getContext
()
.
getSystemService
(
Context
.
CAMERA_SERVICE
);
try
{
CameraCharacteristics
characteristics
=
manager
.
getCameraCharacteristics
(
mCameraID
);
StreamConfigurationMap
map
=
characteristics
.
get
(
CameraCharacteristics
.
SCALER_STREAM_CONFIGURATION_MAP
);
int
bestWidth
=
0
,
bestHeight
=
0
;
float
aspect
=
(
float
)
width
/
height
;
for
(
Size
psize
:
map
.
getOutputSizes
(
SurfaceTexture
.
class
))
{
int
w
=
psize
.
getWidth
(),
h
=
psize
.
getHeight
();
Log
.
d
(
LOGTAG
,
"trying size: "
+
w
+
"x"
+
h
);
if
(
width
>=
w
&&
height
>=
h
&&
bestWidth
<=
w
&&
bestHeight
<=
h
&&
Math
.
abs
(
aspect
-
(
float
)
w
/
h
)
<
0.2
)
{
bestWidth
=
w
;
bestHeight
=
h
;
}
}
Log
.
i
(
LOGTAG
,
"best size: "
+
bestWidth
+
"x"
+
bestHeight
);
if
(
mPreviewSize
.
getWidth
()
==
bestWidth
&&
mPreviewSize
.
getHeight
()
==
bestHeight
)
return
false
;
else
{
mPreviewSize
=
new
Size
(
bestWidth
,
bestHeight
);
return
true
;
}
}
catch
(
CameraAccessException
e
)
{
Log
.
e
(
LOGTAG
,
"cacPreviewSize - Camera Access Exception"
);
}
catch
(
IllegalArgumentException
e
)
{
Log
.
e
(
LOGTAG
,
"cacPreviewSize - Illegal Argument Exception"
);
}
catch
(
SecurityException
e
)
{
Log
.
e
(
LOGTAG
,
"cacPreviewSize - Security Exception"
);
}
return
false
;
}
protected
void
openCamera
()
{
Log
.
i
(
LOGTAG
,
"openCamera"
);
//closeCamera();
CameraManager
manager
=
(
CameraManager
)
mView
.
getContext
()
.
getSystemService
(
Context
.
CAMERA_SERVICE
);
try
{
for
(
String
cameraID
:
manager
.
getCameraIdList
())
{
CameraCharacteristics
characteristics
=
manager
.
getCameraCharacteristics
(
cameraID
);
if
(
characteristics
.
get
(
CameraCharacteristics
.
LENS_FACING
)
==
CameraCharacteristics
.
LENS_FACING_FRONT
)
continue
;
mCameraID
=
cameraID
;
break
;
}
if
(!
mCameraOpenCloseLock
.
tryAcquire
(
2500
,
TimeUnit
.
MILLISECONDS
))
{
throw
new
RuntimeException
(
"Time out waiting to lock camera opening."
);
}
manager
.
openCamera
(
mCameraID
,
mStateCallback
,
mBackgroundHandler
);
}
catch
(
CameraAccessException
e
)
{
Log
.
e
(
LOGTAG
,
"OpenCamera - Camera Access Exception"
);
}
catch
(
IllegalArgumentException
e
)
{
Log
.
e
(
LOGTAG
,
"OpenCamera - Illegal Argument Exception"
);
}
catch
(
SecurityException
e
)
{
Log
.
e
(
LOGTAG
,
"OpenCamera - Security Exception"
);
}
catch
(
InterruptedException
e
)
{
Log
.
e
(
LOGTAG
,
"OpenCamera - Interrupted Exception"
);
}
}
protected
void
closeCamera
()
{
Log
.
i
(
LOGTAG
,
"closeCamera"
);
try
{
mCameraOpenCloseLock
.
acquire
();
if
(
null
!=
mCaptureSession
)
{
mCaptureSession
.
close
();
mCaptureSession
=
null
;
}
if
(
null
!=
mCameraDevice
)
{
mCameraDevice
.
close
();
mCameraDevice
=
null
;
}
}
catch
(
InterruptedException
e
)
{
throw
new
RuntimeException
(
"Interrupted while trying to lock camera closing."
,
e
);
}
finally
{
mCameraOpenCloseLock
.
release
();
}
}
private
final
CameraDevice
.
StateCallback
mStateCallback
=
new
CameraDevice
.
StateCallback
()
{
@Override
public
void
onOpened
(
CameraDevice
cameraDevice
)
{
mCameraDevice
=
cameraDevice
;
mCameraOpenCloseLock
.
release
();
createCameraPreviewSession
();
}
@Override
public
void
onDisconnected
(
CameraDevice
cameraDevice
)
{
cameraDevice
.
close
();
mCameraDevice
=
null
;
mCameraOpenCloseLock
.
release
();
}
@Override
public
void
onError
(
CameraDevice
cameraDevice
,
int
error
)
{
cameraDevice
.
close
();
mCameraDevice
=
null
;
mCameraOpenCloseLock
.
release
();
}
};
private
void
createCameraPreviewSession
()
{
Log
.
i
(
LOGTAG
,
"createCameraPreviewSession"
);
try
{
mCameraOpenCloseLock
.
acquire
();
if
(
null
==
mCameraDevice
)
{
mCameraOpenCloseLock
.
release
();
Log
.
e
(
LOGTAG
,
"createCameraPreviewSession: camera isn't opened"
);
return
;
}
if
(
null
!=
mCaptureSession
)
{
mCameraOpenCloseLock
.
release
();
Log
.
e
(
LOGTAG
,
"createCameraPreviewSession: mCaptureSession is already started"
);
return
;
}
if
(
null
==
mSTex
)
{
mCameraOpenCloseLock
.
release
();
Log
.
e
(
LOGTAG
,
"createCameraPreviewSession: preview SurfaceTexture is null"
);
return
;
}
Log
.
d
(
LOGTAG
,
"starting preview "
+
mPreviewSize
.
getWidth
()+
"x"
+
mPreviewSize
.
getHeight
());
mSTex
.
setDefaultBufferSize
(
mPreviewSize
.
getWidth
(),
mPreviewSize
.
getHeight
());
Surface
surface
=
new
Surface
(
mSTex
);
mPreviewRequestBuilder
=
mCameraDevice
.
createCaptureRequest
(
CameraDevice
.
TEMPLATE_PREVIEW
);
mPreviewRequestBuilder
.
addTarget
(
surface
);
mCameraDevice
.
createCaptureSession
(
Arrays
.
asList
(
surface
),
new
CameraCaptureSession
.
StateCallback
()
{
@Override
public
void
onConfigured
(
CameraCaptureSession
cameraCaptureSession
)
{
mCaptureSession
=
cameraCaptureSession
;
try
{
mPreviewRequestBuilder
.
set
(
CaptureRequest
.
CONTROL_AF_MODE
,
CaptureRequest
.
CONTROL_AF_MODE_CONTINUOUS_PICTURE
);
mPreviewRequestBuilder
.
set
(
CaptureRequest
.
CONTROL_AE_MODE
,
CaptureRequest
.
CONTROL_AE_MODE_ON_AUTO_FLASH
);
mCaptureSession
.
setRepeatingRequest
(
mPreviewRequestBuilder
.
build
(),
null
,
mBackgroundHandler
);
Log
.
i
(
LOGTAG
,
"CameraPreviewSession has been started"
);
}
catch
(
CameraAccessException
e
)
{
Log
.
e
(
LOGTAG
,
"createCaptureSession failed"
);
}
mCameraOpenCloseLock
.
release
();
}
@Override
public
void
onConfigureFailed
(
CameraCaptureSession
cameraCaptureSession
)
{
Log
.
e
(
LOGTAG
,
"createCameraPreviewSession failed"
);
mCameraOpenCloseLock
.
release
();
}
},
mBackgroundHandler
);
}
catch
(
CameraAccessException
e
)
{
Log
.
e
(
LOGTAG
,
"createCameraPreviewSession"
);
}
catch
(
InterruptedException
e
)
{
throw
new
RuntimeException
(
"Interrupted while createCameraPreviewSession"
,
e
);
}
finally
{
//mCameraOpenCloseLock.release();
}
}
private
void
startBackgroundThread
()
{
Log
.
i
(
LOGTAG
,
"startBackgroundThread"
);
mBackgroundThread
=
new
HandlerThread
(
"CameraBackground"
);
mBackgroundThread
.
start
();
mBackgroundHandler
=
new
Handler
(
mBackgroundThread
.
getLooper
());
}
private
void
stopBackgroundThread
()
{
Log
.
i
(
LOGTAG
,
"stopBackgroundThread"
);
if
(
mBackgroundThread
==
null
)
return
;
mBackgroundThread
.
quitSafely
();
try
{
mBackgroundThread
.
join
();
mBackgroundThread
=
null
;
mBackgroundHandler
=
null
;
}
catch
(
InterruptedException
e
)
{
Log
.
e
(
LOGTAG
,
"stopBackgroundThread"
);
}
}
@Override
protected
void
setCameraPreviewSize
(
int
width
,
int
height
)
{
Log
.
i
(
LOGTAG
,
"setCameraPreviewSize("
+
width
+
"x"
+
height
+
")"
);
try
{
mCameraOpenCloseLock
.
acquire
();
if
(
!
cacPreviewSize
(
width
,
height
)
)
{
mCameraOpenCloseLock
.
release
();
return
;
}
if
(
null
!=
mCaptureSession
)
{
Log
.
d
(
LOGTAG
,
"closing existing previewSession"
);
mCaptureSession
.
close
();
mCaptureSession
=
null
;
}
mCameraOpenCloseLock
.
release
();
createCameraPreviewSession
();
}
catch
(
InterruptedException
e
)
{
mCameraOpenCloseLock
.
release
();
throw
new
RuntimeException
(
"Interrupted while setCameraPreviewSize."
,
e
);
}
}
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/CameraRenderer.java
deleted
100644 → 0
View file @
15db8243
package
org
.
opencv
.
samples
.
tutorial4
;
import
java.io.IOException
;
import
java.util.List
;
import
android.hardware.Camera
;
import
android.hardware.Camera.Size
;
import
android.util.Log
;
@SuppressWarnings
(
"deprecation"
)
public
class
CameraRenderer
extends
MyGLRendererBase
{
protected
final
String
LOGTAG
=
"CameraRenderer"
;
private
Camera
mCamera
;
boolean
mPreviewStarted
=
false
;
CameraRenderer
(
MyGLSurfaceView
view
)
{
super
(
view
);
}
protected
void
closeCamera
()
{
Log
.
i
(
LOGTAG
,
"closeCamera"
);
if
(
mCamera
!=
null
)
{
mCamera
.
stopPreview
();
mPreviewStarted
=
false
;
mCamera
.
release
();
mCamera
=
null
;
}
}
protected
void
openCamera
()
{
Log
.
i
(
LOGTAG
,
"openCamera"
);
closeCamera
();
mCamera
=
Camera
.
open
();
try
{
mCamera
.
setPreviewTexture
(
mSTex
);
}
catch
(
IOException
ioe
)
{
Log
.
e
(
LOGTAG
,
"setPreviewTexture() failed: "
+
ioe
.
getMessage
());
}
}
public
void
setCameraPreviewSize
(
int
width
,
int
height
)
{
Log
.
i
(
LOGTAG
,
"setCameraPreviewSize: "
+
width
+
"x"
+
height
);
if
(
mCamera
==
null
)
return
;
if
(
mPreviewStarted
)
{
mCamera
.
stopPreview
();
mPreviewStarted
=
false
;
}
Camera
.
Parameters
param
=
mCamera
.
getParameters
();
List
<
Size
>
psize
=
param
.
getSupportedPreviewSizes
();
int
bestWidth
=
0
,
bestHeight
=
0
;
if
(
psize
.
size
()
>
0
)
{
float
aspect
=
(
float
)
width
/
height
;
for
(
Size
size
:
psize
)
{
int
w
=
size
.
width
,
h
=
size
.
height
;
Log
.
d
(
"Renderer"
,
"checking camera preview size: "
+
w
+
"x"
+
h
);
if
(
w
<=
width
&&
h
<=
height
&&
w
>=
bestWidth
&&
h
>=
bestHeight
&&
Math
.
abs
(
aspect
-
(
float
)
w
/
h
)
<
0.2
)
{
bestWidth
=
w
;
bestHeight
=
h
;
}
}
if
(
bestWidth
>
0
&&
bestHeight
>
0
)
{
param
.
setPreviewSize
(
bestWidth
,
bestHeight
);
Log
.
i
(
LOGTAG
,
"size: "
+
bestWidth
+
" x "
+
bestHeight
);
}
}
param
.
set
(
"orientation"
,
"landscape"
);
mCamera
.
setParameters
(
param
);
mCamera
.
startPreview
();
mPreviewStarted
=
true
;
}
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java
deleted
100644 → 0
View file @
15db8243
package
org
.
opencv
.
samples
.
tutorial4
;
import
javax.microedition.khronos.egl.EGLConfig
;
import
javax.microedition.khronos.opengles.GL10
;
import
android.graphics.SurfaceTexture
;
import
android.opengl.GLES20
;
import
android.opengl.GLSurfaceView
;
import
android.os.Handler
;
import
android.os.Looper
;
import
android.util.Log
;
import
android.widget.TextView
;
public
abstract
class
MyGLRendererBase
implements
GLSurfaceView
.
Renderer
,
SurfaceTexture
.
OnFrameAvailableListener
{
protected
final
String
LOGTAG
=
"MyGLRendererBase"
;
protected
int
frameCounter
;
protected
long
lastNanoTime
;
protected
SurfaceTexture
mSTex
;
protected
MyGLSurfaceView
mView
;
protected
TextView
mFpsText
;
protected
boolean
mGLInit
=
false
;
protected
boolean
mTexUpdate
=
false
;
MyGLRendererBase
(
MyGLSurfaceView
view
)
{
mView
=
view
;
}
protected
abstract
void
openCamera
();
protected
abstract
void
closeCamera
();
protected
abstract
void
setCameraPreviewSize
(
int
width
,
int
height
);
public
void
setFpsTextView
(
TextView
fpsTV
)
{
mFpsText
=
fpsTV
;
}
public
void
onResume
()
{
Log
.
i
(
LOGTAG
,
"onResume"
);
frameCounter
=
0
;
lastNanoTime
=
System
.
nanoTime
();
}
public
void
onPause
()
{
Log
.
i
(
LOGTAG
,
"onPause"
);
mGLInit
=
false
;
mTexUpdate
=
false
;
closeCamera
();
if
(
mSTex
!=
null
)
{
mSTex
.
release
();
mSTex
=
null
;
NativeGLRenderer
.
closeGL
();
}
}
@Override
public
synchronized
void
onFrameAvailable
(
SurfaceTexture
surfaceTexture
)
{
//Log.i(LOGTAG, "onFrameAvailable");
mTexUpdate
=
true
;
mView
.
requestRender
();
}
@Override
public
void
onDrawFrame
(
GL10
gl
)
{
//Log.i(LOGTAG, "onDrawFrame");
if
(!
mGLInit
)
return
;
synchronized
(
this
)
{
if
(
mTexUpdate
)
{
mSTex
.
updateTexImage
();
mTexUpdate
=
false
;
}
}
NativeGLRenderer
.
drawFrame
();
// log FPS
frameCounter
++;
if
(
frameCounter
>=
10
)
{
final
int
fps
=
(
int
)
(
frameCounter
*
1
e9
/
(
System
.
nanoTime
()
-
lastNanoTime
));
Log
.
i
(
LOGTAG
,
"drawFrame() FPS: "
+
fps
);
if
(
mFpsText
!=
null
)
{
Runnable
fpsUpdater
=
new
Runnable
()
{
public
void
run
()
{
mFpsText
.
setText
(
"FPS: "
+
fps
);
}
};
new
Handler
(
Looper
.
getMainLooper
()).
post
(
fpsUpdater
);
}
frameCounter
=
0
;
lastNanoTime
=
System
.
nanoTime
();
}
}
@Override
public
void
onSurfaceChanged
(
GL10
gl
,
int
surfaceWidth
,
int
surfaceHeight
)
{
Log
.
i
(
LOGTAG
,
"onSurfaceChanged("
+
surfaceWidth
+
"x"
+
surfaceHeight
+
")"
);
NativeGLRenderer
.
changeSize
(
surfaceWidth
,
surfaceHeight
);
setCameraPreviewSize
(
surfaceWidth
,
surfaceHeight
);
}
@Override
public
void
onSurfaceCreated
(
GL10
gl
,
EGLConfig
config
)
{
Log
.
i
(
LOGTAG
,
"onSurfaceCreated"
);
String
strGLVersion
=
GLES20
.
glGetString
(
GLES20
.
GL_VERSION
);
if
(
strGLVersion
!=
null
)
Log
.
i
(
LOGTAG
,
"OpenGL ES version: "
+
strGLVersion
);
int
hTex
=
NativeGLRenderer
.
initGL
();
mSTex
=
new
SurfaceTexture
(
hTex
);
mSTex
.
setOnFrameAvailableListener
(
this
);
openCamera
();
mGLInit
=
true
;
}
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLSurfaceView.java
View file @
a0411054
package
org
.
opencv
.
samples
.
tutorial4
;
import
org.opencv.android.CameraGLSurfaceView
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.opengl.GLSurfaceView
;
import
android.os.Handler
;
import
android.os.Looper
;
import
android.util.AttributeSet
;
import
android.util.Log
;
import
android.view.MotionEvent
;
import
android.view.SurfaceHolder
;
import
android.widget.TextView
;
import
android.widget.Toast
;
public
class
MyGLSurfaceView
extends
GLSurfaceView
{
public
class
MyGLSurfaceView
extends
CameraGLSurfaceView
implements
CameraGLSurfaceView
.
CameraTextureListener
{
MyGLRendererBase
mRenderer
;
static
final
String
LOGTAG
=
"MyGLSurfaceView"
;
protected
int
procMode
=
NativePart
.
PROCESSING_MODE_NO_PROCESSING
;
static
final
String
[]
procModeName
=
new
String
[]
{
"No Processing"
,
"CPU"
,
"OpenCL Direct"
,
"OpenCL via OpenCV"
};
protected
int
frameCounter
;
protected
long
lastNanoTime
;
TextView
mFpsText
=
null
;
public
MyGLSurfaceView
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
if
(
android
.
os
.
Build
.
VERSION
.
SDK_INT
>=
21
)
mRenderer
=
new
Camera2Renderer
(
this
);
else
mRenderer
=
new
CameraRenderer
(
this
);
setEGLContextClientVersion
(
2
);
setRenderer
(
mRenderer
);
setRenderMode
(
GLSurfaceView
.
RENDERMODE_WHEN_DIRTY
);
}
public
void
setFpsTextView
(
TextView
tv
)
{
mRenderer
.
setFpsTextView
(
tv
);
@Override
public
boolean
onTouchEvent
(
MotionEvent
e
)
{
if
(
e
.
getAction
()
==
MotionEvent
.
ACTION_DOWN
)
((
Activity
)
getContext
()).
openOptionsMenu
();
return
true
;
}
@Override
public
void
surfaceCreated
(
SurfaceHolder
holder
)
{
super
.
surfaceCreated
(
holder
);
//NativePart.initCL();
}
@Override
public
void
surfaceDestroyed
(
SurfaceHolder
holder
)
{
//NativePart.closeCL();
super
.
surfaceDestroyed
(
holder
);
}
@Override
public
void
surfaceChanged
(
SurfaceHolder
holder
,
int
format
,
int
w
,
int
h
)
{
super
.
surfaceChanged
(
holder
,
format
,
w
,
h
);
public
void
setProcessingMode
(
int
newMode
)
{
if
(
newMode
>=
0
&&
newMode
<
procModeName
.
length
)
procMode
=
newMode
;
else
Log
.
e
(
LOGTAG
,
"Ignoring invalid processing mode: "
+
newMode
);
((
Activity
)
getContext
()).
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
Toast
.
makeText
(
getContext
(),
"Selected mode: "
+
procModeName
[
procMode
],
Toast
.
LENGTH_LONG
).
show
();
}
});
}
@Override
public
void
onResume
()
{
super
.
onResume
();
mRenderer
.
onResume
();
public
void
onCameraViewStarted
(
int
width
,
int
height
)
{
((
Activity
)
getContext
()).
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
Toast
.
makeText
(
getContext
(),
"onCameraViewStarted"
,
Toast
.
LENGTH_SHORT
).
show
();
}
});
NativePart
.
initCL
();
frameCounter
=
0
;
lastNanoTime
=
System
.
nanoTime
();
}
@Override
public
void
onPause
()
{
mRenderer
.
onPause
();
super
.
onPause
();
public
void
onCameraViewStopped
()
{
((
Activity
)
getContext
()).
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
Toast
.
makeText
(
getContext
(),
"onCameraViewStopped"
,
Toast
.
LENGTH_SHORT
).
show
();
}
});
}
@Override
public
boolean
onTouchEvent
(
MotionEvent
e
)
{
if
(
e
.
getAction
()
==
MotionEvent
.
ACTION_DOWN
)
((
Activity
)
getContext
()).
openOptionsMenu
();
public
boolean
onCameraTexture
(
int
texIn
,
int
texOut
,
int
width
,
int
height
)
{
// FPS
frameCounter
++;
if
(
frameCounter
>=
30
)
{
final
int
fps
=
(
int
)
(
frameCounter
*
1
e9
/
(
System
.
nanoTime
()
-
lastNanoTime
));
Log
.
i
(
LOGTAG
,
"drawFrame() FPS: "
+
fps
);
if
(
mFpsText
!=
null
)
{
Runnable
fpsUpdater
=
new
Runnable
()
{
public
void
run
()
{
mFpsText
.
setText
(
"FPS: "
+
fps
);
}
};
new
Handler
(
Looper
.
getMainLooper
()).
post
(
fpsUpdater
);
}
else
{
Log
.
d
(
LOGTAG
,
"mFpsText == null"
);
mFpsText
=
(
TextView
)((
Activity
)
getContext
()).
findViewById
(
R
.
id
.
fps_text_view
);
}
frameCounter
=
0
;
lastNanoTime
=
System
.
nanoTime
();
}
if
(
procMode
==
NativePart
.
PROCESSING_MODE_NO_PROCESSING
)
return
false
;
NativePart
.
processFrame
(
texIn
,
texOut
,
width
,
height
,
procMode
);
return
true
;
}
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Native
GLRenderer
.java
→
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Native
Part
.java
View file @
a0411054
package
org
.
opencv
.
samples
.
tutorial4
;
public
class
Native
GLRenderer
{
public
class
Native
Part
{
static
{
System
.
loadLibrary
(
"opencv_java3"
);
System
.
loadLibrary
(
"JNI
render
"
);
System
.
loadLibrary
(
"JNI
part
"
);
}
public
static
final
int
PROCESSING_MODE_NO_PROCESSING
=
0
;
...
...
@@ -12,9 +12,7 @@ public class NativeGLRenderer {
public
static
final
int
PROCESSING_MODE_OCL_DIRECT
=
2
;
public
static
final
int
PROCESSING_MODE_OCL_OCV
=
3
;
public
static
native
int
initGL
();
public
static
native
void
closeGL
();
public
static
native
void
drawFrame
();
public
static
native
void
changeSize
(
int
width
,
int
height
);
public
static
native
void
setProcessingMode
(
int
mode
);
public
static
native
int
initCL
();
public
static
native
void
closeCL
();
public
static
native
void
processFrame
(
int
tex1
,
int
tex2
,
int
w
,
int
h
,
int
mode
);
}
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Tutorial4Activity.java
View file @
a0411054
...
...
@@ -29,8 +29,8 @@ public class Tutorial4Activity extends Activity {
//setContentView(mView);
setContentView
(
R
.
layout
.
activity
);
mView
=
(
MyGLSurfaceView
)
findViewById
(
R
.
id
.
my_gl_surface_view
);
mView
.
setCameraTextureListener
(
mView
);
TextView
tv
=
(
TextView
)
findViewById
(
R
.
id
.
fps_text_view
);
mView
.
setFpsTextView
(
tv
);
mProcMode
=
(
TextView
)
findViewById
(
R
.
id
.
proc_mode_text_view
);
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
...
...
@@ -38,7 +38,8 @@ public class Tutorial4Activity extends Activity {
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_NO_PROCESSING
);
}
mView
.
setProcessingMode
(
NativePart
.
PROCESSING_MODE_NO_PROCESSING
);
}
@Override
protected
void
onPause
()
{
...
...
@@ -68,7 +69,7 @@ public class Tutorial4Activity extends Activity {
mProcMode
.
setText
(
"Processing mode: No Processing"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_NO_PROCESSING
);
mView
.
setProcessingMode
(
NativePart
.
PROCESSING_MODE_NO_PROCESSING
);
return
true
;
case
R
.
id
.
cpu
:
runOnUiThread
(
new
Runnable
()
{
...
...
@@ -76,7 +77,7 @@ public class Tutorial4Activity extends Activity {
mProcMode
.
setText
(
"Processing mode: CPU"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_CPU
);
mView
.
setProcessingMode
(
NativePart
.
PROCESSING_MODE_CPU
);
return
true
;
case
R
.
id
.
ocl_direct
:
runOnUiThread
(
new
Runnable
()
{
...
...
@@ -84,7 +85,7 @@ public class Tutorial4Activity extends Activity {
mProcMode
.
setText
(
"Processing mode: OpenCL direct"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_OCL_DIRECT
);
mView
.
setProcessingMode
(
NativePart
.
PROCESSING_MODE_OCL_DIRECT
);
return
true
;
case
R
.
id
.
ocl_ocv
:
runOnUiThread
(
new
Runnable
()
{
...
...
@@ -92,7 +93,7 @@ public class Tutorial4Activity extends Activity {
mProcMode
.
setText
(
"Processing mode: OpenCL via OpenCV (TAPI)"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_OCL_OCV
);
mView
.
setProcessingMode
(
NativePart
.
PROCESSING_MODE_OCL_OCV
);
return
true
;
default
:
return
false
;
...
...
This diff is collapsed.
Click to expand it.
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