opencv-rust 系列4: 关于cuda.rs, opencv, opencl, cuda

前言: 首先申明, 我对于rust和opencv都是绝对新手.

今天要上的是第四个示例程序cuda.rs, 代码应该也很简单, 但搞了一天, 终于明白了一些基本原理. 这些可能对你们来说太简单了, 但本人不想老老实实地学, 老想着偷懒, 所以才走了弯路, 下面记录一下:

1, 本人电脑是Intel® Core™ i7-4710MQ × 8, NVIDIA GeForce GTX 850M, 系统原装有CUDA驱动, 通过 sudo apt install libopencv-dev 安装的opencv, 看似一切完美, 运行cuda.rs 应该没有问题. 但接下来碰到的问题一个接一个.
2, 程序中使用CUDA标志始终报错, 并提示没有ocvrs_has_module_cudafilters, ocvrs_has_module_cudaimgproc,这两个模块. 经查是因为sudo apt install libopencv-dev方式安装的opencv并不支持cuda. 于是动了手动编译安装opencv的念头.
3, 一通折腾, 终于手动编译安装上了opencv 4.7, 但在编译cuda.rs时又报缺少另一些库, 不想再折腾CUDA了, 因为我还有台新电脑是AMD的, 上面跑不了CUDA. 于是研究起了opencv, opencl, cuda三者关系.总结如下:

  1. opencv 默认支持opcncl, 需要支持CUDA时需要额外的步骤;
  2. AMD 原生支持opcncl ;
  3. nvidia 原生支持CUDA;
  4. nvidia 通过CUDA支持opencl.

4, 就是说opencl大家都支持的, 那我就不折腾了, 改回原来的 libopencv-dev.
5, 附上cuda.rs代码, 其中 /* … */ 注释掉的部分就是CUDA专属代码

use std::{env, time};
use time::Instant;
use opencv::core::Size;
use opencv::prelude::*;
use opencv::{core, imgcodecs, imgproc, Result};

const ITERATIONS: usize = 100;

fn main() -> Result<()> {
	let img_file = env::args().nth(1).expect("Please supply image file name");

	let dev_count = core::get_cuda_enabled_device_count()?;
	let cuda_available = dev_count > 0;
	if cuda_available {
		for dev_num in 0..dev_count {
			core::print_short_cuda_device_info(dev_num)?;
		}
	}
	println!(
		"CUDA is {}",
		if cuda_available {
			"available"
		} else {
			"not available"
		}
	);
	println!("Timing CPU implementation... ");
	let img = imgcodecs::imread_def(&img_file)?;
	let start = Instant::now();
	for _ in 0..ITERATIONS {
		let mut gray = Mat::default();
		imgproc::cvt_color_def(&img, &mut gray, imgproc::COLOR_BGR2GRAY)?;
		let mut blurred = Mat::default();
		imgproc::gaussian_blur_def(&gray, &mut blurred, Size::new(7, 7), 1.5)?;
		let mut edges = Mat::default();
		imgproc::canny_def(&blurred, &mut edges, 0., 50.)?;
	}
	println!("{:#?}", start.elapsed());

	/* 
	#[cfg(all(ocvrs_has_module_cudafilters, ocvrs_has_module_cudaimgproc))]
	//#[cfg(feature = "cuda")]  // 修改这一行
	if cuda_available {
		use opencv::core::GpuMat;
		use opencv::{cudafilters, cudaimgproc};

		println!("Timing CUDA implementation... ");
		let img = imgcodecs::imread_def(&img_file)?;
		let mut img_gpu = GpuMat::new_def()?;
		img_gpu.upload(&img)?;
		let mut stream = core::Stream::default()?;
		let start = Instant::now();
		for _ in 0..ITERATIONS {
			let mut gray = GpuMat::new_def()?;
			cudaimgproc::cvt_color(&img_gpu, &mut gray, imgproc::COLOR_BGR2GRAY, 0, &mut stream)?;
			let mut blurred = GpuMat::new_def()?;
			let mut filter = cudafilters::create_gaussian_filter_def(gray.typ()?, blurred.typ()?, Size::new(7, 7), 1.5)?;
			filter.apply(&gray, &mut blurred, &mut stream)?;
			let mut edges = GpuMat::new_def()?;
			let mut detector = cudaimgproc::create_canny_edge_detector_def(0., 50.)?;
			detector.detect(&blurred, &mut edges, &mut stream)?;
			stream.wait_for_completion()?;
		}
		println!("{:#?}", start.elapsed());
	} 
	*/
	Ok(())
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值