2010-06-25 53 views
2

我正在使用dshownet(第一次)和C#。我有一個樣本可以將網絡攝像頭輸入並顯示在表單上。我現在需要使用鼠標在視頻流頂部繪製一個矩形。 (意圖是從那裏追蹤盒子裏面的東西)。如何使用鼠標在視頻流上填充未填充的框

我聽說有一種叫做VMR的東西。所以我去了dshownet的樣品,並通過他們。我沒有找到任何使用鼠標在視頻流上疊加形狀的樣本。這裏有人建議使用colorkey。另一個人說使用GDI +和鼠標處理。我試圖編譯DXLogo樣品,但得到這個錯誤:


錯誤1無法創建抽象類或接口「爲System.Drawing.Image」 C的一個實例:\的Documents and Settings \ TLNA \桌面\決賽年份項目\庫\ DirectShow的圖書館2 \ DirectShowSamples 2010年二月\樣本\捕獲\ DxLogo \ Capture.cs 128 32 DxLogo-2008


的代碼段:


if (fileName.Length > 0) 
      { 
       m_Bitmap = new Image(fileName); // error happened here 

       Rectangle r = new Rectangle(0, 0, m_Bitmap.Width, m_Bitmap.Height); 
       m_bmdLogo = m_Bitmap.LockBits(r, ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); 
      } 

我知道我必須通過Bitmap9接口。但我真的不知道從哪裏開始。我應該閱讀Directshow API文檔嗎?

btw我也有這本書編程微軟Directshow數字視頻和電視。我開始閱讀這本書,並在幾頁之後停止,因爲代碼主要是用C++編寫的。我應該繼續閱讀這本書嗎?我怎樣才能完成在C#中提到的某些任務?

任何有關如何在視頻上畫畫的建議。一些有用的鏈接(教程)會有所幫助。

非常感謝 Tlna

回答

1

我不知道爲什麼DirectShow的樣品不編譯,但你可以改變問題行:

m_Bitmap = new Image(fileName); 

這樣:

m_Bitmap = new Bitmap(fileName); 

並讓它工作。

你實際上在這裏遇到了一個相當困難的問題。 DirectShow通過在設備上下文(如PictureBox或表單,甚至屏幕)上每秒多次(取決於幀速率)繪製一系列靜止幀來渲染視頻。您(作爲程序員)也可以(輕鬆地)將圖形直接渲染到同一設備上下文中。

但是,爲了使您的繪製框出現在運行視頻的頂部,您的代碼需要在DirectShow繪製視頻的每個幀之後立即繪製矩形;否則,下一幀將消除你的矩形。 DirectShow對象可能具有某種可以處理的幀渲染事件,然後在事件處理函數內重新繪製您的盒子(基於初始和當前鼠標座標,您可以從任何MouseDown和MouseMove事件中獲得)控制你正在使用)。

更新:我剛剛看了一下我的代碼,當時我正在玩DirectShow。NET,它看起來像有一個事件(DsEvCode.Repaint),您可以將它鉤入並用於繪製您的盒子。

我沒有看過你正在使用的代碼示例,但做一個搜索,看看你可以在你的代碼中找到的OnGraphNotify()方法,你應該能夠加入這樣的事情:

if (code == DsEvCode.Repaint) 
{ 
    // draw the box here 
} 

據推測,這個事件是在視頻的每一幀被渲染後觸發的,所以如果你在這裏重新繪製你的盒子,每次它會出現,就好像盒子是持久的。