rust中使用opencv和cuda

news/2024/11/28 11:17:38/文章来源:https://www.cnblogs.com/yuwenshan/p/18573935

最近公司有个要识别的项目需要计算机识别,于是就找到了opencv来进行,opencv的cuda版本需要自己来进行编译需要去opencv官网下载,我下载的版本是opencv4.10
https://github.com/opencv/opencv/archive/refs/tags/4.10.0.zip
还有需要opencv_contrib-4.10.0和cmake下载
下载之前需要检查自己的cuda和cudnn
cmd输入nvidia-smi查看自己的cuda版本去官网下载对于的版本来安装

我这边使用的是之前安装的12.6了就不更新了 https://developer.nvidia.com/cuda-downloads

现在对于cuda的cudnn版本https://developer.nvidia.com/cudnn-downloads

需要记下自己的cudnn地址我是默认的在C:\Program Files\NVIDIA\CUDNN\v9.5 需要将对应的bin include lib和对应的版本号下的文件移动到对应的cuda下载地址C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.6的bin include lib下这样cudnn就设置好了
rust一般都是下载过c++环境的这边就不安装了 直接进行的编译 E:/opencv/opencv-4.10.0是自己的opencv解压后的包E:/opencv/opencv-4是自己的编译到的地址选择完以后

点击configure 选择自己的vs版本和x64

等done以后搜索OPENCV_EXTRA_MODULES_PATH选择自己解压opencv_contrib的models

再搜索OPENCV_ENABLE_NONFREE勾选

搜索cuda全部勾选

最后再搜索wor勾选

点击configure 中间可能会出现 raw.githubusercontent.com/文件下载出问题的 去找一下github更改host的文件的即可
rust的opencv是调用c++的代码的如果没有py和java等环境需要搜索以后全部取消勾选

Configuring done以后点击generate等待generate done以后点击 open project打开vs

选择release x64 选择CMakeTargets 先ALL_BUILD 生成 然后再INSTALL编译出包

opencv的环境配置参考https://www.cnblogs.com/-CO-/p/18075315
开发流程
我使用的手机的ip摄像头软件进行连接摄像头 需要局域网不行的话需要电脑连接手机热点

创建一个项目 添加opencv cargo add opencv
导入使用的模块

