运行

darknet-rect2.exe detector demo F:/2Project/YOLO/yolo2/3data/TestData/data/voc.data F:/2Project/YOLO/yolo2/3data/TestData/cfg/yolo-voc.cfg  F:/2Project/YOLO/yolo2/3data/TestData/weight/yolo-voc.weights

  开始 darknet.c

detector参数进入run_detector函数中,在detector.c中

执行demo函数

第一个线程

  • 1 从视频读取照片帧 src  保存在一个内存空间  TCHAR szName[] = TEXT("Local\\MyFileMappingObject");    //指向同一块共享内存的名字
  • 2 新开辟四个内存空间,将读到的src图像划分四块,数据分别存入新开辟的内存。  疑问,存的时候照片数据额外*2.
  • 总结:一共创造了5个内存空间。 4个小内存空间被4个YOLO检测线程分别读取。   配合2,读的时候数据也得额外*2.  第一个大的内存空间不知知道作用。估计跟踪用。

1 最初输入的图片

大小1920*1080 3个通道  8位整形(1个字节)

2 将完整图片存进内存空间

2.1 头信息  记录图片大小格式

typedef struct
{
int read_rect;
int pointx;
int pointy;
int flag;
int width;
int height;
int type;
}imgInfHead; //图像的宽、高、类型;

  

// 初始赋值
imgInfHead img_inf_head;
img_inf_head.width = srcimage->width;
img_inf_head.height = srcimage->height;
img_inf_head.type = srcimage->nChannels; // 存进去
memcpy(MASTER_IMG_HEAD, &img_inf_head, sizeof(imgInfHead));
  • 1、memcpy 函数    函数原型:void *memcpy(void *dest, void *src, unsigned int count);
  • 把资源内存(src所指向的内存区域) 拷贝到目标内存(dest所指向的内存区域);拷贝多size字节数
  • 2  MASTER_IMG_HEAD
  • #define MASTER_IMG_HEAD (char*)pBuffer+FRAME_SIZE*0 //图像头信息首地址

2.2 图片本身数据

int channels = srcimage->nChannels;
// 将图片数据部分拷贝到内存
memcpy(MASTER_IMG_DATA, srcimage->imageData, srcimage->width*srcimage->height*channels);
  • 原图片数据占多少字节  每个像素 8位(一个字节)  共3个通道  每个通道 像素个数=长*宽    总计= 长*宽*3*1
  • #define MASTER_IMG_DATA (char*)pBuffer+FRAME_SIZE*1  //图像数据区首地址

3 新开辟4个内存区域 ,存入4个分图

IplImage *region1 = cvCreateImage(cvSize(1920, 1080), 8, 3);
IplImage *region2 = cvCreateImage(cvSize(1920, 1080), 8, 3);
IplImage *region3 = cvCreateImage(cvSize(1920, 1080), 8, 3);
IplImage *region4 = cvCreateImage(cvSize(1920, 1080), 8, 3);

  • 参数说明
  • cvsize
  • size中的图像的宽度和高度。(宽度和高度的顺序需要注意)
  • depth
  • 图像像素的位深度,值为可以为下面一种:
  • IPL_DEPTH_8U - 8位无符号整数
  • IPL_DEPTH_8S - 8位符号整数
  • IPL_DEPTH_16U - 16位无符号整数
  • IPL_DEPTH_16S - 16位符号整数
  • IPL_DEPTH_32S - 32位符号整数
  • IPL_DEPTH_32F - 单精度浮点数
  • IPL_DEPTH_64F - 双精度浮点数
memcpy(RECT4_IMG_HEAD, &img_inf_head_rect4, sizeof(imgInfHead));
int channels = region4->nChannels;
memcpy(RECT4_IMG_DATA, region4->imageData, 1.99*region4->width*region4->height*channels);
  • 不是很懂 为什存入的数据 又*2.这就导致 另外一个进程读取的时候,必须读的数据长度也得*2

第二个线程

  • 4个YOLO检测程序分别从第一个线程开辟内存("Local\\MyFileMappingObject")中4个小内存中读取1/4图片数据。  读的时候数据  长*宽*3(通道)*2 个字节 不知为何多*2
  • YOLO检测,画框,标记目标
  • 结果输出,4个检测线程分别保存在内存"Local\\MyFileMappingObjectbox"中 各自的 4个区域上。

第一个线程存四个分图的时候,定义i了各自的大小

rect1.x = 0;
rect1.y = 0;
rect1.width = 960;
rect1.height = 540;
rect2.x = 960;
rect2.y = 0;
rect2.width = 960;
rect2.height = 540;
rect3.x = 0;
rect3.y = 540;
rect3.width = 960;
rect3.height = 540;
rect4.x = 960;
rect4.y = 540;
rect4.width = 960;
rect4.height = 540;

  所以第二个线程读取的时候

读取头信息

imgInfHead img_inf_head_rect1;  //结构体 存放图像信息 
memcpy(&img_inf_head_rect1, RECT1_IMG_HEAD, sizeof(imgInfHead));
region1->width = img_inf_head_rect1.width;//960
region1->height = img_inf_head_rect1.height;//540
region1->nChannels = img_inf_head_rect1.type;//
int pointx = img_inf_head_rect1.pointx;// 中心坐标x
int pointy = img_inf_head_rect1.pointy;// 中心坐标y

读取图像数据

