歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> OpenCV圖像的內存存儲

OpenCV圖像的內存存儲

日期:2017/3/1 9:38:14   编辑:Linux編程

OpenCV使用內存存儲器(memory storage)來統一管理各種動態的內存。內存存儲器在底層被實現為一個有許多相同大小的內存塊組成的雙向鏈表,通過這種結構,OpenCV可以從內存存儲器中快速的分配內存或將內存返回給內存存儲器。

--------------------------------------分割線 --------------------------------------

Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm

Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm

CentOS下OpenCV無法讀取視頻文件 http://www.linuxidc.com/Linux/2011-07/39295.htm

Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm

Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm

基於QT和OpenCV的人臉識別系統 http://www.linuxidc.com/Linux/2011-11/47806.htm

--------------------------------------分割線 --------------------------------------

1.數據結構

cvMemStorage結構體定義

typedef struct CvMemStorage
{
int signature;
CvMemBlock* bottom; /* First allocated block. */
CvMemBlock* top; /* Current memory block - top of the stack. */
struct CvMemStorage* parent; /* We get new blocks from parent as needed. */
int block_size; /* Block size. */
int free_space; /* Remaining free space in current block. */
}
CvMemStorage;

內存存儲器是一個用來存儲諸如序列,輪廓,圖形和子劃分等動態增長數據結構的底層結構.它由一系列同等大小的內存塊構成,呈列表型.其中,bottom域指列首,top域指當前指向的塊,但未必是列尾.在bottom和投票之間的所有塊空間(包括bottom,但不包括top)被完全占據;在top和列尾之間所有的塊空間(包括列尾,但不包括top)則是空的;而top塊空間本身則被部分占據.free_space指top塊內剩余的空字節數.

新分配的內存緩沖區(顯示的通過函數cvMemStorageAlloc分配,或隱式地通過高級函數cvSeqPush和cvGraphAddEdge等分配)總是起始於當前塊(即top塊)中剩余的那部分空間,但前提條件是剩余的部分有足夠大小的分配空間.分配後,free_space就減少了新分配的那部分內存大小,以及一些用來保存適當類型的附加大小.當top塊的剩余空間無法滿足被分配的塊(緩沖區)大小時,top塊的下一個存儲塊被置為當前塊(新的top塊),而free_space被置為先前分配的整個塊的大小.

如果已經不存在空的存儲塊(即top塊已是列尾),則必須再分配一個新的塊(或從parent那裡繼承,見函數cvCreatChildMemStorage)並將該塊加到列尾上去.於是,存儲器(memory storage)就如同棧(stack)一樣,bottom指向棧底,(top, free_space)對指向棧頂.棧頂可通過函數cvSaveMemStoragePos保存,通過函數cvRestoreMemStoragePos恢復指向,通過函數ClearStorage重置.

CvMemBlock結構體定義

typedef struct CvMemBlock
{
struct CvMemBlock* prev;
struct CvMemBlock* next;
}
CvMemBlock;

CvMemBlock代表一個單獨的內存存儲塊結構.內存存儲塊中的實際數據存儲在header塊(即一個以頭指針head指向的塊,該塊不存儲數據)之後,於是,內存塊的第i字節可以通過表達式((char*)(mem_block_ptr+1))[i]獲得.然而,通常沒必要直接獲得存儲結構的域.

CvMemStoragePos結構體定義

typedef struct CvMemStoragePos
{
CvMemBlock* top;
int free_space;
}
CvMemStoragePos;

此結構保存棧頂的地址.棧頂可以通過函數cvSaveMemStoragePos保存,也可以通過函數cvRestoreMemStoragePos恢復.

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2014-10/108688p2.htm

Copyright © Linux教程網 All Rights Reserved