Torgil
Torgil

Reputation: 43

Black line at bottom of WebCamTexture image

When getting video input from a webcam via WebCamTexture the bottom row of the returned image is completely black (RGB = 0,0,0). I have tried several different webcams and get the same result with all of them. I do get a correct image when using the Windows 10 Camera app and also when getting a webcam feed in Processing or Java.

The black line (always 1 pixel high and as wide as the image) appears when showing video on the canvas, saving a snapshot to disk and also when looking directly at the pixel data with GetPixels32().

Here is the black-line at the Bottom of the picture image:

enter image description here

I have confirmed that the image returned is the correct size, i.e. the black row is not an extra row. It's always the lowest line of the image that is black.

I have included the c# code I'm using below.

What is the cause of this black line and is there a way to avoid it?

I have looked for any information on this issue but not found anything online. I'm a complete beginner at Unity and would be grateful for any help.

I'm using Unity version 5.6.2 but had the same issue with 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);
    }
}

Upvotes: 3

Views: 497

Answers (1)

Programmer
Programmer

Reputation: 125455

After calling SetPixels32, you must call Texture2D.Apply to apply the changes to the Texture2D.

You should that before encoding the Texture2D to 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);

EDIT:

Even with calling Texture2D.Apply() the problem is still there. This is a bug with the WebCamTexture API and you should file for a bug report through the Editor.

Upvotes: 1

Related Questions