2011-06-30 29 views
0

我可以使用Data[,,]來訪問灰色圖像的每個像素,但不能爲Bgr圖像這樣做。 我已經寫以下代碼:無法訪問圖像<Bgr, byte>。C#中的數據屬性emgucv

Image<Bgr, byte> currentFrame = capture.QueryFrame(); 
Image<Gray, byte> grayFrame = currentFrame.Convert<Gray, byte>(); 
Byte gray = grayFrame.Data[0, 10, 0]; 
Byte blue = currentFrame.Data[0, 10, 0]; 

其拋出異常:Object reference not set to an instance of an object.

我檢查通過添加斷點,結果是這樣的:

currentFrame.Data is nul 
grayFrame.Data has 3d array 
gray has value 71 

,然後將下一行引起的錯誤

爲什麼currentFrame.Data應該是一個3d數組,爲空?我如何訪問Bgr圖像的Image.Data屬性?

我正在使用emgucv 2.2.1。 2.1版本出現同樣的問題。

感謝所有幫助


我發現是相當令人吃驚。

Image<Bgr, byte> currentFrame = capture.QueryFrame(); 
byte b; 
try 
{ 
    b = image.Data[0, 0, 0];   //Line (A) 
} 
catch (Exception ex) 
{ MessageBox.Show("Before Convert : "+ex.Message); }   

image = image.Convert<Bgr, byte>(); 

try 
{ 
    b = image.Data[0, 0, 0];   //Line (B) 
} 
catch (Exception ex) 
{ MessageBox.Show("AfterConvert : "+ex.Message); } 

在上面的代碼中:行(A)拋出異常「對象拒絕未設置爲對象的實例」。但添加代碼後

image = image.Convert<Bgr, byte>(); 

線(B)順利運行,沒有任何例外。

有誰知道這是爲什麼發育?

+1

這是什麼語言?那是C#嗎?添加適當的標籤,以便您可以從理解您的代碼的人那裏獲得幫助。 – karlphillip

回答

0

capture.QueryFrame()返回null,您嘗試在最後一行訪問它。我會看看那種方法。我猜測.Convert是一種擴展方法,並且該方法檢查null並返回非空的內容。

+0

capture.QueryFrame()已返回有效的幀,因爲我能夠在imageBox中顯示幀(如imageBox1.Image = currentFrame;正常工作) – KarunP

3

[雖然它是很晚回答,我張貼這種以供將來參考。]
最近,我遇到了同樣的問題。我無法訪問由QueryFrameData屬性返回的圖像的像素值。但是在應用任何操作(例如調整大小,轉換)之後,可以訪問所得到的圖像。這個和解決方案的原因很簡單。

DataQueryFrame返回的圖像的屬性始終爲空。其圖像數據存儲在非託管內存中,因此無法訪問徹底的Data屬性。要訪問一個幀的像素值,你只需克隆它。

Image<Bgr, byte> currentFrame = capture.QueryFrame(); 
Image<Bgr, byte> frame = currentFrame.Clone(); 
// now access using Data property 
byte b = frame.Data[0,0,0]; 
byte g = frame.Data[0,0,1]; 
byte r = frame.Data[0,0,2]; 
-1

Heyy在那裏,嘗試在您的.../bin/Debug中添加.xml文件。然後輸入你的ProcesFrame方法:// haar是HaarCascade haar = new HaarCascade(「haarcascade_frontalface_default.xml」);