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"內存空間上取數據

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM