Linux C++ OpenVINO 物体检测 Demo

news2025/1/23 7:19:12

目录

main.cpp

#include <iostream>
#include <string>
#include <vector>
#include <openvino/openvino.hpp> 
#include <opencv2/opencv.hpp>    
#include <dirent.h>  
#include <stdio.h> 
#include <time.h>
#include <unistd.h>
 
std::vector<cv::Scalar> colors = { cv::Scalar(0, 0, 255) , cv::Scalar(0, 255, 0) , cv::Scalar(255, 0, 0) ,
								   cv::Scalar(255, 100, 50) , cv::Scalar(50, 100, 255) , cv::Scalar(255, 50, 100) };
 
const std::vector<std::string> class_names = {
	"person", "bicycle", "car", "motorcycle", "airplane", "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", "couch",
	"potted plant", "bed", "dining table", "toilet", "tv", "laptop", "mouse", "remote", "keyboard", "cell phone",
	"microwave", "oven", "toaster", "sink", "refrigerator", "book", "clock", "vase", "scissors", "teddy bear",
	"hair drier", "toothbrush" };
 
using namespace cv;
using namespace dnn;
 
Mat letterbox(const cv::Mat& source)
{
	int col = source.cols;
	int row = source.rows;
	int _max = MAX(col, row);
	Mat result = Mat::zeros(_max, _max, CV_8UC3);
	source.copyTo(result(Rect(0, 0, col, row)));
	return result;
}
 
int main()
{
	clock_t start, end;
	std::cout << "共8步" << std::endl;
 
	char   buffer[100];
	getcwd(buffer, 100);
	std::cout << "当前路径:" << buffer << std::endl;
 
	// -------- Step 1. Initialize OpenVINO Runtime Core --------
	std::cout << "1. Initialize OpenVINO Runtime Core" << std::endl;
	ov::Core core;
 
	// -------- Step 2. Compile the Model --------
	std::cout << "2. Compile the Model" << std::endl;
	String model_path = String(buffer) + "/yolov8s.xml";
	std::cout << "model_path:\t" << model_path << std::endl;
	ov::CompiledModel compiled_model;
	try {
		compiled_model = core.compile_model(model_path, "CPU");
	}
	catch (std::exception& e) {
		std::cout << "Compile the Model 异常:" << e.what() << std::endl;
		return 0;
	}
	
	// -------- Step 3. Create an Inference Request --------
	std::cout << "3. Create an Inference Request" << std::endl;
	ov::InferRequest infer_request = compiled_model.create_infer_request();
 
	// -------- Step 4.Read a picture file and do the preprocess --------
	std::cout << "4.Read a picture file and do the preprocess" << std::endl;
	String img_path = String(buffer) + "/test2.jpg";
	std::cout << "img_path:\t" << img_path << std::endl;
	Mat img = cv::imread(img_path);
 
	// Preprocess the image
	Mat letterbox_img = letterbox(img);
	float scale = letterbox_img.size[0] / 640.0;
	Mat blob = blobFromImage(letterbox_img, 1.0 / 255.0, Size(640, 640), Scalar(), true);
 
	// -------- Step 5. Feed the blob into the input node of the Model -------
	std::cout << "5. Feed the blob into the input node of the Model" << std::endl;
	// Get input port for model with one input
	auto input_port = compiled_model.input();
	// Create tensor from external memory
	ov::Tensor input_tensor(input_port.get_element_type(), input_port.get_shape(), blob.ptr(0));
	// Set input tensor for model with one input
	infer_request.set_input_tensor(input_tensor);
 
	start = clock();
	// -------- Step 6. Start inference --------
	std::cout << "6. Start inference" << std::endl;
	infer_request.infer();
	end = clock();
	std::cout << "inference time = " << double(end - start) << "ms" << std::endl;
 
	// -------- Step 7. Get the inference result --------
	std::cout << "7. Get the inference result" << std::endl;
	auto output = infer_request.get_output_tensor(0);
	auto output_shape = output.get_shape();
	std::cout << "The shape of output tensor:\t" << output_shape << std::endl;
	int rows = output_shape[2];        //8400
	int dimensions = output_shape[1];  //84: box[cx, cy, w, h]+80 classes scores
 
	std::cout << "8. Postprocess the result " << std::endl;
	// -------- Step 8. Postprocess the result --------
	float* data = output.data<float>();
	Mat output_buffer(output_shape[1], output_shape[2], CV_32F, data);
	transpose(output_buffer, output_buffer); //[8400,84]
	float score_threshold = 0.25;
	float nms_threshold = 0.5;
	std::vector<int> class_ids;
	std::vector<float> class_scores;
	std::vector<Rect> boxes;
 
	// Figure out the bbox, class_id and class_score
	for (int i = 0; i < output_buffer.rows; i++) {
		Mat classes_scores = output_buffer.row(i).colRange(4, 84);
		Point class_id;
		double maxClassScore;
		minMaxLoc(classes_scores, 0, &maxClassScore, 0, &class_id);
 
		if (maxClassScore > score_threshold) {
			class_scores.push_back(maxClassScore);
			class_ids.push_back(class_id.x);
			float cx = output_buffer.at<float>(i, 0);
			float cy = output_buffer.at<float>(i, 1);
			float w = output_buffer.at<float>(i, 2);
			float h = output_buffer.at<float>(i, 3);
 
			int left = int((cx - 0.5 * w) * scale);
			int top = int((cy - 0.5 * h) * scale);
			int width = int(w * scale);
			int height = int(h * scale);
 
			boxes.push_back(Rect(left, top, width, height));
		}
	}
	//NMS
	std::vector<int> indices;
	NMSBoxes(boxes, class_scores, score_threshold, nms_threshold, indices);
 
	// -------- Visualize the detection results -----------
	for (size_t i = 0; i < indices.size(); i++) {
		int index = indices[i];
		int class_id = class_ids[index];
		rectangle(img, boxes[index], colors[class_id % 6], 2, 8);
		std::string label = class_names[class_id] + ":" + std::to_string(class_scores[index]).substr(0, 4);
		Size textSize = cv::getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, 0);
		Rect textBox(boxes[index].tl().x, boxes[index].tl().y - 15, textSize.width, textSize.height + 5);
		cv::rectangle(img, textBox, colors[class_id % 6], FILLED);
		putText(img, label, Point(boxes[index].tl().x, boxes[index].tl().y - 5), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));
	}
 
	cv::imwrite("detection.png", img);
	std::cout << "detect success" << std::endl;

    cv::imshow("window",img);
    cv::waitKey(0);
 
	return 0;
}

 CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(openvino_test )

