CCaptureVideo類的bug以及修改方法

2021-04-27 10:44:07 字數 1028 閱讀 1102

開啟攝像頭--->關閉攝像頭--->再開啟攝像頭--->再關閉攝像頭--->再開啟攝像頭...等等以此類推。

對於網上流傳的ccapturevideo類而言,它是有問題的,假設我們宣告了乙個ccapturevideo類的指標

ccapturevideo * m_cap ;

然後,在oninitdialog函式中建立該物件,

m_cap = new ccapturevideo() ;

然後就是例牌的列舉可用攝像頭(m_cap->enumdevices (m_cam_lst);),或者直接呼叫init函式

對於預設的ccapturevideo而言,第一次這麼用是完全沒有問題的,可以很容易的把usb攝像頭的資料得到。

假定,現在我們按下了「stop」按鈕,此時,我們可以用delete m_cap ;可以看到實時顯示的那個視窗不見了。這也是正確的。

當我們再次開啟攝像頭的時候,問題就出現了。我們還是按照剛剛一樣的順序初始化m_cap物件,但是這次呼叫init函式的時候確彈出乙個對話方塊「can't build graph」錯誤。區區怪事!

後來仔細跟蹤才知道問題出在:

ccomptrm_pgrabber;

這個智慧型指標上面。它第一次工作是正常的,但是第二次就有問題了,似乎是資源沒有釋放掉。

修改的方法也很簡單,直接手工定義:

isamplegrabber * m_pgrabber ;

...使用這個指標的**也需要修改:

原來的初始化**是:

hr = m_pgrabber.cocreateinstance( clsid_samplegrabber );

我們可以改為:

hr = cocreateinstance( clsid_samplegrabber, null, clsctx_inproc_server, iid_isamplegrabber, (void**)&m_pgrabber );

當然,在析構的時候千萬不要忘記了:

safe_release(m_pgrabber);

這樣,我們想要開關攝像頭多少次都沒問題了

類的類方法

類方法 說明 1提通過類名進行呼叫 2定義時需要使用裝飾器classmethod 作用 1可以建立物件或者簡潔的建立物件 2可以對外提供簡單易用的介面 靜態方法 說明 1通過裝飾器staticmethod修飾 2通過類名進行呼叫 總結 1凡是靜態方法能夠解決的問題類方法都能解決 2若方法中沒有涉及類...

類的組合(類的包含)

1.組合關係 2.繼承關係 1.封閉類 類a的資料成員 公有或私有 是類b的物件,這一形式是類的組合,類a就叫做封閉類 2.物件成員 類a的資料成員 公有或私有 是類b的物件,則該資料成員叫做物件成員 例如 include include using namespace std class poin...

類和類的封裝

在日常生活中,我們總是將事物進行分門別類。列如 電腦,手機,相機等等,這些稱呼都是對於某一類事物的總稱。我們還能將電腦按照品牌分類,比如,戴爾電腦 惠普電腦 蘋果電腦 華碩電腦等。這些都是抽象的概念。我的電腦這個實體,它就是乙個具體的事物,我的電腦是戴爾的,但我不能說戴爾電腦是我的電腦。類和物件是面...