• YOLO(5) YOLO2 代码讲解


    运行

    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"内存空间上取数据
  • 相关阅读:
    小老虎CSDN博客流量分析
    C#中字符串的内存分配与驻留池
    最简单的基于FFmpeg的封装格式处理:视音频分离器(demuxer)
    HDU 3037 Saving Beans(Lucas定理的直接应用)
    Linux中IRC通讯工具Pidgin的基本用法
    jQuery整理笔记八----jQuery的Ajax
    Android ServiceManager启动
    C++开源码项目汇总
    虚拟现实游戏的十大误区
    适用android的MVP:怎样组织展示层
  • 原文地址:https://www.cnblogs.com/kekeoutlook/p/7768359.html
Copyright © 2020-2023  润新知