memcpy(region1->imageData, RECT1_IMG_DATA, 2 * region1->width*region1->height * 3);// 3个通道  2 未必代表2个字节 不知要*2为什么
cvCopy(region1, Master_img, NULL);

  

第三个线程

  • 从第二个线程开辟的名为"Local\\MyFileMappingObjectbox"内存空间上取数据

YOLO(5) YOLO2 代码讲解的更多相关文章

  1. 第二章--Win32程序运行原理 (部分概念及代码讲解)

    学习<Windows程序设计>记录 概念贴士: 1. 每个进程都有赋予它自己的私有地址空间.当进程内的线程运行时,该线程仅仅能够访问属于它的进程的内存,而属于其他进程的内存被屏蔽了起来,不 ...

  2. 『HTML5实现人工智能』小游戏《井字棋》发布,据说IQ上200才能赢【算法&代码讲解+资源打包下载】

    一,什么是TicTacToe(井字棋) 本游戏为在下用lufylegend开发的第二款小游戏.此游戏是大家想必大家小时候都玩过,因为玩它很简单,只需要一张草稿纸和一只笔就能开始游戏,所以广受儿童欢迎. ...

  3. Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解

    Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解 说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返 ...

  4. faster RCNN(keras版本)代码讲解(3)-训练流程详情

    转载:https://blog.csdn.net/u011311291/article/details/81121519 https://blog.csdn.net/qq_34564612/artic ...

  5. 毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行

    毕业设计java实验室预约管理系统SSH机房预约系统javaweb机房实验室排课系统mysql机房管理系统 实验室管理系统 课程设计 代码讲解 调试运行 注意:该项目只展示部分功能,如需了解,评论区咨 ...

  6. CUDA学习,第一个kernel函数及代码讲解

    前一篇CUDA学习,我们已经完成了编程环境的配置,现在我们继续深入去了解CUDA编程.本博文分为三个部分,第一部分给出一个代码示例,第二部分对代码进行讲解,第三部分根据这个例子介绍如何部署和发起一个k ...

  7. 李宏毅 Gradient Descent Demo 代码讲解

    何为梯度下降,直白点就是,链式求导法则,不断更新变量值. 这里讲解的代码为李宏毅老师机器学习课程中 class 4 回归展示 中的代码demo   Loss函数 python代码如下 import n ...

  8. Widget代码讲解

    参考:https://zhuanlan.zhihu.com/p/28225011 QT版本为5.12.4 1.main.cpp #include "widget.h" #inclu ...

  9. 图像匹配 | NCC 归一化互相关损失 | 代码 + 讲解

    文章转载自:微信公众号「机器学习炼丹术」 作者:炼丹兄(已授权) 作者联系方式:微信cyx645016617(欢迎交流共同进步) 本次的内容主要讲解NCCNormalized cross-correl ...

随机推荐

  1. Mini2440 通过 SPI 操作 OLED (裸板下使用 SPI 控制器)

    在裸板下使用 SPI 的话,有两种方法可选: 使用 IO 口模拟 SPI 进行操作 使用 SPI 控制器进行操作 这里我们选用控制器的方式,简单方便. 初始化 SPI static void SPIC ...

  2. Uboot 引导内核时加载地址与入口地址问题

    如果使用 mkimage 生成内核镜像文件的话,会在内核的前头加上了 64 bytes 的信息头,供建立 tag 之用.bootm 命令会首先判断 bootm xxx 这个指定的地址 xxx 与 -a ...

  3. C#基础---浅谈XML读取以及简单的ORM实现

    背景: 在开发ASP.NETMVC4 项目中,虽然web.config配置满足了大部分需求,不过对于某些特定业务,我们有时候需要添加新的配置文件来记录配置信息,那么XML文件配置无疑是我们选择的一个方 ...

  4. Object与Class的区别

    1.在Scala中声明private变量,Scala编译器会自动生成get,set方法 2.在Scala中变量需要初始化 3.在Scala中没有静态修饰符,在object下的成员全部都是静态的,如果在 ...

  5. 撩课-Java每天5道面试题第17天

    116.说下Struts的设计模式 MVC模式: web应用程序启动时 就会加载并初始化ActionServler. 用户提交表单时, 一个配置好的ActionForm对象被创建, 并被填入表单相应的 ...

  6. SpringCloud(二)Eureka集群与Feign

    两个Eureka 上一篇是两个服务像一个Eureka注册,如果Eureka宕掉了就不好了,现在来搭建两个Eureka,两个服务分别像其注册.两个Eureka都用本机来模拟,用两个端口号来表示. 首先修 ...

  7. [转]---UAP中如何判断当前APP在哪个平台设备上运行

    在做Win10开发的时候,我们可能经常会需要获得当前程序在在哪个平台设备上运行,用于UI和相关API的调用,那么可以通过什么方式知道当前APP运行的平台呢? 今天这里提供两个方法给大家做参考: 方法一 ...

  8. DOM之城市二级联动

    1.HTML内容 <select id="province"> <option>请选择</option> <option>山东省&l ...

  9. linux学习笔记-安装配置使用clamav杀毒软件

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.安装clamav 2.更新病毒库 # freshclam 如果更新不了,或者更新特别慢,可以手动下载病毒库文件,放到/var ...

  10. 如何用原生JS实现一个简单的promise

    我又又又回来了,最近真是累的跟狗一样,急需一个大保健回复一下子精力 我现在是一边喝着红牛一边写着博客,好了好了,不扯了,回归整体好吧 先简单来说一下啥是promise吧 它是什么?Promise是一个 ...