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