using OpenCvSharp;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
public class Program
{
public static void Main()
{
int width = 396;
int height = 495;
int channels = 3;
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("MySharedMemory"))
{
using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
{
byte[] buffer = new byte[width * height * channels];
accessor.ReadArray(0, buffer, 0, buffer.Length);
// 만약 buffer 앞 부분에 3개의 4바이트 int 데이터가 저장되어 있다면 아래와 같이 읽는다.
// (물론 위에서 buffer[] 생성시 12바이트의 추가 공간 확보가 필요하다)
//int h = ((buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + (buffer[3]));
//Console.WriteLine(h);
//int w = ((buffer[4] << 24) + (buffer[5] << 16) + (buffer[6] << 8) + (buffer[7]));
//Console.WriteLine(w);
//int c = ((buffer[8] << 24) + (buffer[9] << 16) + (buffer[10] << 8) + (buffer[11]));
//Console.WriteLine(c);
// When buffer[] represents encoded image data (ex. JPEG, PNG, etc.), you can use
// FromImageData or ImDecode.
//buffer = System.IO.File.ReadAllBytes("image.jpg");
//Mat mat = Mat.FromImageData(buffer, ImreadModes.Color);
//Mat mat = Cv2.ImDecode(buffer, ImreadModes.Color);
// When buffer[] represens pixel data (BGRBGR...) , you need to hard-code copying operation.
//Mat mat = new Mat(height, width, MatType.CV_8UC3);
//Mat.Indexer<Vec3b> indexer = mat.GetGenericIndexer<Vec3b>();
//for (int y = 0; y < height; y++)
//{
// for (int x = 0; x < width; x++)
// {
// int pos = y * width * channels + x * channels;
// byte blue = buffer[pos + 0];
// byte green = buffer[pos + 1];
// byte red = buffer[pos + 2];
// Vec3b newValue = new Vec3b(blue, green, red);
// indexer[y, x] = newValue;
// }
//}
// If buffer[]'s step length is equal to the Mat's, there is a more effective way.
Mat mat = new Mat(height, width, MatType.CV_8UC3);
int length = height * width * channels;
Marshal.Copy(buffer, 0, mat.Data, length);
Cv2.ImShow("image", mat);
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
}