Научите вас шаг за шагом, как инкапсулировать DLL бита вывода YOLOv8 и вызвать ее клиенту.
Научите вас шаг за шагом, как инкапсулировать DLL бита вывода YOLOv8 и вызвать ее клиенту.
Предисловие

Существует несколько различных способов создания DLL. Самый простой и прямой способ — использовать проект библиотеки динамической компоновки (DLL), поставляемый с VS, для инкапсуляции соответствующих функций в класс, затем экспортировать несколько методов интерфейса и сгенерировать DLL. после успешной компиляции его можно вызвать в другом месте, как обычную стороннюю библиотеку после настройки.

01、Создать DLL

Сначала откройте VS и создайте пустой проект DLL. Откройте мастер рабочего стола VS следующим образом:

Создать проект библиотеки ссылок DLL

Затем добавьте файл mytest.h в заголовочный файл и добавьте следующий код:

Язык кода:javascript
копировать
#pragma once

#ifdef _DLL_EXPORTS
#define DLL_API _declspec(dllexport)
#else
#define DLL_API _declspec(dllimport)
#endif

#include <opencv2/opencv.hpp>

//==========Экспорт функции C++, вызов интерфейса============
class DLL_API MyTestDLL {
public:
    int addData(int a, int b);
    ~MyTestDLL();
};

Затем добавьте файл mytest.cpp в исходный файл и добавьте следующий код:

Язык кода:javascript
копировать
#define _DLL_EXPORTS
#include <mytest.h>

MyTestDLL::~MyTestDLL() {
    std::cout << "destory instance done!" << std::endl;
}

int MyTestDLL::addData(int a, int b) {
    int sum = 0;
    sum = a + b;
    std::cout << "sum: " << sum << std::endl;
    return sum;
}

Компиляция прошла успешно, и на дисплее появится следующее:

02、тестовая программа DLL

Создайте тестовую программу для проверки DLL. Создайте новый пустой консольный проект, добавьте файл main.cpp в исходный файл, а затем добавьте следующий код:

Язык кода:javascript
копировать
#include "opencv2/opencv.hpp"
#include "mytest.h"

int main(int argc, char** argv) {
    std::cout << "test mydll..." << std::endl;
    std::shared_ptr<MyTestDLL> mydll(new MyTestDLL());
    int sum = mydll->addData(3, 5);
    std::cout << "DLL invoke result : " << sum << std::endl;
    return 0;
}

Результаты бега следующие:

Тест DLL обнаружения объектов YOLOv8

Используя тот же метод, основанный на структуре библиотеки моделей глубокого обучения ONNXRUNTIME, я немного изменил предыдущий код C++ для обнаружения объектов ONNXRUNTIME + YOLOv8 и инкапсулировал класс рассуждений для обнаружения объектов YOLOv8 в виде DLL, который поддерживает вызовы интерфейсов C++ и C#. Код вызова клиента следующий:

Язык кода:javascript
копировать
#include "yolov8_infer.h"
#include <iostream>
#include <fstream>

std::string label_map = "D:/python/yolov5-7.0/classes.txt";
int main(int argc, char** argv) {
    std::string names = "10:bike";
    int pos = names.find_first_of(":");
    std::cout << names.substr(0, pos) << " -->> " << names.substr(pos + 1) << std::endl;
    std::vector<std::string> classNames;
    std::ifstream fp(label_map);
    std::string name;
    while (!fp.eof()) {
        getline(fp, name);
        if (name.length()) {
            classNames.push_back(name);
        }
    }
    fp.close();
    // std::shared_ptr<YOLOv5ORTDetector> detector(new YOLOv5ORTDetector());
    std::shared_ptr<YOLOv8ORTDetector> detector(new YOLOv8ORTDetector());
    detector->initConfig("D:/python/my_yolov8_train_demo/yolov8n.onnx", 640, 640, 0.25f, 0.5);
    cv::VideoCapture capture("D:/images/video/sample.mp4");
    cv::Mat frame;
    std::vector<DetectResult> results;
    while (true) {
        bool ret = capture.read(frame);
        if (frame.empty()) {
            break;
        }
        int64 start = cv::getTickCount();
        detector->detect(frame, results);
        float fps = static_cast<float>(cv::getTickFrequency()) / (cv::getTickCount() - start);
        cv::putText(frame, cv::format("FPS: %.2f", fps), cv::Point(50, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 0, 255), 2, 8); 
        for (DetectResult dr : results) {
            cv::Rect box = dr.box;
            cv::putText(frame, classNames[dr.classId], cv::Point(box.tl().x, box.tl().y - 10), cv::FONT_HERSHEY_SIMPLEX, .5, cv::Scalar(0, 0, 0));
        }
        cv::imshow("YOLOv8 + ONNXRUNTIME - Демонстрация экспорта DLL", frame);
        char c = cv::waitKey(1);
        if (c == 27) { // ESC покидать
            break;
        }
        // reset for next frame
        results.clear();
    }

    return 0;
}

Рабочий скриншот выглядит следующим образом:

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose