自学内容网 自学内容网

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(())
}


原文地址:https://blog.csdn.net/wzw_mzm/article/details/143663767

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!