2017-06-22 38 views
3

當通過WebCamTexture從網絡攝像頭獲取視頻輸入時,返回圖像的最下一行是完全黑色(RGB = 0,0,0)。 我已經嘗試了幾種不同的攝像頭,並獲得與所有這些相同的結果。 使用Windows 10相機應用程序時,以及在Processing或Java中獲取網絡攝像頭Feed時,我的確獲得了正確的圖像。WebCamTexture底部的黑線圖像

在畫布上顯示視頻時,會出現黑線(始終爲1像素高,並且與圖像一樣寬),將快照保存到磁盤以及使用GetPixels32()直接查看像素數據。

這裏是黑線在畫面圖像的底部:

enter image description here

我已經證實,返回的圖像是正確的尺寸,即黑色的行不是一個額外的行。它始終是黑色圖像的最低行。

我已經包含了我在下面使用的c#代碼。

黑線的原因是什麼,有沒有辦法避免它?

我查找過關於這個問題的任何信息,但沒有在網上找到任何東西。我是Unity的初學者,對任何幫助感激不盡。

我使用統一版本5.6.2但與5.5

public class CamController : MonoBehaviour 
{ 
    private WebCamTexture webcamTexture; 
    private WebCamDevice[] devices; 

    void Start() 
    { 
     //start webcam 
     webcamTexture = new WebCamTexture(); 
     devices = WebCamTexture.devices; 
     webcamTexture.deviceName = devices[0].name; 
     webcamTexture.Play(); 
    } 

    void Update() 
    { 
     //if user presses C capture cam image 
     if (Input.GetKeyDown(KeyCode.C)) 
      captureImage(); 
    } 

    void captureImage() 
    { 
     //get webcam pixels 
     Color32[] camPixels; 
     camPixels = webcamTexture.GetPixels32(); 

     //print pixel data for first and second (from bottom) lines of image to console 
     for (int y = 0; y < 2; y++) 
     { 
      Debug.Log("Line: " + y); 
      for (int x = 0; x < webcamTexture.width; x++) 
      { 
       Debug.Log(x + " - " + camPixels[y * webcamTexture.width + x]); 
      } 
     } 

     //save webcam image as png 
     Texture2D brightBGTexture = new Texture2D(webcamTexture.width, webcamTexture.height); 
     brightBGTexture.SetPixels32(camPixels, 0); 
     brightBGTexture.Apply(); 
     byte[] pngBytes = brightBGTexture.EncodeToPNG(); 
     File.WriteAllBytes(Application.dataPath + "/../camImage.png", pngBytes); 
    } 
} 
+0

你在'Unity'中使用的'shader'是否顯示來自攝像頭feed的'Texture2D'? – Hristo

+0

我的目標不是顯示攝像頭,而是直接使用圖像像素數據而不顯示圖像。我只顯示用於測試的相機饋送,並且在那時我沒有指定着色器。我在畫布上使用了一個RawImage,並且這個代碼在它上面顯示了攝像頭信息'public RawImage camImage;''camImage.texture = webcamTexture;'我不認爲這是一個陰影問題,因爲黑色像素已經出現在返回的像素數據中通過'GetPixels32()'。 – Torgil

回答

1

同樣的問題致電SetPixels32後,你必須電話Texture2D.Apply將更改應用於該Texture2D

你應該在將Texture2D編碼爲png之前。

//save webcam image as png 
Texture2D brightBGTexture = new Texture2D(webcamTexture.width, webcamTexture.height); 
brightBGTexture.SetPixels32(camPixels, 0); 
brightBGTexture.Apply(); 
byte[] pngBytes = brightBGTexture.EncodeToPNG(); 
File.WriteAllBytes(Application.dataPath + "/../camImage.png", pngBytes); 

編輯

即使調用Texture2D.Apply()的問題依然存在。這是WebCamTexture API的錯誤,您應該通過編輯器提交缺陷報告。

+0

調用Apply()在這裏沒有幫助。應用將更改的像素上傳到圖形卡,編碼爲png時不需要。我通過嘗試你的建議來證實這一點。另外,正如我之前提到的,即使直接查看(在完成任何編碼之前)GetPixels32()返回的像素數據,黑線也存在。通過查看我的意思是將像素數據打印到控制檯或等價物。 – Torgil

+0

*「編碼爲png時不需要」*不可以。有必要。是的,它確實會將更改上傳到顯卡,它也會將更改應用於Texture2D,以便更新新像素。通過調用Apply,您現在可以訪問CPU上的像素,其中包括調用'EncodeToPNG'函數。有關更多信息,請參閱鏈接的文檔。 – Programmer

+0

另外,哪個圖像是黑暗的?保存的PNG? – Programmer