主要的步骤其他人已经写过,请参考这篇:https://www.cnblogs.com/hrlnw/p/4720977.html

操作的细节请参考附件的pdf:  https://files.cnblogs.com/files/ahfuzhang/opencvwithopencl4androidndk-141129030940-conversion-gate02.pdf.zip

用于测试的代码如下:

//jpg2gary.cpp
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
#include <fstream> #ifndef P
#define P(format, ...) \
do { \
printf("%s %s %d " format "\n", __FILE__, __FUNCTION__, __LINE__, \
##__VA_ARGS__); \
fflush(stdout); \
} while (0);
#endif void cpu(const char* img, int times) {
cv::Mat image = cv::imread(img, cv::IMREAD_UNCHANGED);
cv::Mat out;
struct timeval start, end;
gettimeofday(&start, NULL);
for (int i = 0; i < times; i++) {
cv::cvtColor(image, out, cv::COLOR_BGR2GRAY);
}
gettimeofday(&end, NULL);
P("run times:%d, spend:%d ms", times, (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000);
} void opencl(const char* img, int times) {
cv::Mat image = cv::imread(img, cv::IMREAD_UNCHANGED);
//cv::UMat u_img = image.getUMat(cv::ACCESS_READ);
cv::UMat u_img;
image.copyTo(u_img);
cv::UMat out;
struct timeval start, end;
gettimeofday(&start, NULL);
for (int i = 0; i < times; i++) {
cv::cvtColor(u_img, out, cv::COLOR_BGR2GRAY);
}
gettimeofday(&end, NULL);
P("run times:%d, spend:%d ms", times, (end.tv_sec - start.tv_sec) * 1000 +
(end.tv_usec - start.tv_usec) / 1000);
} int init_col(){
cv::ocl::setUseOpenCL(true);
if (!cv::ocl::haveOpenCL()) {
P("OpenCL is not available...");
return -1;
}
cv::ocl::Context context;
if (!context.create(cv::ocl::Device::TYPE_GPU)) {
P("Failed creating the context...");
return -1;
}
std::vector<cv::ocl::PlatformInfo> platform_info;
cv::ocl::getPlatfomsInfo(platform_info);
for (int i = 0; i < platform_info.size(); i++) {
cv::ocl::PlatformInfo sdk = platform_info.at(i);
for (int j = 0; j < sdk.deviceNumber(); j++) {
cv::ocl::Device device;
sdk.getDevice(device, j); std::cout << "\n\n*********************\n Device " << i + 1 << std::endl;
std::cout << "Vendor ID: " << device.vendorID() << std::endl;
std::cout << "Vendor name: " << device.vendorName() << std::endl;
std::cout << "Name: " << device.name() << std::endl;
std::cout << "Driver version: " << device.driverVersion() << std::endl;
std::cout << "available: " << device.available() << std::endl; if (device.isAMD()) std::cout << "Is an AMD device" << std::endl;
if (device.isIntel()) std::cout << "Is a Intel device" << std::endl; std::cout << "Global Memory size: " << device.globalMemSize()
<< std::endl;
std::cout << "Memory cache size: " << device.globalMemCacheSize()
<< std::endl;
std::cout << "Memory cache type: " << device.globalMemCacheType()
<< std::endl;
std::cout << "Local Memory size: " << device.localMemSize() << std::endl;
std::cout << "Local Memory type: " << device.localMemType() << std::endl;
std::cout << "Max Clock frequency: " << device.maxClockFrequency()
<< std::endl;
}
}
if (!cv::ocl::haveOpenCL()) {
P("OpenCL is not available, again...");
return -1;
}
cv::ocl::Device(context.device(0));
return 0;
} int main(int argc, char* argv[]) {
if (argc < 3) {
printf("usage:%s <from> <cpu/opencl> [times=1]\n", argv[0]);
return 0;
}
int times = 1;
if (argc >= 4) {
times = atoi(argv[3]);
}
if (strcmp(argv[2], "cpu") == 0) {
cpu(argv[1], times);
} else if (strcmp(argv[2], "opencl") == 0) {
if (0!=init_col()){
return 1;
}
opencl(argv[1], times);
} else {
P("unknow cpu/opencl");
return 0;
} return 1;
}

  

使用xiaomi mix 2s, 高通骁龙 845, GPU Adreno 630, 对一张1080*1443尺寸的图片使用cvtColor转换RGB到灰度。
连续执行1000次:
   CPU  595ms
   OpenCL  96ms

加速6.2倍!

linux下编译支持opencl的opencv for android的更多相关文章

  1. ubuntu14.04下编译支持opengl的opencv

    在学习基于opencv的AR时,编译程序遇到报错,发现opencv不支持opengl.网上原因得知,在编译opencv时,opencv2.4以后的版本中默认ENABLE_OPENGL = NO,只需要 ...

  2. linux下编译gcc6.2.0

    linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...

  3. linux下编译安装vim7.4并安装clang_complete插件

    linux下编译安装vim7.4并安装clang_complete插件 因为debian里软件仓库中下载安装的vim是不支持python写的插件的(可以打开vim,在命令模式先输入:py测试一下),导 ...

  4. 如何在Kali Linux下编译Windows Exploit

    前言 微软的Windows在企业或是个人应用领域占据着最大的市场份额,在渗透测试过程中你会经常遇到很多Windows的工作站和服务器.另一方面,大多数渗透测试人员主要使用基于Linux的发行版渗透测试 ...

  5. linux下编译qt5.6.0静态库——configure配置

    linux下编译qt5.6.0静态库 linux下编译qt5.6.0静态库 configure生成makefile 安装选项 Configure选项 第三方库: 附加选项: QNX/Blackberr ...

  6. <iostream> 和 <iostream.h>的区别 及 Linux下编译iostream.h的方法

    0.序言 其实2者主要的区别就是iostream是C++标准的输入输出流头文件,而iostream.h是非标准的头文件. 标准头文件iostream中的函数属于标准命令空间,而iostream.h中的 ...

  7. Linux 下编译、安装、配置 QT

    转自Linux 下编译.安装.配置 QT 注意:编译安装耗时费力,且很容易出错,要不断调整编译参数,不推荐使用,否则这将会是一个纠结痛苦的过程. 打算做嵌入式图像处理,计划方案嵌入式Linux+Ope ...

  8. linux下编译eXosip、osip,以及UAC和UAS的例子

    从网站上看到了这样的一篇博文 :Windows下编译eXosip.osip,以及UAC和UAS的例子 (链接:http://www.cnblogs.com/dyllove98/archive/2013 ...

  9. Linux下编译安装Apache及模块

    Apache是时下最流行的Webserver软件之中的一个,支持多平台,可高速搭建web服务,并且稳定可靠.并可通过简单的API扩充.就能够集成PHP/Python等语言解释器. 文章这里解说怎样在l ...

随机推荐

  1. pycharm字体放大的设置

    一.pycharm字体放大的设置 File -> setting -> Keymap ->在搜寻框中输入:increase -> Increase Font Size(双击) ...

  2. Windows 数据盘自动分区脚本

    在CMD命令文本下执行,即可: diskpart //1.进入diskpart模式 list disk //2.查询磁盘 select disk 1 //3.选择磁盘 create partition ...

  3. windows10 c++获取本机IPv4,ipv6,查询本机Ipv4,ipv6

    1.关于 演示环境: win10+VS2017 2.支持 需要下面的库支持: ws2_32.lib 需要下面的宏,添加到项目属性-> c/c++ -> 预处理器定义 _WINSOCK_DE ...

  4. Rikka with wood sticks(hdu5203)

    Rikka with wood sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/O ...

  5. hdu 1528-Card Game Cheater(贪心算法)

    题意不讲,怕说不清,自己一点点看吧. 思路是贪心,将每个人的牌按从小到大或(从大到小),我是从小到大排的, 然后每次从第二摞排中找比第一摞排的那张大且相差最小的就可以了,每次找到就sum++: 最后s ...

  6. 【】二次通告--Apache log4j-2.15.0-rc1版本存在绕过风险,请广大用户尽快更新版本

    [转载自360众测] Apache Log4j2是一个基于Java的日志记录工具.该工具重写了Log4j框架,并且引入了大量丰富的特性.我们可以控制日志信息输送的目的地为控制台.文件.GUI组件等,通 ...

  7. 【Leetcode】718. 最长重复子数组

    最长重复子数组有一下性质 A: [1,2,3,2,1] B: [3,2,1,4,7]设横是A竖是B,有规律:若横元和竖元相等,则为1,不等为0 1 2 3 2 13 0 0 1 0 12 0 1 0 ...

  8. 「算法笔记」快速傅里叶变换(FFT)

    一.引入 首先,定义多项式的形式为 \(f(x)=\sum_{i=0}^n a_ix^i\),其中 \(a_i\) 为系数,\(n\) 为次数,这种表示方法称为"系数表示法",一个 ...

  9. Sublime Text 3结合Chrome实现网页的自动刷新

    我们在编写前端代码时,写好一部分代码时想要看一看代码的实现效果,每次都要手动刷新会非常麻烦,神器来了,LiveReload插件实现网页的实时刷新,操作方法如下: 1. 官网下载Sublime Text ...

  10. Practical Black-Box Attacks against Machine Learning

    目录 概 主要内容 Jacobian-based Dataset Augmentation Note Papernot N, Mcdaniel P, Goodfellow I, et al. Prac ...