C# and Python OpenCV Image Data Share
OpenCV 2025. 2. 16. 22:28 |C#과 Python 프로그램간 이미지 데이터를 공유해 보자.
1) Python 프로그램 데이터를 C# 프로그램에 공유.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import time
import mmap
import cv2
frame = cv2.imread("image.jpg", cv2.IMREAD_COLOR)
h, w, c = frame.shape
buffer_size = h * w * c
# 3개의 4바이트(12바이트) 데이터를 위한 추가 공간 확보
#buffer_size = h * w * c + 12
# Open a memory-mapped file.
mm = mmap.mmap(-1, buffer_size, "Local\\MySharedMemory")
try:
# 만약 3개의 4바이트 데이터를 저장하고 싶다면 아래와
# 같이 한다.
#mm.write(h.to_bytes(4))
#mm.write(w.to_bytes(4))
#mm.write(c.to_bytes(4))
mm.write(frame.tobytes())
# Keep the Python script running for demonstration.
while True:
time.sleep(1000) # Sleep to prevent busy waiting.
finally:
mm.close()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
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();
}
}
}
}
|
2) C# 프로그램 데이터를 Python 프로그램에 공유.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
using System;
using System.IO.MemoryMappedFiles;
using System.Runtime.InteropServices;
using OpenCvSharp;
public class Program
{
public static void Main()
{
Mat image = Cv2.ImRead("image.jpg", ImreadModes.Color);
int width = image.Width;
int height = image.Height;
int channels = image.Channels();
int buffer_size = width * height * channels;
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("MySharedMemory", buffer_size))
{
using (MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor())
{
byte[] buffer = new byte[buffer_size];
Marshal.Copy(image.Data, buffer, 0, buffer_size);
accessor.WriteArray<byte>(0, buffer, 0, buffer_size);
}
Console.WriteLine("waiting...");
Console.ReadLine();
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
import mmap
import numpy as np
import cv2
height = 495
width = 396
channels = 3
buffer_size = height * width * channels
mm = mmap.mmap(-1, buffer_size, "Local\\MySharedMemory")
try:
buffer = mm.read(buffer_size)
image_arr = np.frombuffer(buffer, np.ubyte)
image = image_arr.reshape(height, width, channels)
cv2.imshow("image", image)
cv2.waitKey(0)
finally:
mm.close()
cv2.destroyAllWindows()
|
결과는 같다.
'OpenCV' 카테고리의 다른 글
OpenCV with Qt for Python(PyQt) (0) | 2025.02.09 |
---|---|
Compiling and Running OpenPose from Source (2) | 2022.05.15 |
GDI+ and OpenCV - Bitmap to Mat & Mat to Bitmap Conversion (0) | 2022.01.02 |
OpenCV with C# and Camera (0) | 2021.12.29 |
OpenCvSharp for Network (0) | 2021.12.28 |