Hi,
i’m currently working on saliencymap creation in Unity an image. I got the opencv libary up and running, but i’m not able to send the saliencymap from c++ to c#.
I added two screenshots for the visual aspect of my problem.
i have the following code in use:
extern "C" bool __declspec(dllexport) __stdcall ComputeSaliency(unsigned char* image, int width, int height, unsigned char* saliencyMap)
{
Mat matSaliencyMap(height, width, CV_8UC4);
Mat matImage(height, width, CV_8UC4, image);
flip(matImage, matImage, 0);
cvtColor(matImage, matImage, COLOR_BGRA2RGB);
Ptr<Saliency> salAlg;
salAlg = StaticSaliencyFineGrained::create();
salAlg->computeSaliency(matImage, matSaliencyMap);
Mat saveSaliency;
matSaliencyMap.convertTo(saveSaliency, CV_8UC4, 255);
imwrite("D:\\Unity Projekte\\LabelPlacement\\Assets\\Resources\\saliencyMap.png", saveSaliency);
flip(saveSaliency, saveSaliency, 0);
memcpy(saliencyMap, saveSaliency.data, saveSaliency.total());
}
and for c# in Unity
public Texture2D SaliencyMapWithOpenCV(Texture2D newTexture) {
Texture2D tmpTexture = new Texture2D(newTexture.width, newTexture.height);
Color32[] pixel = newTexture.GetPixels32();
Color32[] saliencyMap = new Color32[pixel.Length];
handlePixel = GCHandle.Alloc(pixel, GCHandleType.Pinned);
handleSaliency = GCHandle.Alloc(saliencyMap, GCHandleType.Pinned);
ComputeSaliency(handlePixel.AddrOfPinnedObject(), newTexture.width, newTexture.height, handleSaliency.AddrOfPinnedObject());
for (int i = 0; i < saliencyMap.Length; i++) {
saliencyMap[i].a = 255;
}
tmpTexture.SetPixels32(saliencyMap);
tmpTexture.Apply(true);
return tmpTexture;
}
and finally the sprite creation with the texture in c# as well
saliencyTexture = si.SaliencyMapWithOpenCV(texture2D);
saliency.sprite = Sprite.Create(saliencyTexture, new Rect(0.0f, 0.0f, saliencyTexture.width, saliencyTexture.height), new Vector2(0.5f, 0.5f), 100.0f);
Thanks you in advance,
Basti

