teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

参考コードの追加

2019/11/27 13:27

投稿

pepperleaf
pepperleaf

スコア6385

answer CHANGED
@@ -9,4 +9,40 @@
9
9
  調べるのは可能ですが、すぐに分かる人いないかな、、と。
10
10
  なお、Bitmapのピクセル読み出しは、一桁以上遅くなります。ご注意を。
11
11
 
12
- あと、タグに OpenCV も入れた方が回答付かないでしょうか?
12
+ あと、タグに OpenCV も入れた方が回答付かないでしょうか?
13
+
14
+ ------------------
15
+ 既に解決済みとなっていますが、手元で、Bitmap(Format: Format24bppRgb)から、Matイメージに変換したコードです。
16
+ ```C++
17
+ // Format24bppRgb イメージから、Matデータを作成
18
+ void Bmp24ToMat(Bitmap ^img, cv::Mat *matImg)
19
+ {
20
+ Imaging::BitmapData ^bmpData = img->LockBits(
21
+ Rectangle(0, 0, img->Width, img->Height),
22
+ Imaging::ImageLockMode::ReadOnly, Imaging::PixelFormat::Format24bppRgb);
23
+ try {
24
+ *matImg = cv::Mat(img->Height, img->Width, CV_8UC3);
25
+ uchar *bmpSrc = (uchar *)bmpData->Scan0.ToPointer(); // Bitmapデータのポインタ
26
+ int srcLineSize = bmpData->Stride; // 1行あたりの byteサイズ
27
+ int imgHeight = img->Height;
28
+ int imgWidth = img->Width;
29
+ for (int line = 0; line < imgHeight; line++) {
30
+ uchar *src = (uchar *)&bmpSrc[line * srcLineSize];
31
+ uchar *dst = matImg->ptr(line);
32
+ for (int cols = 0; cols < imgWidth; cols++) {
33
+ dst[0] = src[2]; // B
34
+ dst[1] = src[1]; // G
35
+ dst[2] = src[0]; // R
36
+ src += 3;
37
+ dst += 3;
38
+ }
39
+ }
40
+ } finally {
41
+ img->UnlockBits(bmpData); // ロックの解除
42
+ }
43
+ }
44
+ ```
45
+ 24bitフォーマット限定なのは、手元のデータがこれで十分だったためと、他の形式を調べるのが面倒だったためです。
46
+ Bitmap と、MAT形式で、RGB(Bitmap)と、BGR(MAT)で順序が違うのに注意。
47
+
48
+ 参考情報として置いておきます。

1

追記

2019/11/27 13:27

投稿

pepperleaf
pepperleaf

スコア6385

answer CHANGED
@@ -7,4 +7,6 @@
7
7
  読み込んだBitmap形式をMAT形式に変換した事もありますが、ちょっと面倒。
8
8
  Bitmapデータのメモリ内のデータを直接、MAT形式にするのですが、.NETなので、内部データアクセスのため、メモリの直接、参照が必要。で、その後、配列データとして、MAT配列にコピー。即答できるほど中身を覚えてません。
9
9
  調べるのは可能ですが、すぐに分かる人いないかな、、と。
10
- なお、Bitmapのピクセル読み出しは、一桁以上遅くなります。ご注意を。
10
+ なお、Bitmapのピクセル読み出しは、一桁以上遅くなります。ご注意を。
11
+
12
+ あと、タグに OpenCV も入れた方が回答付かないでしょうか?