linux C++ onnxruntime yolov8 视频检测Demo

linux C++ onnxruntime yolov8 视频检测Demo

目录

项目目录

效果

​编辑CMakeLists.txt

代码 

下载


项目目录

效果

./yolov8_demo --help

./yolov8_demo -c=2 -p=true

./yolov8_demo -c=1 -s=true

CMakeLists.txt

# cmake needs this line
cmake_minimum_required(VERSION 3.0)# Define project name
project(yolov8_demo)# Release模式下的编译指令
# SET(CMAKE_BUILD_TYPE "Release")
# set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -s")
# set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -std=c++17 -pthread -Wall -Wl")# Debug模式下的编译指令
SET(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_DEBUG}")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -std=c++17 -pthread") set(OpenCV_LIBS opencv_videoio opencv_imgcodecs opencv_imgproc opencv_core opencv_dnn opencv_highgui)include_directories(/usr/local/include/opencv4${PROJECT_SOURCE_DIR}/include${PROJECT_SOURCE_DIR}/include/onnxruntime
)link_directories(${PROJECT_SOURCE_DIR}/lib/onnxruntime   # 第三方动态库文件/usr/local/lib/
)#递归指定源码的路径
file(GLOB_RECURSE SRCS ${PROJECT_SOURCE_DIR}/src/*.cpp)# Declare the executable target built from your sources
add_executable(yolov8_demo ${SRCS})# Link your application with OpenCV libraries
target_link_libraries(yolov8_demo 
-lonnxruntime
${OpenCV_LIBS}
)

代码 

main.cpp

#include <opencv2/core.hpp>

#include <opencv2/highgui.hpp>

#include <iostream>

#include <YoloV8.hpp>

#include <unistd.h>

#include <sys/syscall.h>

#include <thread>

int VideoDet(int index, bool showDet, bool useGPU, bool printPerStepInfo)

{

    size_t threadId = static_cast<size_t>(syscall(SYS_gettid));

    // std::cout << "index:" << index << " thread id: " << threadId << std::endl;

    cv::VideoCapture capture("./test/test_car_person_1080P.mp4");

    // 检查视频是否成功打开

    if (!capture.isOpened())

    {

        std::cout << "无法读取视频文件" << std::endl;

        return -1;

    }

    int frameCount = capture.get(cv::CAP_PROP_FRAME_COUNT); // 获取视频帧数

    double fps = capture.get(cv::CAP_PROP_FPS);             // 获取帧率

    int delay = int(1000 / fps);                            // 根据帧率计算帧间间隔时间

    // delay=1;

    std::string model_path = "./models/yolov8n.onnx";

    std::string lable_path = "./models/lable.txt";

    int GPUCount = 2;

    int device_id = 0;

    if (index >= GPUCount)

    {

        device_id = index % GPUCount;

    }

    else

    {

        device_id = index;

    }

    // device_id=0;

    YoloV8 yoloV8(model_path, lable_path, useGPU, device_id);

    yoloV8.index = index;

    yoloV8.threadId = threadId;

    yoloV8.videoFps = fps;

    yoloV8.frameCount = frameCount;

    // std::cout << "device_id:" << yoloV8.device_id << std::endl;

    // vector<DetectionResult> detectionResult;

    // Mat frame=cv::imread("../test/dog.jpg");

    // yoloV8.Detect(frame, detectionResult);

    // std::cout << "detectionResult size:" << detectionResult.size() << std::endl;

    string winname = "detectionResult-" + std::to_string(index);

    while (true)

    {

        double start = (double)cv::getTickCount();

        delay = int(1000 / fps);

        Mat frame;

        bool success = capture.read(frame); // 读取一帧数据

        // 检查是否成功读取帧

        if (!success)

        {

            std::cout << "index:" << index << ",读取完毕" << std::endl;

            yoloV8.PrintAvgCostTime();

            break;

        }

        vector<DetectionResult> detectionResult;

        yoloV8.Detect(frame, detectionResult);

        // std::cout <<"index:"<<index<< " thread id: " << threadId << " detectionResult size: " << detectionResult.size() << std::endl;

        yoloV8.detectionResultSize = detectionResult.size();

        if (printPerStepInfo)

        {

            yoloV8.PrintCostTime();

            yoloV8.PrintAvgCostTime();

        }

        if (showDet)

        {

            yoloV8.Draw(frame, detectionResult);

            imshow(winname, frame);

            double costTime = ((double)getTickCount() - start) / getTickFrequency();

            delay = delay - costTime;

            if (delay <= 0)

            {

                delay = 1;

            }

            if (waitKey(delay) == 27) // 通过按下ESC键退出循环

            {

                break;

            }

        }

    }

    capture.release(); // 释放视频对象

    if (showDet)

    {

        cv::destroyWindow(winname);

    }

    return 0;

}

int main(int argc, char *const argv[])

{

    int threadCount = 1;

    bool showDet = false;

    bool useGPU = false;

    bool printPerStepInfo = true;

    const char *keys ="{h help                || print this message}"

        "{c threadCount         | 1     | run thread number}"

        "{s showDet             | false | show detection result}"

        "{g useGPU              | false | use GPU}"

        "{p printPerStepInfo    | false | print per Step Info}";

    cv::CommandLineParser parser(argc, argv, keys);

    if(parser.has("help"))

    {

        parser.about("YoloV8 demo v1.0.0");

        parser.printMessage();

        return 0;

    }

    threadCount=parser.get<int>("threadCount");

    showDet=parser.get<bool>("showDet");

    useGPU=parser.get<bool>("useGPU");

    printPerStepInfo=parser.get<bool>("printPerStepInfo");

    std::cout << std::boolalpha;

    std::cout << "threadCount:" << threadCount << ",showDet:" << showDet<< ",useGPU:" << useGPU << ",printPerStepInfo:" << printPerStepInfo << std::endl;

    for (size_t i = 0; i < threadCount; i++)

    {

        std::thread thread(VideoDet, i, showDet, useGPU, printPerStepInfo);

        thread.detach();

    }

    while (true)

    {

        sleep(100);

    }

    return 0;

}

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <YoloV8.hpp>
#include <unistd.h>
#include <sys/syscall.h>
#include <thread>int VideoDet(int index, bool showDet, bool useGPU, bool printPerStepInfo)
{size_t threadId = static_cast<size_t>(syscall(SYS_gettid));// std::cout << "index:" << index << " thread id: " << threadId << std::endl;cv::VideoCapture capture("./test/test_car_person_1080P.mp4");// 检查视频是否成功打开if (!capture.isOpened()){std::cout << "无法读取视频文件" << std::endl;return -1;}int frameCount = capture.get(cv::CAP_PROP_FRAME_COUNT); // 获取视频帧数double fps = capture.get(cv::CAP_PROP_FPS);             // 获取帧率int delay = int(1000 / fps);                            // 根据帧率计算帧间间隔时间// delay=1;std::string model_path = "./models/yolov8n.onnx";std::string lable_path = "./models/lable.txt";int GPUCount = 2;int device_id = 0;if (index >= GPUCount){device_id = index % GPUCount;}else{device_id = index;}// device_id=0;YoloV8 yoloV8(model_path, lable_path, useGPU, device_id);yoloV8.index = index;yoloV8.threadId = threadId;yoloV8.videoFps = fps;yoloV8.frameCount = frameCount;// std::cout << "device_id:" << yoloV8.device_id << std::endl;// vector<DetectionResult> detectionResult;// Mat frame=cv::imread("../test/dog.jpg");// yoloV8.Detect(frame, detectionResult);// std::cout << "detectionResult size:" << detectionResult.size() << std::endl;string winname = "detectionResult-" + std::to_string(index);while (true){double start = (double)cv::getTickCount();delay = int(1000 / fps);Mat frame;bool success = capture.read(frame); // 读取一帧数据// 检查是否成功读取帧if (!success){std::cout << "index:" << index << ",读取完毕" << std::endl;yoloV8.PrintAvgCostTime();break;}vector<DetectionResult> detectionResult;yoloV8.Detect(frame, detectionResult);// std::cout <<"index:"<<index<< " thread id: " << threadId << " detectionResult size: " << detectionResult.size() << std::endl;yoloV8.detectionResultSize = detectionResult.size();if (printPerStepInfo){yoloV8.PrintCostTime();yoloV8.PrintAvgCostTime();}if (showDet){yoloV8.Draw(frame, detectionResult);imshow(winname, frame);double costTime = ((double)getTickCount() - start) / getTickFrequency();delay = delay - costTime;if (delay <= 0){delay = 1;}if (waitKey(delay) == 27) // 通过按下ESC键退出循环{break;}}}capture.release(); // 释放视频对象if (showDet){cv::destroyWindow(winname);}return 0;
}int main(int argc, char *const argv[])
{int threadCount = 1;bool showDet = false;bool useGPU = false;bool printPerStepInfo = true;const char *keys ="{h help                || print this message}""{c threadCount         | 1     | run thread number}""{s showDet             | false | show detection result}""{g useGPU              | false | use GPU}""{p printPerStepInfo    | false | print per Step Info}";cv::CommandLineParser parser(argc, argv, keys);if(parser.has("help")){parser.about("YoloV8 demo v1.0.0");parser.printMessage();return 0;}threadCount=parser.get<int>("threadCount");showDet=parser.get<bool>("showDet");useGPU=parser.get<bool>("useGPU");printPerStepInfo=parser.get<bool>("printPerStepInfo");std::cout << std::boolalpha;std::cout << "threadCount:" << threadCount << ",showDet:" << showDet<< ",useGPU:" << useGPU << ",printPerStepInfo:" << printPerStepInfo << std::endl;for (size_t i = 0; i < threadCount; i++){std::thread thread(VideoDet, i, showDet, useGPU, printPerStepInfo);thread.detach();}while (true){sleep(100);}return 0;
}

下载

源码下载

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

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

相关文章

AMD EPYC处理器性能宣称远超Nvidia Grace CPU

AMD近期发布了一份博客文章&#xff0c;其中对比了其EPYC处理器与Nvidia Grace Hopper Superchip&#xff08;基于Arm架构的72核CPU&#xff09;在一系列基准测试中的性能&#xff0c;声称EPYC处理器在多种工作负载下的表现最多可高出两倍。这一比较突显了AMD在数据中心CPU市场…

Covalent(CXT)运营商网络规模扩大 42%,以满足激增的需求

Covalent Network&#xff08;CXT&#xff09;是领先的人工智能模块化数据基础设施&#xff0c;网络集成了超过 230 条链并积累了数千名客户&#xff0c;目前 Covalent Network&#xff08;CXT&#xff09;网络迎来了五位新运营商的加入&#xff0c;包括 Graphyte Labs、PierTw…

使用PicGo操作gitee图床(及web端html不能访问图片的解决办法)

1.新建仓库 2.输入仓库名称,也就是图床名称,必须设置开源可见 也可以在创建仓库后,点击管理->基本信息->是否开源进行设置 鼠标悬浮到右上角头像->设置 点击私人令牌 点击生成新令牌,填写描述,直接点提交即可 点击提交后输入登录密码会生成一个token秘钥,如下,这个…

【C++】——初识模版

文章目录 前言函数模版函数模版的原理函数模版的实例化 类模版类模版的实例化 前言 当我们使用一个通用的函数&#xff1a; //为每一个类型都编写一个重载版本 void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& …

在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法

文章目录 LinuxWindowsmacOS 在Linux、Windows和macOS上释放IP地址并重新获取新IP地址的方法各有不同。以下是针对每种操作系统的详细步骤&#xff1a; Linux 使用DHCP客户端&#xff1a;大多数Linux发行版都使用DHCP&#xff08;动态主机配置协议&#xff09;来自动获取IP地址…

七、系统配置与性能评价(考点篇)

1 性能指标 性能指标&#xff0c;是软、硬件的性能指标的集成。在硬件中&#xff0c;包括计算机、各种通信交换设备、各类网 络设备等&#xff1b;在软件中&#xff0c;包括&#xff1a;操作系统、协议以及应用程序等。 1.计算机 对计算机评价的主要性能指标有&#xff1a; 时…

【嵌入式开发之数据结构】树的基本概念、逻辑结构和四种常用的遍历算法及实现

树&#xff08;Tree&#xff09;的定义及基本概念 树的定义 树(Tree)是个结点的有限集合T&#xff0c;它满足两个条件&#xff1a; 有且仅有一个特定的称为根&#xff08;Root&#xff09;的节点&#xff1b;其余的节点分为个互不相交的有限合集&#xff0c;其中每一个集合又…

日常开发记录分享——C#控件ToolTip实现分栏显示内容

文章目录 需求来源实现思路实施请看VCR等等别走&#xff0c;有优化 需求来源 需要在鼠标浮动到指定位置后提示出详细的信息&#xff0c;一开始使用的tooltip实现&#xff0c;但是里面的内容效果并不理想&#xff0c;需要有条理性&#xff0c;于是就想到能不能将展示的东西分列…

【Goland编辑器】Goland编辑器设置代码跳转的地方

记录一下&#xff1a; 关闭了插件里面proto相关的插件后&#xff0c; 在这里将Custom folding regions打开后&#xff0c; 点击代码跳转时&#xff0c;由proto生成的文件&#xff0c;就不会再跳转到proto定义处&#xff0c;而是跳转到代码使用的地方【正是我需要的】。

PHP接入consul,注册服务和发现服务【学习笔记】

PHP接入consul,注册服务和发现服务 consul安装 链接: consul安装 启动consul C:\Users\14684>consul agent -dev安装TP5 composer create-project topthink/think5.0.* tp5_pro --prefer-dist配置consul 创建tp5_pro/application/service/Consul.php <?php /*****…

linux版mysql8配置表名不区分大小写

mysql8的安装步骤可参考&#xff1a; mysql8的安装步骤 如果在安装mysql8&#xff0c;初始化之前&#xff0c;没有在my.cnf配置忽略大小写配置&#xff1a; [mysqld] lower_case_table_names1我们就需要重新初始化mysql 1 备份数据库文件 2 停止mysql服务 systemctl stop …

iOS开发设计模式篇第一篇MVC设计模式

目录 1. 引言 2.概念 1.Model 1.职责 2.实现 3.和Controller通信 1.Contrller直接访问Model 2.通过委托(Delegate)模式 3.通知 4.KVO 4.设计的建议 2.View 1.职责 2.实现 3.和Controller通信 1. 目标-动作&#xff08;Target-Action&#xff09;模式 2…

尾气处理系统工作原理

尾气处理系统工作原理 尾气处理系统是汽车发动机排放净化的重要部分&#xff0c;其中主要包括三元催化器、颗粒捕集器和尿素喷射系统等。以下是尾气处理系统的工作原理&#xff1a; 三元催化器&#xff1a;三元催化器是尾气处理系统中最常见的部件&#xff0c;三元催化器是尾气…

汉明权重(Hamming Weight)(统计数据中1的个数)VP-SWAR算法

汉明权重&#xff08;Hamming Weight&#xff09;&#xff08;统计数据中1的个数&#xff09;VP-SWAR算法 定义 汉明重量是一串符号中非零符号的个数。它等于同样长度的全零符号串的汉明距离(在信息论中&#xff0c;两个等长字符串之间的汉明距离等于两个字符串对应位置的不同…

USB转多路串口 - USB CDC设备枚举

先上参考资料&#xff1a; ST社区的&#xff1a; <<USB CDC类入门培训.pdf>>STM32 USB如何配置多个CDC设备状态与枚举过程CDC串口之从认识到认知 USB CDC 类基础 CDC(Communication Device Class)类是 USB2.0 标准下的一个子类&#xff0c;定义了通信相关设备的抽…

在Ubuntu上安装移远EC200M驱动

最近公司在做降本相关工作&#xff0c;考虑移远 EC20 4G模组成本较高&#xff0c;希望通过更低成本替换硬件&#xff0c;最后找到EC200M芯片&#xff0c;虽然EC200M速率(最大下行10M/s 最大上行5M/s)上低于EC20&#xff08;最大下行150M/s 最大上行50M/s&#xff09;,基本上可以…

tongue通lingual:灵根,舌也!

灵&#xff0c;指心灵、精神意识&#xff1b;灵根&#xff1a;汉语“灵根”&#xff0c;通常指人的舌头主。舌头是人心灵的表达根器&#xff0c;因此&#xff0c;灵根——指心灵外化的肉身凭据、可以像树根&#xff08;或一切植物根部&#xff09;一样延伸、像树根一样重要身体…

磁感应传感器 - 从零开始认识各种传感器【第十二期】

1、什么是磁感应传感器 磁感应传感器又叫做磁力计&#xff0c;是可以测量磁场大小或方向的设备。因为地球本质上是一个巨大的磁铁。磁力计可让您测量空间中某一点的磁场强度以及磁场方向。 图1 磁力计 磁力计已广泛应用于各种应用。它们用于测量地球磁场、地理测量、探测潜艇…

Python内存管理:引用计数与垃圾回收

✨ 内容&#xff1a; 在Python中&#xff0c;内存管理是一个重要且常常被忽视的话题。了解Python如何管理内存&#xff0c;不仅能帮助我们编写高效的代码&#xff0c;还能避免潜在的内存泄漏问题。今天&#xff0c;我们将通过一个实际案例&#xff0c;深入探讨Python的内存管理…

RabbitMQ:如何保证消息的可靠性?

RabbitMQ基础 RabbitMQ支持的消息模型 SpringBoot集成RabbitMQ 一、发送者的可靠性 消息从发送者发送消息&#xff0c;到消费者处理消息&#xff0c;需要经过的流程是这样的&#xff1a; 消息从生产者到消费者的每一步都有可能导致消息丢失&#xff1a; 发送消息时丢失&am…