回答編集履歴

2

参考コードの追加

2019/11/27 13:27

投稿

pepperleaf
pepperleaf

スコア6385

test CHANGED
@@ -21,3 +21,75 @@
21
21
 
22
22
 
23
23
  あと、タグに OpenCV も入れた方が回答付かないでしょうか?
24
+
25
+
26
+
27
+ ------------------
28
+
29
+ 既に解決済みとなっていますが、手元で、Bitmap(Format: Format24bppRgb)から、Matイメージに変換したコードです。
30
+
31
+ ```C++
32
+
33
+ // Format24bppRgb イメージから、Matデータを作成
34
+
35
+ void Bmp24ToMat(Bitmap ^img, cv::Mat *matImg)
36
+
37
+ {
38
+
39
+ Imaging::BitmapData ^bmpData = img->LockBits(
40
+
41
+ Rectangle(0, 0, img->Width, img->Height),
42
+
43
+ Imaging::ImageLockMode::ReadOnly, Imaging::PixelFormat::Format24bppRgb);
44
+
45
+ try {
46
+
47
+ *matImg = cv::Mat(img->Height, img->Width, CV_8UC3);
48
+
49
+ uchar *bmpSrc = (uchar *)bmpData->Scan0.ToPointer(); // Bitmapデータのポインタ
50
+
51
+ int srcLineSize = bmpData->Stride; // 1行あたりの byteサイズ
52
+
53
+ int imgHeight = img->Height;
54
+
55
+ int imgWidth = img->Width;
56
+
57
+ for (int line = 0; line < imgHeight; line++) {
58
+
59
+ uchar *src = (uchar *)&bmpSrc[line * srcLineSize];
60
+
61
+ uchar *dst = matImg->ptr(line);
62
+
63
+ for (int cols = 0; cols < imgWidth; cols++) {
64
+
65
+ dst[0] = src[2]; // B
66
+
67
+ dst[1] = src[1]; // G
68
+
69
+ dst[2] = src[0]; // R
70
+
71
+ src += 3;
72
+
73
+ dst += 3;
74
+
75
+ }
76
+
77
+ }
78
+
79
+ } finally {
80
+
81
+ img->UnlockBits(bmpData); // ロックの解除
82
+
83
+ }
84
+
85
+ }
86
+
87
+ ```
88
+
89
+ 24bitフォーマット限定なのは、手元のデータがこれで十分だったためと、他の形式を調べるのが面倒だったためです。
90
+
91
+ Bitmap と、MAT形式で、RGB(Bitmap)と、BGR(MAT)で順序が違うのに注意。
92
+
93
+
94
+
95
+ 参考情報として置いておきます。

1

追記

2019/11/27 13:27

投稿

pepperleaf
pepperleaf

スコア6385

test CHANGED
@@ -17,3 +17,7 @@
17
17
  調べるのは可能ですが、すぐに分かる人いないかな、、と。
18
18
 
19
19
  なお、Bitmapのピクセル読み出しは、一桁以上遅くなります。ご注意を。
20
+
21
+
22
+
23
+ あと、タグに OpenCV も入れた方が回答付かないでしょうか?