Ghost-like artifact when passing image to blur() or Canny() in openCV
<p>So I have some C++ opencv code that I'm calling from C# inside unity to process the input from the webcam. </p>

<p>I compile my C++ code to a DLL that I then import into C# with a DLLImport. I pass a pinned GCHandle reference to the C++ code so that I can manipulate the image array from C++. This all works. I can pass each frame to my C++ dll and have it grayscale it. It works wonderfully.</p>

<p>The problem arises when I try to do things other than just making the frame grayscale. I tried to do a simple blur() and the output comes out with a weird ghosted image to the left and right. I'm not sure what could be going wrong. It also happens when I do GaussianBlur() or Canny().</p>

<p>On the left is when I cover the camera, you can see the weird artifact more clearly. In the middle is the artifact itself after passing through GaussianBlur(). It seems like it creates copies of the image and overlays them with itself. And on the right is when it's just grayscaled to show that THAT works properly. So I figure it's not something that's happening between C# and C++, it's something that happens only when I pass the frame through opencv's blur or gaussianblur or canny.</p>

<p><img src="https://i.imgur.com/00JeTn2.png" alt="example of artifact"></p>

<p>Here is the C# code in unity</p>

<pre><code>using UnityEngine;
using System.Collections;
using System;
using System.Runtime.InteropServices;

public class camera : MonoBehaviour {
    [DllImport("tee")]
    public static extern void bw([MarshalAs(UnmanagedType.LPStruct)]
        IntPtr data, 
        int width,
        int height);
    WebCamTexture back;
    Color32[] data;
    Byte[] byteData;
    Renderer rend;
    String test;
    Texture2D tex;
    GCHandle dataHandle;

    // Use this for initialization
    void Start () {
        back = new WebCamTexture();
        back.Play();
        rend = GetComponent&lt;Renderer&gt;();

        tex = new Texture2D(back.width, back.height, TextureFormat.ARGB32, false);
        data = back.GetPixels32();
        dataHandle = GCHandle.Alloc(data, GCHandleType.Pinned);
    }
    void OnDisable()
    {
        dataHandle.Free();
    }

    // Update is called once per frame
    void Update () {
        back.GetPixels32(data);
        bw(dataHandle.AddrOfPinnedObject(), back.width, back.height);

        tex.SetPixels32(data);
        tex.Apply();
        rend.material.mainTexture = tex;
    }
}
</code></pre>

<p>and here is the C++ code that gets compiled into a DLL</p>

<pre><code>#include &lt;opencv2\core\core.hpp&gt;
#include &lt;opencv2\imgproc\imgproc.hpp&gt;

using namespace std;
using namespace cv;

extern "C"
{
    __declspec(dllexport) void bw(int data, int width, int height) {
        unsigned char * buffer = reinterpret_cast&lt;unsigned char *&gt;(data);
        Mat mat = Mat(width, height, CV_8UC4, buffer).clone();
        Mat gray;
        cvtColor(mat, gray, CV_RGBA2GRAY);

        Mat blurred;
        GaussianBlur(gray, blurred, Size(3, 3), 2, 2);

        if (blurred.isContinuous()) {
            for (int i = 0; i &lt; (width * height); i++) {
                unsigned char * pxl = buffer + 4 * i;
                pxl[0] = blurred.data[i]; //red channel
                pxl[1] = blurred.data[i]; //green channel
                pxl[2] = blurred.data[i]; //blue channel
                pxl[3] = (unsigned char)255; // alpha channel
            }
        }
    }
}
</code></pre>