質問編集履歴

3

問題部分がどこにあるのかの判断が間違っていたため。

2021/08/04 06:54

投稿

M_Aki
M_Aki

スコア1

test CHANGED
@@ -1 +1 @@
1
- OpenCV Matからunsigned char への変換に関して[C++]
1
+ OpenCV Matからunsigned char への変換に関して[C++/Qt]
test CHANGED
File without changes

2

誤字

2021/08/04 06:54

投稿

M_Aki
M_Aki

スコア1

test CHANGED
File without changes
test CHANGED
@@ -136,7 +136,7 @@
136
136
 
137
137
  ```C++
138
138
 
139
- int W = 303;
139
+ int W = 301;
140
140
 
141
141
  int H = 300;
142
142
 

1

質問内容について、不足していた情報を加筆

2021/08/04 02:53

投稿

M_Aki
M_Aki

スコア1

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,22 @@
6
6
 
7
7
  OpenCVを利用してカメラの画像を取得したので元の画像はMat形式なのですが、処理部分はunsigned charで処理をするのでMatからunsigned charへ変換する必要があります。
8
8
 
9
+
10
+
11
+ カメラからの画像はカラーなのですが、処理の都合グレースケールへ変換しています。2021/08/04追記
12
+
13
+ frame_buffer:カメラからの画像
14
+
15
+ frame_GRAY:グレースケールへ変換後の画像
16
+
17
+ ```C++
18
+
19
+ cv::cvtColor(frame_buffer,frame_GRAY,cv::COLOR_BGR2GRAY);
20
+
21
+ ```
22
+
23
+
24
+
9
25
  また、切り抜く幅が、4の倍数意外だと画像が乱れることが分かったので、一旦画像を大きく切り取ってunsigned charの変数へコピーした後、目的の大きさのunsigned charの変数へコピーをしています。
10
26
 
11
27
  そこで下記のような関数を作成しました。
@@ -26,6 +42,22 @@
26
42
 
27
43
 
28
44
 
45
+ 例 2021/08/04追記
46
+
47
+ 処理する画像(グレースケール変換後)900×583pixel
48
+
49
+ ![元の画像](a8f2b211ab74936b71bdb2a35c6c2dba.jpeg)
50
+
51
+ 幅300pixel 高さ300pixelで切り取り
52
+
53
+ ![幅300pixel](fea0363df9cfab2737bab1fad938d6cf.jpeg)
54
+
55
+ 幅301pixel 高さ300pixelで切り取り
56
+
57
+ ![イメージ説明](5348e6de06a7b75af26e85fbc3566cbb.jpeg)
58
+
59
+
60
+
29
61
  ### 該当のソースコード
30
62
 
31
63
 
@@ -62,7 +94,7 @@
62
94
 
63
95
  w_offset = 4 - remain;
64
96
 
65
- if(rect.x + rect.width + w_offset > SMC_W)
97
+ if(rect.x + rect.width + w_offset > CAM_W)
66
98
 
67
99
  {
68
100
 
@@ -76,7 +108,9 @@
76
108
 
77
109
 
78
110
 
111
+ //CAM_WとCAM_Hは元画像の幅と高さ 2021/08/04追記
112
+
79
- unsigned char tmp_ucharImage[SMC_W * SMC_H];
113
+ unsigned char tmp_ucharImage[CAM_W * CAM_H];
80
114
 
81
115
  ::memcpy(tmp_ucharImage, tmp_img.data, static_cast<size_t>((rect.width + w_offset) * rect.height));
82
116
 
@@ -98,6 +132,30 @@
98
132
 
99
133
  ```
100
134
 
135
+ 表示部分2021/08/04追記
136
+
137
+ ```C++
138
+
139
+ int W = 303;
140
+
141
+ int H = 300;
142
+
143
+   cv::Rect cv_roi_rect = cv::Rect(0,0,W, H);
144
+
145
+ //関数の呼び出し
146
+
147
+ ConvMatToUChar(pbImage, &frame_GRAY, cv_roi_rect);
148
+
149
+ //Qtで表示
150
+
151
+ QImage tmp_img = QImage(pbImage, W, H, QImage::Format_Indexed8);
152
+
153
+ QPixmap tmp_pixmap = QPixmap::fromImage(tmp_img);
154
+
155
+ Scene.addPixmap(tmp_pixmap);
156
+
157
+ ```
158
+
101
159
 
102
160
 
103
161
  ### 試したこと
@@ -122,6 +180,18 @@
122
180
 
123
181
  ```
124
182
 
183
+
184
+
185
+ 変更後画像 2021/08/04追記
186
+
187
+ 幅301pixel 高さ300pixelで切り取り
188
+
189
+ ![イメージ説明](86123b6b3b7750847d7ef208ad5639c9.jpeg)
190
+
191
+
192
+
193
+
194
+
125
195
  また、処理後の画像を確認すると斜めにゆがんでおり、問題が解決したわけでもないようです。
126
196
 
127
197
  このことから、どうも自分が考えているようなメモリの並びになっていないことは何となくわかったのですが、OpenCVに関する知識が不足しているため、どのようなメモリ構造で保持されているのかを理解することができませんでした。