use opencv::{core::{self, Mat, Rect, Size, Vector, Point,CV_32F, CV_8UC3}, dnn::{self, DNN_BACKEND_CUDA, DNN_TARGET_CUDA}, highgui::{self, imshow}, prelude::*, videoio::{self, VideoCapture}
};
const SOURCE_WINDOW: &str = "Video Stream";#[derive(Debug)]
pub struct BoxDetection {pub xmin: i32, // bounding box left-top xpub ymin: i32, // bounding box left-top ypub xmax: i32, // bounding box right-bottom xpub ymax: i32, // bounding box right-bottom ypub class: i32, // class indexpub conf: f32  // confidence score
}
#[derive(Debug)]
pub struct Detections {pub detections: Vec<BoxDetection>
}
//net获取模型onnx
let mut net = dnn::read_net_from_onnx("mx/yolov8s.onnx").unwrap();
//设置cuda后端
net.set_preferable_backend(DNN_BACKEND_CUDA).unwrap();
net.set_preferable_target(DNN_TARGET_CUDA).unwrap();
//设置窗口id
let _ = highgui::named_window(SOURCE_WINDOW, highgui::WindowFlags::WINDOW_FREERATIO as i32);
//需要修改ip为自己手机ip摄像头的ip
let vide = "http://admin:admin@192.168.254.36:8081/";
//创建视频流
let mut vc = VideoCapture::default().unwrap();
//通过ip打开视频流
let bool = vc.open_file(&vide, videoio::CAP_FFMPEG).unwrap();
//模型id对应合集
let classes_labels: Vec<&str> = vec!["person", "bicycle", "car", "motorbike", "aeroplane", "bus", "train", "truck", "boat", "traffic light", "fire hydrant", "stop sign", "parking meter", "bench", "bird", "cat", "dog", "horse", "sheep", "cow", "elephant", "bear", "zebra", "giraffe", "backpack", "umbrella", "handbag", "tie", "suitcase", "frisbee", "skis", "snowboard", "sports ball", "kite", "baseball bat", "baseball glove", "skateboard", "surfboard", "tennis racket", "bottle", "wine glass", "cup", "fork", "knife", "spoon", "bowl", "banana", "apple", "sandwich", "orange", "broccoli", "carrot", "hot dog", "pizza", "donut", "cake", "chair", "sofa", "pottedplant", "bed", "diningtable", "toilet", "tvmonitor", "laptop", "mouse", "remote", "keyboard", "cell phone", "microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear", "hair drier", "toothbrush"];
if bool {loop {//读取视频流if vc.read(&mut Mat::default()).unwrap() {// 显示帧let mut frame = Mat::default();vc.read(&mut frame).unwrap();let h = frame.rows();let w = frame.cols();let _max = std::cmp::max(w, h);let mut image = Mat::zeros(_max, _max, CV_8UC3).unwrap().to_mat().unwrap();frame.copy_to(&mut image).unwrap();//let  fr =  dnn::blob_from_image(&image,1.0 / 255.0,Size::new(640, 640),core::Scalar::new(0f64,0f64,0f64,0f64),true,false,CV_32F).unwrap();net.set_input(&fr, "", 1.0, core::Scalar::default()).unwrap();let mut output_blobs: Vector<Mat> = Vector::default();let name = net.get_unconnected_out_layers_names().unwrap();//进行推理net.forward(&mut output_blobs, &name).unwrap();let dets = output_blobs.get(0).unwrap();let rows = dets.mat_size().get(2).unwrap(); // 8400let cols = dets.mat_size().get(1).unwrap(); let mut boxes: Vector<Rect> = Vector::default();let mut scores: Vector<f32> = Vector::default();let mut indices: Vector<i32> = Vector::default();let mut class_index_list: Vector<i32> = Vector::default();let x_scale = 1;let y_scale = 1;for row in 0..rows {let mut vec = Vec::new();let mut max_score = 0f32;let mut max_index = 0;for col in 0..cols {let value: f32 = *dets.at_3d::<f32>(0, col, row).unwrap();if col > 3 {if value > max_score {max_score = value;max_index = col - 4;}}vec.push(value);}if max_score > 0.25 {scores.push(max_score);class_index_list.push(max_index as i32);let cx = vec[0];let cy = vec[1];let w = vec[2];let h = vec[3]; boxes.push( Rect{x: (((cx) - ((w) / 2.0)) * x_scale as f32).round() as i32, y: (((cy) - ((h) / 2.0)) * y_scale as f32).round() as i32, width: (w * x_scale as f32).round() as i32, height: (h * y_scale as f32).round() as i32});indices.push(row as i32);}}dnn::nms_boxes(&boxes, &scores, 0.5, 0.5, &mut indices, 1.0, 0).unwrap();let mut final_boxes : Vec<BoxDetection> = Vec::default();for i in &indices {let class = class_index_list.get(i as usize).unwrap();// println!("{}", class);let rect = boxes.get(i as usize).unwrap();let bbox = BoxDetection{xmin: rect.x,ymin: rect.y,xmax: rect.x + rect.width,ymax: rect.y + rect.height,conf: scores.get(i as usize).unwrap(),class: class};// println!("bbox  111111{:?}", bbox);final_boxes.push(bbox);}//绘制图像for i in 0..final_boxes.len() {let bbox = &final_boxes[i];let rect = Rect::new(bbox.xmin, bbox.ymin, bbox.xmax - bbox.xmin, bbox.ymax - bbox.ymin);let label = classes_labels.get(bbox.class as usize);let label = match label {Some(label) => label,None => "Unknown",};let box_color = core::Scalar::new(0.0, 255.0, 0.0, 0.0);opencv::imgproc::rectangle(&mut image, rect, box_color, 2, opencv::imgproc::LINE_8, 0).unwrap();let _ = opencv::imgproc::put_text_def(&mut image, label, Point{x: bbox.xmax, y: bbox.ymax/ 2}, 1,1.0,box_color);}//显示视频imshow(SOURCE_WINDOW, &image).unwrap();// 等待按键事件if highgui::wait_key(10).unwrap() > 0 {break;}} else {println!("Error: Unable to read mat.");break;}}}

现在推理耗时很久每次需要300ms 正在尝试用多线程去写 有问题请发邮箱至anmingle@163.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/842773.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视效升级如此简单?零代码实现炫酷管道效果

三维场景视效升级 通过添加管道效果,可以提升整个三维场景的辨识度,尤其是在需要表现水流流向、能源运输、移动路径等场景中。通过设置管道效果,不仅能够清晰表达设计思路,还能为整个场景增添一抹亮色。下面我们就一起来看一下,如何在山海鲸可视化中添加管道效果。1. 管道…

CudaSPONGE之Python接口

本文介绍了高性能GPU分子动力学模拟软件CudaSPONGE的Python API接口,通过官方开发的prips插件,使得我们可以在Python框架下很方便的开发一些分子动力学模拟的Force Wrapper,例如Meta Dynamics中就有很多可以外界的工具,非常方便开发者的二次开发,同时又能够兼顾到性能。技…

行业专家推荐2024年CRM系统Top 5

商业环境瞬息万变,客户关系管理(CRM)系统帮助企业更好地连接客户、理解客户、服务客户,已成为企业不可或缺的战略资产。 企业在选择CRM系统时,应做好充分的市场调查。为了帮助企业更好地把握市场机遇,提升客户体验,本文根据搜索结果和行业专家的评价,推荐2024年各方面排…

论文解读《Neural Cleanse: Identifying and Mitigating Backdoor Attacks in Neural Networks》

发表时间:2019期刊会议:IEEE Symposium on Security and Privacy (S&P)论文单位:UC Santa Barbara论文作者:Bolun Wang, Yuanshun Yao, Shawn Shan, Huiying Li, Bimal Viswanath, Haitao Zheng, Ben Y. Zhao方向分类:Backdoor Attack论文链接开源代码摘要 深度神经网…

TIA下梯形图做单灰仓脉冲阀喷吹控制练习

假设有这样一个应用需求,一个会仓,上面有10个脉冲阀,按照顺序进行喷吹,每个阀喷吹后,间隔一定时间下一个阀喷吹,可以设置总的喷吹次数,达到次数后停止喷吹,如果总喷吹次数设置为0,那么就一直喷吹下去。如果点击了开始按钮开始喷吹动作,再次点击开始按钮,不会重新开始…

如何提升日用品行业生产效率?数字化管理成关键

在日用品行业,快速反应和高效生产是生存之道。从采购、生产到物流配送,每一个环节都充满挑战。市场需求瞬息万变,交付周期日益缩短,任何一个环节的滞后都可能导致整个供应链的断裂。如何在繁忙的工作中保持高效协作、精准调度,并确保及时交付,是许多企业迫切需要解决的问…

从需求到交付,如何有效控制客户的预期?

在现代企业管理中,客户预期的管理是项目成功的关键因素之一。无论是软件开发、产品设计还是咨询服务,项目能否成功完成往往取决于客户对于项目成果的预期。如果没有正确的预期管理,客户的需求与项目交付之间就容易产生偏差,进而影响客户的满意度和项目的最终成果。因此,如…

PIDNet-PagFM-特征融合

import torch.nn as nn import torch import torch.nn.functional as F class PagFM(nn.Module):# 选择性特征融合 直接融合细节和低频上下文 容易导致细节丢失def __init__(self, in_channels, mid_channels, after_relu=False, with_channel=False, BatchNorm=nn.BatchNorm2…

基于改进自适应分段线性近似(IAPLA)的微分方程数值解法研究: 从简单动力系统到混沌系统的应用分析

微分方程作为一种数学工具在物理学、金融学等诸多领域的动态系统建模中发挥着关键作用。对这类方程数值解的研究一直是学术界关注的重点。 数值方法是一类用于求解难以或无法获得解析解的数学问题的算法集合。这类方法主要处理描述函数在时间或空间维度上演化的微分方程,采用逐…

大模型--QLoRA、GPTQ:模型量化02--24

目录1. 参考2. 量化简介3. QLoRANF4 数据类型4. GPTQOBD:Optimal Brain DamageOBS:Optimal Brain SurgeonOBCGPTQ 的创新点5 各大开源模型量化实现6 后续方向探讨 1. 参考 https://zhuanlan.zhihu.com/p/646210009?utm_psn=1845389883864133633 2. 量化简介 模型量化是将浮点…

Oracle生成awr报告操作步骤

1、cmd命令窗口 以sysdba身份登录Oracle 2、执行@?/rdbms/admin/awrrpt命令,并选择报告类型为HTML。输入天数以选择生成报告的时间段,一般默认为最近7天。输入报告开始和结束时间对应的快照ID。输入报告名称,如awr.html,系统将自动生成并显示报告名。 3. 查看AWR报告。 AW…

聚焦银行业数智化转型,火山引擎数据飞轮系列白皮书重磅发布

随着金融科技的快速发展,银行业也在不断提升数字化水平。通过大数据、人工智能等技术的应用,银行可以更加精准地了解客户需求,提供个性化的金融产品和服务,还能降低运营成本,提升风险管理能力,创造更多业务价值。《金融科技发展规划(2022~2025年)》也明确指出,以加强金…