android - 在 Android Studio 中将 T-API (Opencv 3.0) 与 OpenCL 结合使用 无速度改进

标签 android opencv android-studio opencl opencv3.0

我试图切换到新的 OpenCV 3.0,因为它隐式调用 OpenCL 以加快矩阵运算速度。我遵循了 Sony 提供的一个很好的教程并能够集成所需的 OpenCV 文件以进行编译。 我只是读取图像检测边缘。 CPU 和 GPU 端也做了同样的事情。但我认为我错过了一些重要的事情,因为在这两种情况下处理所需的时间是相同的。代码 fragment 如下:

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) ;

和“纯” native 代码:

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 教程中 here ,已经提到过,需要使用选项来编译它

-DWITH_OPENCL=YES

有这个必要吗?该应用程序编译并运行时没有任何错误,但我认为它不能在 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。当使用 Lollipop 代替时,它会导致重大问题吗?日志显示,OCL 版本的 OpenCV 已成功初始化。程序运行正常,但速度很慢!

关于android - 在 Android Studio 中将 T-API (Opencv 3.0) 与 OpenCL 结合使用 无速度改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33509057/

相关文章:

android - 检测 Intent 的类型 android

android - 使用 retrofit2 解析字符串数组

java - Android Jack : Lambda coming from jar file need their interfaces on the classpath to be compiled, 未知接口(interface)是 java.util.function.Consumer

java - Android 架构 SingleLiveEvent 和 EventObserver Java 实践示例

android - Dagger2 不生成 Dagger* 类

android - 为平板电脑设计应用程序以支持不同的屏幕尺寸。

python - 类型错误 : Scalar value for argument 'color' is not numeric in openCV

c++ - OpenCV findContours 点 vector

c++ - 如何 "crop"Canny边缘检测器的结果

android - 用新的 Android Studio 项目替换 GitHub 存储库,同时保留旧的提交