質問編集履歴
3
問題部分がどこにあるのかの判断が間違っていたため。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
OpenCV Matからunsigned char への変換に関して[C++]
|
1
|
+
OpenCV Matからunsigned char への変換に関して[C++/Qt]
|
test
CHANGED
File without changes
|
2
誤字
test
CHANGED
File without changes
|
test
CHANGED
@@ -136,7 +136,7 @@
|
|
136
136
|
|
137
137
|
```C++
|
138
138
|
|
139
|
-
int W = 30
|
139
|
+
int W = 301;
|
140
140
|
|
141
141
|
int H = 300;
|
142
142
|
|
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 >
|
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[
|
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に関する知識が不足しているため、どのようなメモリ構造で保持されているのかを理解することができませんでした。
|