在Android Studio中将T-API(Opencv 3.0)与OpenCL结合使用,不会提高速度

在Android Studio中将T-API(Opencv 3.0)与OpenCL结合使用,不会提高速度,android,opencv,android-studio,opencl,opencv3.0,Android,Opencv,Android Studio,Opencl,Opencv3.0,我试图切换到新的OpenCV 3.0,因为它隐式地调用OpenCL以加快对矩阵的操作。我遵循了由提供的一个很好的教程,并且能够集成所需的OpenCV文件以使其能够编译。 我只是在读一幅图像,检测边缘。同样的事情也在CPU和GPU端完成。但我认为我遗漏了一些重要的东西,因为在这两种情况下,处理过程所需的时间是相同的。代码片段如下所示: clock_t startTimer1, stopTimer1; cv::ocl::setUseOpenCL(true); String path = "/st

我试图切换到新的OpenCV 3.0,因为它隐式地调用OpenCL以加快对矩阵的操作。我遵循了由提供的一个很好的教程,并且能够集成所需的OpenCV文件以使其能够编译。 我只是在读一幅图像,检测边缘。同样的事情也在CPU和GPU端完成。但我认为我遗漏了一些重要的东西,因为在这两种情况下,处理过程所需的时间是相同的。代码片段如下所示:

clock_t startTimer1, stopTimer1;

cv::ocl::setUseOpenCL(true);

String path = "/storage/emulated/0/DCIM/100ANDRO/";
String filename = "DSC_0581.JPG";
String filename_result = "DSC_0581_processed.JPG";

ocl::setUseOpenCL(true);
Mat gpuFrame;
UMat gpuBW;
UMat gpuBlur;
UMat gpuEdges;

gpuFrame = imread(path+filename, IMREAD_COLOR);
gpuBW = gpuFrame.getUMat(cv::ACCESS_READ);

startTimer1=clock();
cvtColor(gpuBW, gpuBW, COLOR_BGR2GRAY);
GaussianBlur(gpuBW, gpuBlur, Size(1,1), 1.5, 1.5);
Canny(gpuBlur, gpuEdges, 0, 30, 3);
cv::ocl::finish();
stopTimer1 = clock();

imwrite(path+filename_result, gpuEdges);

double elapse = 1000.0* (double)(stopTimer1 - startTimer1)/(double)CLOCKS_PER_SEC;
info[2] = (int)elapse;
LOGI("OpenCL code on the GPU took %g ms\n\n", 1000.0* (double)(stopTimer1 - startTimer1)/(double)CLOCKS_PER_SEC) ;
以及“纯”本机代码:

ocl::setUseOpenCL(false);
Mat cpuFrame;
String path = "/storage/emulated/0/DCIM/100ANDRO/";
String filename = "DSC_0581.JPG";
String filename_result = "DSC_0581_cpu_processed.JPG";

Mat cpuBW;
Mat cpuBlur;
Mat cpuEdges;

cpuFrame = imread(path+filename);
startTimer=clock();
cvtColor(cpuFrame, cpuBW, COLOR_BGR2GRAY);
GaussianBlur(cpuBW, cpuBlur, Size(1, 1), 1.5, 1.5);
Canny(cpuBlur, cpuEdges, 0, 30, 3);
stopTimer = clock();
imwrite(path+filename_result, cpuEdges);

double elapse = 1000.0* (double)(stopTimer - startTimer)/(double)CLOCKS_PER_SEC;
info[2] = (int)elapse;

LOGI("C++ code on the CPU took %g ms\n\n", 1000.0* (double)(stopTimer - startTimer)/(double)CLOCKS_PER_SEC) ;
在OpenCV/OpenCL/Android教程中,已经提到,需要使用option编译它

-DWITH_OPENCL=是

有必要吗?该应用程序编译和运行时没有任何错误,但我认为不会在GPU上运行。非常感谢任何帮助!非常感谢

更新

这是Android.mk的

LOCAL_PATH      := $(call my-dir)
LOCAL_PATH_EXT  := $(call my-dir)/../extra_libs/
include $(CLEAR_VARS)

#opencv
OPENCVROOT:= C:/Android/opencva3
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=SHARED
-DWITH_OPENCL=YES

include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk

LOCAL_ARM_MODE  := arm

LOCAL_MODULE    := openclexample1

LOCAL_CFLAGS    += -DANDROID_CL -DWITH_OPENCL
LOCAL_CFLAGS    += -O3 -ffast-math

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include

LOCAL_SRC_FILES := sonyOpenCLexample1.cpp openCLNR.cpp refNR.cpp #ocdft.cpp

LOCAL_LDLIBS    +=  -ldl -llog -ljnigraphics
LOCAL_LDLIBS    += -lGLESv2 -lEGL
LOCAL_LDLIBS    += $(LOCAL_PATH_EXT)libOpenCL.so  

include $(BUILD_SHARED_LIBRARY)

好吧,我终于成功了……不知怎么的。我重新编译了OpenCV,并使用以下方法将OCL/OpenCL部分包含到构建中:

set PATH=%PATH%; PATH/TO/NINJA/ninja.exe
mkdir OpenCVCL3
cd OpenCVCL3
cmake -GNinja -DCMAKE_MAKE_PROGRAM="PATH/TO/NINJA//ninja.exe" -DCMAKE_TOOLCHAIN_FILE=PATH/TO/OPENCV3/platforms/android/android.toolchain.cmake -DANDROID_ABI="armeabi-v7a with NEON" -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON -DWITH_OPENCL=YES PATH/TO/OPENCV3
path/to/ninja.exe install/strip
与CPU版本的代码相比,计算时间并没有减少

另一个更一般的问题:
Xperia Z1(Snapdragon Adreno 330)最初在KitKat中使用OpenCL 1.1。当使用棒棒糖替代时,是否会导致重大问题?日志显示,OpenCV的OCL版本已成功初始化。程序运行正常,但速度很慢

一,。日志中表示正在使用T-API库的任何内容。2.您测试的是哪个设备/操作系统版本。该设备是一款索尼Xperia Z1,具有opencllib.so可用。我能够运行索尼的示例应用程序,它运行得又好又快。logcat只提供很多libEGL输出。与T-API无关。最后三行是:
11-03 22:52:53.415 21768-21794/com.sony.openclexample1 D/libEGL:glEndTilingQCOM(0x00000001);11-03 22:52:53.418 21768-21794/com.sony.openclexample1 D/libEGL:glGetError();11-03 22:52:57.760 21768-21768/com.sony.openclexample1 I/JNIpart:GPU上的OpenCL代码耗时3034.24毫秒
,那么您是否遵循了链接中关于
-DWITH_OpenCL=YES
System.loadLibrary(“opencv_java3”)
的说明?实际上没有。我对“建筑”的东西不太熟悉。我刚刚从他们那边下载了OpenCV 3.0 Android,并将其放入Gradle模块中。你能提供一个好的网站来展示这些步骤吗?我已经更新了上面的Android.mk,如果没有OpenCV管理器应用程序,它应该可以工作,对吗?啊,那么你使用的是常规的OpenCV,而OpenCL的东西甚至没有设置。在不更改应用程序中的代码以使用其他库的情况下,您将使用Manager应用程序。OpenCL具有特定于设备/平台的驱动程序(即NVidia OpenCL驱动程序将不同于三星或高通),并且在常规Android中不受支持。抱歉,关于步骤,最好是了解Android NDK,因为教程中的代码是C/C++