find_package(OpenCV REQUIRED )

find_package(OpenVINO REQUIRED )

file(COPY test.jpg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY test2.jpg DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY yolov8s.xml DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
file(COPY yolov8s.bin DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

add_executable(openvino_test main.cpp )

target_link_libraries(openvino_test ${OpenCV_LIBS} openvino)

编译 

ll

mkdir build
cd build
cmake ..

make

 

ll

 

测试运行

./openvino_test

 效果

Demo下载

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

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

相关文章

OJ练习第171题——复制带随机指针的链表

复制带随机指针的链表 力扣链接&#xff1a;138. 复制带随机指针的链表 题目描述 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个…

Temu新手入门需要注意哪些细节?如何在Temu中添加尺码?

要在temu平台取得商业成功&#xff0c;创业者们必须注重商品策划和市场调研、关注市场动向和用户反馈、建立良好的互动和交流机制、发挥temu的优势和特点&#xff0c;本文介绍了temu新手入门需要注意细节以及如何在TEMU中添加尺码&#xff0c;快来学习一下吧。 temu新手入门需…

使用Javassist修改组件化 Router

工程目录图 请点击下面工程名称&#xff0c;跳转到代码的仓库页面&#xff0c;将工程 下载下来 Demo Code 里有详细的注释 代码&#xff1a;TransformDemo

Python中数据去重的重要性、技巧和实现代码

在数据处理和分析的过程中&#xff0c;数据去重是数据处理和分析的关键步骤之一。重复的数据会导致分析结果的偏差&#xff0c;影响决策的准确性。通过数据去重&#xff0c;我们可以确保分析所使用的数据集是干净、准确的&#xff0c;从而提高分析结果的可靠性&#xff0c;Pyth…

【LeetCode题目详解】第十章 单调栈part03 84.柱状图中最大的矩形(day60补)

本文章代码以c为例&#xff01; 一、力扣第84题&#xff1a;柱状图中最大的矩形 题目&#xff1a; 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 …

【数据结构】—堆详解(手把手带你用C语言实现)

食用指南&#xff1a;本文在有C基础的情况下食用更佳 &#x1f525;这就不得不推荐此专栏了&#xff1a;C语言 ♈️今日夜电波&#xff1a;水星—今泉愛夏 1:10 ━━━━━━️&#x1f49f;──────── 4:23 …

掌控你的Mac——用Bookshelf Library简化文件管理

Bookshelf Library for Mac是一款高效的文件索引管理工具&#xff0c;它可以帮助你轻松整理和查找Mac上的所有文档和书籍。下面我们来看看这款工具的五个特点。 安装&#xff1a;Bookshelf Library for Mac(文件索引管理工具)v6.3.4激活版 第一&#xff0c;Bookshelf Library…

【广州华锐互动】工业零件拆装VR培训:无需前往现场,提高学习效率

工业零件拆装VR培训是一种新兴的培训方式&#xff0c;通过虚拟现实技术将设备拆解过程进行模拟&#xff0c;让学员在虚拟环境中进行实际操作和学习。这种培训方式具有许多益处&#xff0c;本文将对其进行详细阐述。 首先&#xff0c;工业零件拆装VR培训可以提高学员的学习效率。…

好用的软件测试框架有哪些?测试框架的作用是什么?

软件测试框架是现代软件开发过程中至关重要的工具&#xff0c;它可以帮助开发团队更加高效地进行测试和验证工作&#xff0c;从而大大提高软件质量和用户体验。 一、好用的软件测试框架 1. Selenium&#xff1a;作为一种开源的自动化测试框架&#xff0c;Selenium具有功能强大…

【Jmeter】什么是BeanShell?

一、什么是BeanShell&#xff1f; BeanShell是用Java写成的,一个小型的、免费的、可以下载的、嵌入式的Java源代码解释器&#xff0c;JMeter性能测试工具也充分接纳了BeanShell解释器&#xff0c;封装成了可配置的BeanShell前置和后置处理器&#xff0c;分别是 BeanShell Pre…

快速打造BI大屏 激活各行业数据价值

BI的概念普遍认为最早由Gartner公司提出&#xff0c;简单可理解为基于现代企业经营理论与信息应用技术系统对信息、数据进行挖掘、分析和处理&#xff0c;最终辅助商业决策的一个企业服务解决方案。 在企业数字化进程中&#xff0c;这样的解决方案主要以信息技术系统为底座&am…

力扣 -- 673. 最长递增子序列的个数

小算法&#xff1a; 通过一次遍历找到数组中最大值出现的次数&#xff1a; 利用这个小算法求解这道题就会非常简单了。 参考代码&#xff1a; class Solution { public:int findNumberOfLIS(vector<int>& nums) {int nnums.size();vector<int> len(n,1);auto…

23.Xaml Frame控件---->导航控件

1.运行效果 2.运行源码 a.Xaml源码 <Window x:Class="testView.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.mic…

leetcode330. 按要求补齐数组(java)

按要求补齐数组 题目描述贪心算法代码演示 题目描述 难度 - 困难 leetcode - 330. 按要求补齐数组 给定一个已排序的正整数数组 nums &#xff0c;和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中&#xff0c;使得 [1, n] 区间内的任何数字都可以用 nums 中某几…

演讲实录:大模型时代,我们需要什么样的AI算力系统?

当前&#xff0c;“百模大战”带来了算力需求的爆发&#xff0c;AI芯片产业也迎来巨大机遇&#xff0c;“创新架构开源生态”正在激发多元AI算力产品百花齐放。面对新的产业机会&#xff0c;AI算力产业链亟需通过上下游协作共同把握机遇。 近日&#xff0c;浪潮信息AI&HPC…

Unity Shader顶点数据疑问

1&#xff09;Unity Shader顶点数据疑问 2&#xff09;Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 3&#xff09;安卓游戏启动后提示“应用程序异常” 这是第352篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等技术知…

MCU芯片测试:性能指标测试痛点是什么?ATECLOUD能否解决?

MCU芯片测试指标的核心是性能指标&#xff0c;包括处理器性能、存储器容量和读写速度&#xff0c;外设性能等。芯片测试对自动化测试的要求很高&#xff0c;ATECLOUD-IC不仅解决了传统测试方法的问题&#xff0c;而且也可以满足芯片测试的高要求&#xff0c;高效地完成MCU芯片性…

详解qsort函数的使用及模拟实现qsort函数

目录 引言&#xff1a; 1. qsort函数简介&#xff1a; &#x1f388;qsort函数原型&#xff1a; &#x1f388;函数参数介绍&#xff1a; &#x1f388;比较函数(compar)的编写&#xff1a; &#x1f388;(补充) void*类型的指针&#xff1a; 2.qsort函数示例&#xff1a;…

java将excel中用例写到world中【搬代码】

首先创建用例 例如&#xff1a; 运行代码: 预期结果&#xff1a; 实际结果&#xff1a;与预期结果不符合&#xff0c;哪位大佬有代码传授一下啊&#xff0c;实在是不知道咋写了 代码&#xff1a; package com.znzdh.qitagongju; import com.spire.doc.*; import com.spire…

安徽省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著

安徽省图书馆典藏《乡村振兴振兴战略下传统村落文化旅游设计》许少辉八一新著