C 语言实现物体检测:使用 YOLO 模型

news/2024/12/4 22:13:15/文章来源:https://www.cnblogs.com/ocr12/p/18587340
  1. 环境准备
    在进行物体检测之前,确保你已经在 C 语言环境中安装了以下软件:

OpenCV 用于图像处理。
Darknet 用于 YOLO 模型训练和推理。
安装步骤:
安装 OpenCV:
bash

sudo apt-get install libopencv-dev
安装 Darknet:
bash

git clone https://github.com/pjreddie/darknet.git
cd darknet
make
下载 YOLO 模型权重:
bash

wget https://pjreddie.com/media/files/yolov3.weights
2. C 语言代码:调用 YOLO 模型进行物体检测
假设已经成功安装了 Darknet 库,我们将在 C 语言中加载 YOLO 模型并进行物体检测。代码如下:

C 语言示例代码:
c

include <stdio.h>

include <opencv2/opencv.hpp>

include "darknet.h"

using namespace cv;

int main() {
// 初始化网络模型
char *cfgfile = "cfg/yolov3.cfg"; // YOLO配置文件
char *weightfile = "yolov3.weights"; // YOLO预训练权重文件
char *datafile = "cfg/coco.data"; // 数据文件,指定类别信息

// 加载网络并进行初始化
network *net = load_network(cfgfile, weightfile, 0);
set_batch_network(net, 1);// 加载图像
Mat image = imread("test.jpg");
if (image.empty()) {printf("Could not open or find the image!\n");return -1;
}// 将图像转换为 YOLO 输入所需的格式
image *im = mat_to_image(image);// 执行推理,得到检测结果
float *predictions = network_predict(net, im->data);// 解析输出,筛选出置信度高的框
int num_classes = 80;  // COCO 数据集的类数
float threshold = 0.5;  // 置信度阈值// 通过后处理得到检测框
detection *dets = get_network_boxes(net, image.cols, image.rows, threshold, 0.5, 0, 1, &num_dets);// 筛选检测框并绘制框
for (int i = 0; i < num_dets; i++) {if (dets[i].prob[0] > threshold) {Rect box(dets[i].bbox.x, dets[i].bbox.y, dets[i].bbox.w, dets[i].bbox.h);rectangle(image, box, Scalar(0, 255, 0), 2);}
}// 显示检测结果
imshow("Detection", image);
waitKey(0);  // 等待按键事件return 0;

}更多内容访问ttocr.com或联系1436423940
3. 代码解析
初始化 YOLO 网络: 使用 load_network() 加载 YOLO 配置文件和预训练权重。
加载图像: 使用 OpenCV 函数 imread() 加载待检测的图像。
输入图像格式转换: 将图像转换为 YOLO 模型输入需要的格式。
执行推理: 使用 network_predict() 对图像进行前向推理,得到预测结果。
后处理和绘制框: 解析模型输出,并根据置信度筛选出检测框,然后用 OpenCV 在图像上绘制绿色的矩形框。
显示检测结果: 使用 OpenCV 的 imshow() 显示最终检测结果。
4. 运行代码
编译并运行 C 程序:

bash

gcc -o object_detection object_detection.c -lopencv_core -lopencv_highgui -lopencv_imgproc -L./darknet -l darknet
./object_detection
此命令将编译程序并运行,显示包含检测框的图像。

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

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

相关文章

高性能计算-NEON-图像旋转

1. 对512*512 png 四通道图像顺时针旋转90度 思路: 像素分块,对块内转置;再水平镜像。图像库使用 stb img 2. 代码 #include <stdio.h> #include <arm_neon.h>#include <stdlib.h> #define STB_IMAGE_IMPLEMENTATION #include "./stb/stb_image.h&quo…

使用自定义 MSBuild Task 阻止 git 的大文件提交

一个自定义 MSBuild Task 的实际案例NuGet Gallery | Jgrass.MSBuild.GitTask 前言 在 .NET 项目自定义 MSBuild Task 中提到,可以使用自定义 MSBuild Task 来实现自定义功能。 这里介绍实现的 git 提交大文件提交拦截功能。 引入 nuget 包之后,设置好要拦截的大小,内置的 L…

ElasticSearch学习笔记

ES7.x和ES8.x的学习笔记1.ElasticSearch概述 1.1 ElasticSearch是什么 Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上 百台服务器,处理PB级别的数…

不死的魔女与灾厄的少年

传闻......森林的深处里住着一位不死的魔女森林的深处,住着一位魔女。 她已经活了几十个世纪,每代王国的历史书籍中都有她的出现。 人们称她为: “不死的魔女” 寂静了百年的森林,在某一天,闯入了一个不速之客,他倒在了魔女的屋子前。 那是一个浑身染血的少年,不着片缕,…

地址冲突检测(DAD)

地址冲突检测(DAD) 目录地址冲突检测(DAD)一、前言二、免费ARP报文实验拓扑报文分析 一、前言 公网: public,互联网可以访问 ,地址必须唯一 私网:RFC1918隔离公网,安全复用 优点:地址段重叠使用 缺点:地址冲突 IPV6唯一本地地址 = IPV6私网地址,提供global id二、免…

2025年昆明理工大学MBA研究生招生人数

--昆工MBA考研、管理与经济学院、125100工商管理、125602项目管理、199管理类综合能力、F009 政治、F008政治+项目管理概论

ybt2.5章AC自动机题解

算法理解 即在字典树上跑kmp T1: 根据这个结论我自己手搓了一个AC自动机上去,喜提TLE 我是如何操作的呢? 我当时的想法是这样的:我们把字典树从根到该节点形成的链看成是一个模式串与文本串进行匹配,然后就用一个dfs来传递j就可以解决了 然后我打开书一看到这幅图,立马就不…

了解checksec显示的各种参数和保护

Arch:内核(32位/64位) RELRO 在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处. GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: rea…

20222325 2024-2025-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入…

【C++】关于 Visual Studio 的使用技巧(保姆级教程)

目录fliter 视图输出文件位置设置查看预处理结果将目标文件转换为可读的汇编自定义程序入口调试时查看变量在内存中的具体值查看代码的反汇编 fliter 视图 visual studio默认是filter视图(中文为筛选器)项目下的是filter而非硬盘目录里实际的文件夹,这时新建的也是filter想要…

Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案

问题背景 执行yum update出现如下报错排查虚拟机是否联网 ping -c 4 www.baidu.com 可以看到网络链接没有问题解决方案 原因是国外的镜像源有问题,换成国内的即可。 备份原有的镜像源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下…