Java调用OpenCV并通过OpenCL进行GPU加速

前言

本文是在上一篇博文[Ubuntu 16.04下静态编译OpenCV 3.4.14集成OpenCL调用Intel® HD Graphics NEO实现GPU加速]驱动了Intel® HD Graphics NEO的基础上进行的。

1 GPU devices are detected.
name:              Intel(R) Gen9 HD Graphics NEO
available:         1
imageSupport:      1
OpenCL_C_Version:  OpenCL C 2.0

本来顺便把Java调用的Jar包也编译出来了,但发现竟然没有UMat
查了OpenCV3.4的官方文档,确实没有关于UMat的说明。Stack Overflow上有类似的疑问opencv-transparent-api-umat-is-missing

解决办法

使用Github上的JavaCV开源实现即可。

Maven添加JavaCV包依赖

pom.xml添加如下内容

 <dependency>
    <groupId>org.bytedeco</groupId>
    <artifactId>javacv-platform</artifactId>
    <version>1.5.6</version>
  </dependency>

Demo源码

import org.bytedeco.opencv.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_core.*;
import static org.bytedeco.opencv.global.opencv_imgproc.*;
import static org.bytedeco.opencv.global.opencv_imgcodecs.*;

public class App
{
	public static void main(String[] args)
	{
		long start = 0l, end = 0l;
		Mat image = imread("./Lena.png"); // 随便找了一张图片
		Mat src0 = new Mat(20000, 20000, CV_8UC3); // 将图片大小放大到20000×20000
		resize(image, src0, new Size(20000, 20000));
		UMat src1 = new UMat(20000, 20000, CV_8UC3);
		src0.copyTo(src1);
		
		// Mat
		start = System.currentTimeMillis();
		blur(src0, src0, new Size(1, 1));
		end = System.currentTimeMillis();
		System.out.println("Mat running times:" + (end - start) + "ms");

		// UMat
		start = end = 0l;
		start = System.currentTimeMillis();
		blur(src1, src1, new Size(1, 1));
		end = System.currentTimeMillis();
		System.out.println("UMat running times:" + (end - start) + "ms");
	}
}

运行结果

Mat running times:884ms
UMat running times:1ms
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在 rk3588 上使用 OpenCV 进行 GPU 加速,可以使用 OpenCL 接口来调用 GPU。 以下是在 rk3588 上使用 OpenCV 进行 GPU 加速的基本步骤: 1. 确保已经安装了 OpenCL 库和驱动。可以通过 `ls /usr/lib/aarch64-linux-gnu/libOpenCL.so` 命令检查是否已经安装了 OpenCL 库。 2. 下载 OpenCV 源代码,并在下载的源代码目录中创建一个新目录 `build`。 3. 进入 `build` 目录,运行以下命令配置编译选项: ``` cmake -DWITH_OPENCL=ON -DWITH_OPENMP=OFF -DWITH_TBB=OFF -DWITH_IPP=OFF -DWITH_LAPACK=OFF -DWITH_EIGEN=OFF -DWITH_CUDA=OFF -DWITH_PROTOBUF=OFF -DWITH_GTK=OFF -DWITH_QT=OFF -DWITH_VTK=OFF -DWITH_GDAL=OFF -DWITH_XINE=OFF -DWITH_AVFOUNDATION=OFF -DWITH_OPENEXR=OFF -DWITH_WEBP=OFF -DWITH_JASPER=OFF -DWITH_JPEG=ON -DWITH_PNG=ON -DWITH_TIFF=ON -DWITH_ZLIB=ON -DWITH_FFMPEG=ON -DWITH_GSTREAMER=OFF .. ``` 4. 运行以下命令编译 OpenCV: ``` make -j4 ``` 5. 在 OpenCV 中启用 OpenCL。在代码中添加以下代码: ``` cv::ocl::setUseOpenCL(true); ``` 6. 在代码中使用 OpenCL 接口调用 GPU 进行加速。例如: ``` cv::UMat src, dst; cv::Mat src_host = cv::imread("input.jpg", cv::IMREAD_COLOR); src_host.copyTo(src); cv::ocl::oclMat ocl_src(src), ocl_dst; cv::ocl::Kernel kernel("my_kernel", cv::ocl::imgproc::ocl::cvtColor_oclsrc, cv::ocl::imgproc::ocl::cvtColor_oclsrc_len); kernel.args(cv::ocl::KernelArg::ReadOnlyNoSize(src), cv::ocl::KernelArg::WriteOnly(dst)); size_t globalThreads[3] = { src.cols, src.rows, 1 }; size_t localThreads[3] = { 16, 16, 1 }; cv::ocl::enqueueKernel(kernel, 2, globalThreads, localThreads); ocl_dst.download(dst); cv::Mat dst_host(dst); cv::imwrite("output.jpg", dst_host); ``` 这样,就可以在 rk3588 上使用 OpenCV 进行 GPU 加速,并通过 OpenCL 接口调用 GPU 进行加速

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值