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
d789c810
Commit
d789c810
authored
Aug 12, 2015
by
Alexander Alekhin
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #4239 from apavlenko:android_ocl_sample2
parents
cb324b4e
56bde913
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
869 additions
and
0 deletions
+869
-0
.classpath
samples/android/tutorial-4-opencl/.classpath
+9
-0
.cproject
samples/android/tutorial-4-opencl/.cproject
+61
-0
.project
samples/android/tutorial-4-opencl/.project
+49
-0
org.eclipse.jdt.core.prefs
...id/tutorial-4-opencl/.settings/org.eclipse.jdt.core.prefs
+4
-0
AndroidManifest.xml
samples/android/tutorial-4-opencl/AndroidManifest.xml
+32
-0
CMakeLists.txt
samples/android/tutorial-4-opencl/CMakeLists.txt
+12
-0
Android.mk
samples/android/tutorial-4-opencl/jni/Android.mk
+20
-0
Application.mk
samples/android/tutorial-4-opencl/jni/Application.mk
+4
-0
CLprocessor.cpp
samples/android/tutorial-4-opencl/jni/CLprocessor.cpp
+212
-0
GLrender.cpp
samples/android/tutorial-4-opencl/jni/GLrender.cpp
+0
-0
common.hpp
samples/android/tutorial-4-opencl/jni/common.hpp
+19
-0
jni.c
samples/android/tutorial-4-opencl/jni/jni.c
+32
-0
lint.xml
samples/android/tutorial-4-opencl/lint.xml
+4
-0
icon.png
samples/android/tutorial-4-opencl/res/drawable/icon.png
+0
-0
activity.xml
samples/android/tutorial-4-opencl/res/layout/activity.xml
+26
-0
menu.xml
samples/android/tutorial-4-opencl/res/menu/menu.xml
+8
-0
strings.xml
samples/android/tutorial-4-opencl/res/values/strings.xml
+6
-0
Camera2Renderer.java
...ncl/src/org/opencv/samples/tutorial4/Camera2Renderer.java
+0
-0
CameraRenderer.java
...encl/src/org/opencv/samples/tutorial4/CameraRenderer.java
+75
-0
MyGLRendererBase.java
...cl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java
+118
-0
MyGLSurfaceView.java
...ncl/src/org/opencv/samples/tutorial4/MyGLSurfaceView.java
+65
-0
NativeGLRenderer.java
...cl/src/org/opencv/samples/tutorial4/NativeGLRenderer.java
+19
-0
Tutorial4Activity.java
...l/src/org/opencv/samples/tutorial4/Tutorial4Activity.java
+94
-0
No files found.
samples/android/tutorial-4-opencl/.classpath
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry
kind=
"con"
path=
"com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"
/>
<classpathentry
exported=
"true"
kind=
"con"
path=
"com.android.ide.eclipse.adt.LIBRARIES"
/>
<classpathentry
exported=
"true"
kind=
"con"
path=
"com.android.ide.eclipse.adt.DEPENDENCIES"
/>
<classpathentry
kind=
"src"
path=
"src"
/>
<classpathentry
kind=
"src"
path=
"gen"
/>
<classpathentry
kind=
"output"
path=
"bin/classes"
/>
</classpath>
samples/android/tutorial-4-opencl/.cproject
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<?fileVersion 4.0.0?>
<cproject
storage_type_id=
"org.eclipse.cdt.core.XmlProjectDescriptionStorage"
>
<storageModule
moduleId=
"org.eclipse.cdt.core.settings"
>
<cconfiguration
id=
"com.android.toolchain.gcc.2119826334"
>
<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.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"
/>
<extension
id=
"org.eclipse.cdt.core.MakeErrorParser"
point=
"org.eclipse.cdt.core.ErrorParser"
/>
<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"
>
<configuration
artifactName=
"${ProjName}"
buildProperties=
""
description=
""
id=
"com.android.toolchain.gcc.2119826334"
name=
"Default"
parent=
"org.eclipse.cdt.build.core.emptycfg"
>
<folderInfo
id=
"com.android.toolchain.gcc.2119826334.1853372756"
name=
"/"
resourcePath=
""
>
<toolChain
id=
"com.android.toolchain.gcc.344648270"
name=
"com.android.toolchain.gcc"
superClass=
"com.android.toolchain.gcc"
>
<targetPlatform
binaryParser=
"org.eclipse.cdt.core.ELF"
id=
"com.android.targetPlatform.443518540"
isAbstract=
"false"
superClass=
"com.android.targetPlatform"
/>
<builder
command=
"ndk-build.cmd"
id=
"com.android.builder.1393780489"
keepEnvironmentInBuildfile=
"false"
managedBuildOn=
"false"
name=
"Android Builder"
superClass=
"com.android.builder"
>
<outputEntries>
<entry
flags=
"VALUE_WORKSPACE_PATH|RESOLVED"
kind=
"outputPath"
name=
"obj"
/>
<entry
flags=
"VALUE_WORKSPACE_PATH|RESOLVED"
kind=
"outputPath"
name=
"libs"
/>
</outputEntries>
</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"
/>
</option>
<inputType
id=
"com.android.gcc.inputType.193477776"
superClass=
"com.android.gcc.inputType"
/>
</tool>
</toolChain>
</folderInfo>
<sourceEntries>
<entry
flags=
"VALUE_WORKSPACE_PATH|RESOLVED"
kind=
"sourcePath"
name=
"jni"
/>
</sourceEntries>
</configuration>
</storageModule>
<storageModule
moduleId=
"org.eclipse.cdt.core.externalSettings"
/>
</cconfiguration>
</storageModule>
<storageModule
moduleId=
"cdtBuildSystem"
version=
"4.0.0"
>
<project
id=
"tutorial-4-opencl.null.126354959"
name=
"tutorial-4-opencl"
/>
</storageModule>
<storageModule
moduleId=
"org.eclipse.cdt.core.LanguageSettingsProviders"
/>
<storageModule
moduleId=
"scannerConfiguration"
>
<autodiscovery
enabled=
"true"
problemReportingEnabled=
"true"
selectedProfileId=
""
/>
<scannerConfigBuildInfo
instanceId=
"com.android.toolchain.gcc.2119826334;com.android.toolchain.gcc.2119826334.1853372756;com.android.gcc.compiler.1725706653;com.android.gcc.inputType.193477776"
>
<autodiscovery
enabled=
"true"
problemReportingEnabled=
"true"
selectedProfileId=
"com.android.AndroidPerProjectProfile"
/>
</scannerConfigBuildInfo>
</storageModule>
<storageModule
moduleId=
"refreshScope"
versionNumber=
"2"
>
<configuration
configurationName=
"Default"
>
<resource
resourceType=
"FOLDER"
workspacePath=
"/tutorial-4-opencl/jni"
/>
</configuration>
</storageModule>
<storageModule
moduleId=
"org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"
/>
</cproject>
samples/android/tutorial-4-opencl/.project
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>
OpenCV Tutorial 4 - Use OpenCL
</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>
org.eclipse.cdt.managedbuilder.core.genmakebuilder
</name>
<triggers>
clean,full,incremental,
</triggers>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>
com.android.ide.eclipse.adt.ResourceManagerBuilder
</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>
com.android.ide.eclipse.adt.PreCompilerBuilder
</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>
org.eclipse.jdt.core.javabuilder
</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>
com.android.ide.eclipse.adt.ApkBuilder
</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>
org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
</name>
<triggers>
full,incremental,
</triggers>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>
com.android.ide.eclipse.adt.AndroidNature
</nature>
<nature>
org.eclipse.jdt.core.javanature
</nature>
<nature>
org.eclipse.cdt.core.cnature
</nature>
<nature>
org.eclipse.cdt.core.ccnature
</nature>
<nature>
org.eclipse.cdt.managedbuilder.core.managedBuildNature
</nature>
<nature>
org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
</nature>
</natures>
</projectDescription>
samples/android/tutorial-4-opencl/.settings/org.eclipse.jdt.core.prefs
0 → 100644
View file @
d789c810
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.source=1.6
samples/android/tutorial-4-opencl/AndroidManifest.xml
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"org.opencv.samples.tutorial4"
android:versionCode=
"1"
android:versionName=
"1.0"
>
<uses-sdk
android:minSdkVersion=
"14"
android:targetSdkVersion=
"21"
/>
<uses-feature
android:glEsVersion=
"0x00020000"
android:required=
"true"
/>
<uses-feature
android:name=
"android.hardware.camera"
/>
<uses-feature
android:name=
"android.hardware.camera2"
android:required=
"false"
/>
<uses-permission
android:name=
"android.permission.CAMERA"
/>
<application
android:allowBackup=
"true"
android:icon=
"@drawable/icon"
android:theme=
"@android:style/Theme.NoTitleBar.Fullscreen"
>
<activity
android:name=
".Tutorial4Activity"
android:label=
"@string/app_name"
android:screenOrientation=
"landscape"
android:configChanges=
"keyboardHidden|orientation"
>
<intent-filter>
<action
android:name=
"android.intent.action.MAIN"
/>
<category
android:name=
"android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
</manifest>
samples/android/tutorial-4-opencl/CMakeLists.txt
0 → 100644
View file @
d789c810
set
(
sample example-tutorial-4-opencl
)
if
(
BUILD_FAT_JAVA_LIB
)
set
(
native_deps opencv_java
)
else
()
set
(
native_deps opencv_imgproc
)
endif
()
add_android_project
(
${
sample
}
"
${
CMAKE_CURRENT_SOURCE_DIR
}
"
LIBRARY_DEPS
${
OpenCV_BINARY_DIR
}
SDK_TARGET 21
${
ANDROID_SDK_TARGET
}
NATIVE_DEPS
${
native_deps
}
)
if
(
TARGET
${
sample
}
)
add_dependencies
(
opencv_android_examples
${
sample
}
)
endif
()
samples/android/tutorial-4-opencl/jni/Android.mk
0 → 100644
View file @
d789c810
LOCAL_PATH := $(call my-dir)
# add OpenCV
include $(CLEAR_VARS)
OPENCV_INSTALL_MODULES:=on
ifeq ($(O4A_SDK_ROOT),)
include ../../sdk/native/jni/OpenCV.mk
else
include $(O4A_SDK_ROOT)/sdk/native/jni/OpenCV.mk
endif
# add OpenCL
LOCAL_C_INCLUDES += $(OPENCL_SDK)/include
LOCAL_LDLIBS += -L$(OPENCL_SDK)/lib/$(TARGET_ARCH_ABI) -lOpenCL
LOCAL_MODULE := JNIrender
LOCAL_SRC_FILES := jni.c GLrender.cpp CLprocessor.cpp
LOCAL_LDLIBS += -llog -lGLESv2 -lEGL
include $(BUILD_SHARED_LIBRARY)
\ No newline at end of file
samples/android/tutorial-4-opencl/jni/Application.mk
0 → 100644
View file @
d789c810
APP_STL := gnustl_static
APP_GNUSTL_FORCE_CPP_FEATURES := exceptions rtti
APP_ABI := armeabi-v7a
APP_PLATFORM := android-14
samples/android/tutorial-4-opencl/jni/CLprocessor.cpp
0 → 100644
View file @
d789c810
#define __CL_ENABLE_EXCEPTIONS
#include <CL/cl.hpp>
#include <EGL/egl.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
#include "common.hpp"
const
char
oclProgB2B
[]
=
"// clBuffer to clBuffer"
;
const
char
oclProgI2B
[]
=
"// clImage to clBuffer"
;
const
char
oclProgI2I
[]
=
\
"__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
\n
"
\
"
\n
"
\
"__kernel void Laplacian(
\n
"
\
" __read_only image2d_t imgIn,
\n
"
\
" __write_only image2d_t imgOut
\n
"
\
" ) {
\n
"
\
"
\n
"
\
" const int2 pos = {get_global_id(0), get_global_id(1)};
\n
"
\
"
\n
"
\
" float4 sum = (float4) 0.0f;
\n
"
\
" sum += read_imagef(imgIn, sampler, pos + (int2)(-1,0));
\n
"
\
" sum += read_imagef(imgIn, sampler, pos + (int2)(+1,0));
\n
"
\
" sum += read_imagef(imgIn, sampler, pos + (int2)(0,-1));
\n
"
\
" sum += read_imagef(imgIn, sampler, pos + (int2)(0,+1));
\n
"
\
" sum -= read_imagef(imgIn, sampler, pos) * 4;
\n
"
\
"
\n
"
\
" write_imagef(imgOut, pos, sum*10);
\n
"
\
"}
\n
"
;
void
dumpCLinfo
()
{
LOGD
(
"*** OpenCL info ***"
);
try
{
std
::
vector
<
cl
::
Platform
>
platforms
;
cl
::
Platform
::
get
(
&
platforms
);
LOGD
(
"OpenCL info: Found %d OpenCL platforms"
,
platforms
.
size
());
for
(
int
i
=
0
;
i
<
platforms
.
size
();
++
i
)
{
std
::
string
name
=
platforms
[
i
].
getInfo
<
CL_PLATFORM_NAME
>
();
std
::
string
version
=
platforms
[
i
].
getInfo
<
CL_PLATFORM_VERSION
>
();
std
::
string
profile
=
platforms
[
i
].
getInfo
<
CL_PLATFORM_PROFILE
>
();
std
::
string
extensions
=
platforms
[
i
].
getInfo
<
CL_PLATFORM_EXTENSIONS
>
();
LOGD
(
"OpenCL info: Platform[%d] = %s, ver = %s, prof = %s, ext = %s"
,
i
,
name
.
c_str
(),
version
.
c_str
(),
profile
.
c_str
(),
extensions
.
c_str
()
);
}
std
::
vector
<
cl
::
Device
>
devices
;
platforms
[
0
].
getDevices
(
CL_DEVICE_TYPE_ALL
,
&
devices
);
for
(
int
i
=
0
;
i
<
devices
.
size
();
++
i
)
{
std
::
string
name
=
devices
[
i
].
getInfo
<
CL_DEVICE_NAME
>
();
std
::
string
extensions
=
devices
[
i
].
getInfo
<
CL_DEVICE_EXTENSIONS
>
();
cl_ulong
type
=
devices
[
i
].
getInfo
<
CL_DEVICE_TYPE
>
();
LOGD
(
"OpenCL info: Device[%d] = %s (%s), ext = %s"
,
i
,
name
.
c_str
(),
(
type
==
CL_DEVICE_TYPE_GPU
?
"GPU"
:
"CPU"
),
extensions
.
c_str
()
);
}
}
catch
(
cl
::
Error
&
e
)
{
LOGE
(
"OpenCL info: error while gathering OpenCL info: %s (%d)"
,
e
.
what
(),
e
.
err
()
);
}
catch
(
std
::
exception
&
e
)
{
LOGE
(
"OpenCL info: error while gathering OpenCL info: %s"
,
e
.
what
()
);
}
catch
(...)
{
LOGE
(
"OpenCL info: unknown error while gathering OpenCL info"
);
}
LOGD
(
"*******************"
);
}
cl
::
Context
theContext
;
cl
::
CommandQueue
theQueue
;
cl
::
Program
theProgB2B
,
theProgI2B
,
theProgI2I
;
void
initCL
()
{
dumpCLinfo
();
EGLDisplay
mEglDisplay
=
eglGetCurrentDisplay
();
if
(
mEglDisplay
==
EGL_NO_DISPLAY
)
LOGE
(
"initCL: eglGetCurrentDisplay() returned 'EGL_NO_DISPLAY', error = %x"
,
eglGetError
());
EGLContext
mEglContext
=
eglGetCurrentContext
();
if
(
mEglContext
==
EGL_NO_CONTEXT
)
LOGE
(
"initCL: eglGetCurrentContext() returned 'EGL_NO_CONTEXT', error = %x"
,
eglGetError
());
cl_context_properties
props
[]
=
{
CL_GL_CONTEXT_KHR
,
(
cl_context_properties
)
mEglContext
,
CL_EGL_DISPLAY_KHR
,
(
cl_context_properties
)
mEglDisplay
,
CL_CONTEXT_PLATFORM
,
0
,
0
};
try
{
cl
::
Platform
p
=
cl
::
Platform
::
getDefault
();
std
::
string
ext
=
p
.
getInfo
<
CL_PLATFORM_EXTENSIONS
>
();
if
(
ext
.
find
(
"cl_khr_gl_sharing"
)
==
std
::
string
::
npos
)
LOGE
(
"Warning: CL-GL sharing isn't supported by PLATFORM"
);
props
[
5
]
=
(
cl_context_properties
)
p
();
theContext
=
cl
::
Context
(
CL_DEVICE_TYPE_GPU
,
props
);
std
::
vector
<
cl
::
Device
>
devs
=
theContext
.
getInfo
<
CL_CONTEXT_DEVICES
>
();
LOGD
(
"Context returned %d devices, taking the 1st one"
,
devs
.
size
());
ext
=
devs
[
0
].
getInfo
<
CL_DEVICE_EXTENSIONS
>
();
if
(
ext
.
find
(
"cl_khr_gl_sharing"
)
==
std
::
string
::
npos
)
LOGE
(
"Warning: CL-GL sharing isn't supported by DEVICE"
);
theQueue
=
cl
::
CommandQueue
(
theContext
,
devs
[
0
]);
cl
::
Program
::
Sources
src
(
1
,
std
::
make_pair
(
oclProgI2I
,
sizeof
(
oclProgI2I
)));
theProgI2I
=
cl
::
Program
(
theContext
,
src
);
theProgI2I
.
build
(
devs
);
cv
::
ocl
::
attachContext
(
p
.
getInfo
<
CL_PLATFORM_NAME
>
(),
p
(),
theContext
(),
devs
[
0
]());
if
(
cv
::
ocl
::
useOpenCL
()
)
LOGD
(
"OpenCV+OpenCL works OK!"
);
else
LOGE
(
"Can't init OpenCV with OpenCL TAPI"
);
}
catch
(
cl
::
Error
&
e
)
{
LOGE
(
"cl::Error: %s (%d)"
,
e
.
what
(),
e
.
err
());
}
catch
(
std
::
exception
&
e
)
{
LOGE
(
"std::exception: %s"
,
e
.
what
());
}
catch
(...)
{
LOGE
(
"OpenCL info: unknown error while initializing OpenCL stuff"
);
}
LOGD
(
"initCL completed"
);
}
void
closeCL
()
{
}
#define GL_TEXTURE_2D 0x0DE1
void
procOCL_I2I
(
int
texIn
,
int
texOut
,
int
w
,
int
h
)
{
LOGD
(
"procOCL_I2I(%d, %d, %d, %d)"
,
texIn
,
texOut
,
w
,
h
);
cl
::
ImageGL
imgIn
(
theContext
,
CL_MEM_READ_ONLY
,
GL_TEXTURE_2D
,
0
,
texIn
);
cl
::
ImageGL
imgOut
(
theContext
,
CL_MEM_WRITE_ONLY
,
GL_TEXTURE_2D
,
0
,
texOut
);
std
::
vector
<
cl
::
Memory
>
images
;
images
.
push_back
(
imgIn
);
images
.
push_back
(
imgOut
);
int64_t
t
=
getTimeMs
();
theQueue
.
enqueueAcquireGLObjects
(
&
images
);
theQueue
.
finish
();
LOGD
(
"enqueueAcquireGLObjects() costs %d ms"
,
getTimeInterval
(
t
));
t
=
getTimeMs
();
cl
::
Kernel
Laplacian
(
theProgI2I
,
"Laplacian"
);
//TODO: may be done once
Laplacian
.
setArg
(
0
,
imgIn
);
Laplacian
.
setArg
(
1
,
imgOut
);
theQueue
.
finish
();
LOGD
(
"Kernel() costs %d ms"
,
getTimeInterval
(
t
));
t
=
getTimeMs
();
theQueue
.
enqueueNDRangeKernel
(
Laplacian
,
cl
::
NullRange
,
cl
::
NDRange
(
w
,
h
),
cl
::
NullRange
);
theQueue
.
finish
();
LOGD
(
"enqueueNDRangeKernel() costs %d ms"
,
getTimeInterval
(
t
));
t
=
getTimeMs
();
theQueue
.
enqueueReleaseGLObjects
(
&
images
);
theQueue
.
finish
();
LOGD
(
"enqueueReleaseGLObjects() costs %d ms"
,
getTimeInterval
(
t
));
}
void
procOCL_OCV
(
int
tex
,
int
w
,
int
h
)
{
int64_t
t
=
getTimeMs
();
cl
::
ImageGL
imgIn
(
theContext
,
CL_MEM_READ_ONLY
,
GL_TEXTURE_2D
,
0
,
tex
);
std
::
vector
<
cl
::
Memory
>
images
(
1
,
imgIn
);
theQueue
.
enqueueAcquireGLObjects
(
&
images
);
theQueue
.
finish
();
cv
::
UMat
uIn
,
uOut
,
uTmp
;
cv
::
ocl
::
convertFromImage
(
imgIn
(),
uIn
);
LOGD
(
"loading texture data to OpenCV UMat costs %d ms"
,
getTimeInterval
(
t
));
theQueue
.
enqueueReleaseGLObjects
(
&
images
);
t
=
getTimeMs
();
//cv::blur(uIn, uOut, cv::Size(5, 5));
cv
::
Laplacian
(
uIn
,
uTmp
,
CV_8U
);
cv:
multiply
(
uTmp
,
10
,
uOut
);
cv
::
ocl
::
finish
();
LOGD
(
"OpenCV processing costs %d ms"
,
getTimeInterval
(
t
));
t
=
getTimeMs
();
cl
::
ImageGL
imgOut
(
theContext
,
CL_MEM_WRITE_ONLY
,
GL_TEXTURE_2D
,
0
,
tex
);
images
.
clear
();
images
.
push_back
(
imgOut
);
theQueue
.
enqueueAcquireGLObjects
(
&
images
);
cl_mem
clBuffer
=
(
cl_mem
)
uOut
.
handle
(
cv
::
ACCESS_READ
);
cl_command_queue
q
=
(
cl_command_queue
)
cv
::
ocl
::
Queue
::
getDefault
().
ptr
();
size_t
offset
=
0
;
size_t
origin
[
3
]
=
{
0
,
0
,
0
};
size_t
region
[
3
]
=
{
w
,
h
,
1
};
CV_Assert
(
clEnqueueCopyBufferToImage
(
q
,
clBuffer
,
imgOut
(),
offset
,
origin
,
region
,
0
,
NULL
,
NULL
)
==
CL_SUCCESS
);
theQueue
.
enqueueReleaseGLObjects
(
&
images
);
cv
::
ocl
::
finish
();
LOGD
(
"uploading results to texture costs %d ms"
,
getTimeInterval
(
t
));
}
samples/android/tutorial-4-opencl/jni/GLrender.cpp
0 → 100644
View file @
d789c810
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/jni/common.hpp
0 → 100644
View file @
d789c810
#include <android/log.h>
#define LOG_TAG "JNIRenderer"
//#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__))
#include <time.h> // clock_gettime
static
inline
int64_t
getTimeMs
()
{
struct
timespec
now
;
clock_gettime
(
CLOCK_MONOTONIC
,
&
now
);
return
(
int64_t
)
now
.
tv_sec
*
1000
+
now
.
tv_nsec
/
1000000
;
}
static
inline
int
getTimeInterval
(
int64_t
startTime
)
{
return
int
(
getTimeMs
()
-
startTime
);
}
samples/android/tutorial-4-opencl/jni/jni.c
0 → 100644
View file @
d789c810
#include <jni.h>
int
initGL
();
void
closeGL
();
void
changeSize
(
int
width
,
int
height
);
void
drawFrame
();
void
setProcessingMode
(
int
mode
);
JNIEXPORT
jint
JNICALL
Java_org_opencv_samples_tutorial4_NativeGLRenderer_initGL
(
JNIEnv
*
env
,
jclass
cls
)
{
return
initGL
();
}
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_NativeGLRenderer_closeGL
(
JNIEnv
*
env
,
jclass
cls
)
{
closeGL
();
}
JNIEXPORT
void
JNICALL
Java_org_opencv_samples_tutorial4_NativeGLRenderer_changeSize
(
JNIEnv
*
env
,
jclass
cls
,
jint
width
,
jint
height
)
{
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
);
}
samples/android/tutorial-4-opencl/lint.xml
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="UTF-8"?>
<lint>
</lint>
\ No newline at end of file
samples/android/tutorial-4-opencl/res/drawable/icon.png
0 → 100644
View file @
d789c810
1.95 KB
samples/android/tutorial-4-opencl/res/layout/activity.xml
0 → 100644
View file @
d789c810
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
>
<org.opencv.samples.tutorial4.MyGLSurfaceView
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:id=
"@+id/my_gl_surface_view"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"match_parent"
android:orientation =
"vertical"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:id=
"@+id/fps_text_view"
android:text=
"FPS:"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:id=
"@+id/proc_mode_text_view"
android:text=
"Processing mode:"
/>
</LinearLayout>
</FrameLayout>
samples/android/tutorial-4-opencl/res/menu/menu.xml
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<group
android:checkableBehavior=
"single"
>
<item
android:id=
"@+id/cpu"
android:title=
"Use CPU code"
/>
<item
android:id=
"@+id/ocl_direct"
android:title=
"Use OpenCL direct"
/>
<item
android:id=
"@+id/ocl_ocv"
android:title=
"Use OpenCL via OpenCV"
/>
</group>
</menu>
samples/android/tutorial-4-opencl/res/values/strings.xml
0 → 100644
View file @
d789c810
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string
name=
"app_name"
>
OpenCV Tutorial 4 - Use OpenCL
</string>
</resources>
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Camera2Renderer.java
0 → 100644
View file @
d789c810
This diff is collapsed.
Click to expand it.
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/CameraRenderer.java
0 → 100644
View file @
d789c810
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
;
}
}
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLRendererBase.java
0 → 100644
View file @
d789c810
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.view.View
;
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
;
}
}
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/MyGLSurfaceView.java
0 → 100644
View file @
d789c810
package
org
.
opencv
.
samples
.
tutorial4
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.opengl.GLSurfaceView
;
import
android.util.AttributeSet
;
import
android.view.MotionEvent
;
import
android.view.SurfaceHolder
;
import
android.widget.TextView
;
public
class
MyGLSurfaceView
extends
GLSurfaceView
{
MyGLRendererBase
mRenderer
;
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
void
surfaceCreated
(
SurfaceHolder
holder
)
{
super
.
surfaceCreated
(
holder
);
}
@Override
public
void
surfaceDestroyed
(
SurfaceHolder
holder
)
{
super
.
surfaceDestroyed
(
holder
);
}
@Override
public
void
surfaceChanged
(
SurfaceHolder
holder
,
int
format
,
int
w
,
int
h
)
{
super
.
surfaceChanged
(
holder
,
format
,
w
,
h
);
}
@Override
public
void
onResume
()
{
super
.
onResume
();
mRenderer
.
onResume
();
}
@Override
public
void
onPause
()
{
mRenderer
.
onPause
();
super
.
onPause
();
}
@Override
public
boolean
onTouchEvent
(
MotionEvent
e
)
{
if
(
e
.
getAction
()
==
MotionEvent
.
ACTION_DOWN
)
((
Activity
)
getContext
()).
openOptionsMenu
();
return
true
;
}
}
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/NativeGLRenderer.java
0 → 100644
View file @
d789c810
package
org
.
opencv
.
samples
.
tutorial4
;
public
class
NativeGLRenderer
{
static
{
System
.
loadLibrary
(
"opencv_java3"
);
System
.
loadLibrary
(
"JNIrender"
);
}
public
static
final
int
PROCESSING_MODE_CPU
=
1
;
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
);
}
samples/android/tutorial-4-opencl/src/org/opencv/samples/tutorial4/Tutorial4Activity.java
0 → 100644
View file @
d789c810
package
org
.
opencv
.
samples
.
tutorial4
;
import
android.app.Activity
;
import
android.content.pm.ActivityInfo
;
import
android.os.Bundle
;
import
android.view.Menu
;
import
android.view.MenuInflater
;
import
android.view.MenuItem
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
android.widget.TextView
;
public
class
Tutorial4Activity
extends
Activity
{
private
MyGLSurfaceView
mView
;
private
TextView
mProcMode
;
@Override
public
void
onCreate
(
Bundle
savedInstanceState
)
{
super
.
onCreate
(
savedInstanceState
);
requestWindowFeature
(
Window
.
FEATURE_NO_TITLE
);
getWindow
().
setFlags
(
WindowManager
.
LayoutParams
.
FLAG_FULLSCREEN
,
WindowManager
.
LayoutParams
.
FLAG_FULLSCREEN
);
getWindow
().
setFlags
(
WindowManager
.
LayoutParams
.
FLAG_KEEP_SCREEN_ON
,
WindowManager
.
LayoutParams
.
FLAG_KEEP_SCREEN_ON
);
setRequestedOrientation
(
ActivityInfo
.
SCREEN_ORIENTATION_LANDSCAPE
);
//mView = new MyGLSurfaceView(this, null);
//setContentView(mView);
setContentView
(
R
.
layout
.
activity
);
mView
=
(
MyGLSurfaceView
)
findViewById
(
R
.
id
.
my_gl_surface_view
);
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
()
{
mProcMode
.
setText
(
"Processing mode: CPU"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_CPU
);
}
@Override
protected
void
onPause
()
{
mView
.
onPause
();
super
.
onPause
();
}
@Override
protected
void
onResume
()
{
super
.
onResume
();
mView
.
onResume
();
}
@Override
public
boolean
onCreateOptionsMenu
(
Menu
menu
)
{
MenuInflater
inflater
=
getMenuInflater
();
inflater
.
inflate
(
R
.
menu
.
menu
,
menu
);
return
super
.
onCreateOptionsMenu
(
menu
);
}
@Override
public
boolean
onOptionsItemSelected
(
MenuItem
item
)
{
switch
(
item
.
getItemId
())
{
case
R
.
id
.
cpu
:
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
mProcMode
.
setText
(
"Processing mode: CPU"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_CPU
);
return
true
;
case
R
.
id
.
ocl_direct
:
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
mProcMode
.
setText
(
"Processing mode: OpenCL direct"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_OCL_DIRECT
);
return
true
;
case
R
.
id
.
ocl_ocv
:
runOnUiThread
(
new
Runnable
()
{
public
void
run
()
{
mProcMode
.
setText
(
"Processing mode: OpenCL via OpenCV (TAPI)"
);
}
});
NativeGLRenderer
.
setProcessingMode
(
NativeGLRenderer
.
PROCESSING_MODE_OCL_OCV
);
return
true
;
default
:
return
false
;
}
}
}
\ No newline at end of file
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