在cv :: mat中绘制矩形时遇到问题。我正在Unity和C ++之间进行通信以生成Android应用程序。
我使用了unity的webcamtexture相机,并使用PInvoke方法将信息发送到C ++。一旦进入C ++代码,我想绘制一个矩形,但我在图像中得到多个(见图),我真的不明白为什么。我希望你能帮助我,我附上C ++和C#代码。
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);
}
答案 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。