C ++中cv :: Rectangle的问题

时间:2017-10-18 10:17:31

标签: c# c++ opencv

在cv :: mat中绘制矩形时遇到问题。我正在Unity和C ++之间进行通信以生成Android应用程序。

我使用了unity的webcamtexture相机,并使用PInvoke方法将信息发送到C ++。一旦进入C ++代码,我想绘制一个矩形,但我在图像中得到多个(见图),我真的不明白为什么。我希望你能帮助我,我附上C ++和C#代码。

introducir la descripción de la imagen aquí

C#

void Update()
{
    //texto.text = texto.text + " / "+ testo().ToString();
    imgData = null;
    imgData = new byte[width * height * 3];
    resultado = null;
    resultado = new byte[width * height * 3];
    color = webcam.GetPixels32();
    int bytesPerPixel = 3;
    const int indexR = 0;
    const int indexG = 1;
    const int indexB = 2;
    for (var i = 0; i < color.Length; i++)
    {
        imgData[(i * bytesPerPixel) + indexR] = color[i].r;
        imgData[(i * bytesPerPixel) + indexG] = color[i].g;
        imgData[(i * bytesPerPixel) + indexB] = color[i].b;
    }
    color = null;
    ProcessFrame(imgData, resultado, 0, 0, 0,0, nuevo);
    nuevo = false;
    textura2 = new Texture2D(width, height, TextureFormat.RGB24, false);
    textura2.LoadRawTextureData(resultado);
    textura2.Apply();
    renderer.material.mainTexture = textura2;
    textura2 = null;
    Resources.UnloadUnusedAssets();
}

C ++

void ProcessFrame(unsigned char* arr, unsigned char* resu,int posx, int posy, int poswidth, int posheight,bool nuevo) {
    Mat dst;//dst image
    trueRect.x = 150;
    trueRect.y = 150;
    trueRect.width = 100;
    trueRect.height = 100;
    wi = poswidth;
    he = posheight;
    mal = 20;
    dst = Mat(tamWid,tamHeid,CV_8UC3, arr);
    rectangle(dst, Point(50,50), Point(100,100), cv::Scalar(0, 255, 255));
    copy(dst.datastart, dst.dataend, resu);
}

1 个答案:

答案 0 :(得分:1)

为了完整起见,我会发布答案。

问题出在

dst = Mat(tamWid,tamHeid,CV_8UC3, arr); 

constructor of Mat将前两个参数作为行,然后是列,在您的情况下是列和行。

所以它应该是:

dst = Mat(tamHeid,tamWid,CV_8UC3, arr);

其他注意事项

正如我在评论中所说,你应该知道某些可能的错误来源,因为OpenCV和Unity中的约定并不相同。其中之一是2D坐标系的起源。 OpenCV位于左上角和Unity中,或者至少GetPixels32功能位于图像的左下角。

另一个可能的问题是Colorspace。 OpenCV在加载,保存和其他函数时需要BGR图像,而在其他框架中它们使用32位RGB或RGBA。