質問編集履歴
3
問題部分がどこにあるのかの判断が間違っていたため。
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
OpenCV Matからunsigned char への変換に関して[C++]
|
1
|
+
OpenCV Matからunsigned char への変換に関して[C++/Qt]
|
body
CHANGED
File without changes
|
2
誤字
title
CHANGED
File without changes
|
body
CHANGED
@@ -67,7 +67,7 @@
|
|
67
67
|
```
|
68
68
|
表示部分2021/08/04追記
|
69
69
|
```C++
|
70
|
-
int W =
|
70
|
+
int W = 301;
|
71
71
|
int H = 300;
|
72
72
|
cv::Rect cv_roi_rect = cv::Rect(0,0,W, H);
|
73
73
|
//関数の呼び出し
|
1
質問内容について、不足していた情報を加筆
title
CHANGED
File without changes
|
body
CHANGED
@@ -2,6 +2,14 @@
|
|
2
2
|
|
3
3
|
カメラからとってきた画像を任意のサイズで切り取り、処理するソフトを作成しています。
|
4
4
|
OpenCVを利用してカメラの画像を取得したので元の画像はMat形式なのですが、処理部分はunsigned charで処理をするのでMatからunsigned charへ変換する必要があります。
|
5
|
+
|
6
|
+
カメラからの画像はカラーなのですが、処理の都合グレースケールへ変換しています。2021/08/04追記
|
7
|
+
frame_buffer:カメラからの画像
|
8
|
+
frame_GRAY:グレースケールへ変換後の画像
|
9
|
+
```C++
|
10
|
+
cv::cvtColor(frame_buffer,frame_GRAY,cv::COLOR_BGR2GRAY);
|
11
|
+
```
|
12
|
+
|
5
13
|
また、切り抜く幅が、4の倍数意外だと画像が乱れることが分かったので、一旦画像を大きく切り取ってunsigned charの変数へコピーした後、目的の大きさのunsigned charの変数へコピーをしています。
|
6
14
|
そこで下記のような関数を作成しました。
|
7
15
|
|
@@ -12,6 +20,14 @@
|
|
12
20
|
具体的には列ごとにずれが起こり、画像が斜めにゆがんだようになります。
|
13
21
|
また、画像の下部に想定している画像のデータ以外のものが入っているようで、黒い線が入ったようになります。
|
14
22
|
|
23
|
+
例 2021/08/04追記
|
24
|
+
処理する画像(グレースケール変換後)900×583pixel
|
25
|
+

|
26
|
+
幅300pixel 高さ300pixelで切り取り
|
27
|
+

|
28
|
+
幅301pixel 高さ300pixelで切り取り
|
29
|
+

|
30
|
+
|
15
31
|
### 該当のソースコード
|
16
32
|
|
17
33
|
```C++
|
@@ -30,14 +46,15 @@
|
|
30
46
|
if(remain != 0)
|
31
47
|
{
|
32
48
|
w_offset = 4 - remain;
|
33
|
-
if(rect.x + rect.width + w_offset >
|
49
|
+
if(rect.x + rect.width + w_offset > CAM_W)
|
34
50
|
{
|
35
51
|
x_offset = w_offset;
|
36
52
|
}
|
37
53
|
}
|
38
54
|
tmp_img = cv::Mat(origin_img,cv::Rect(rect.x + x_offset, rect.y, rect.width + w_offset, rect.height)).clone();
|
39
55
|
|
56
|
+
//CAM_WとCAM_Hは元画像の幅と高さ 2021/08/04追記
|
40
|
-
unsigned char tmp_ucharImage[
|
57
|
+
unsigned char tmp_ucharImage[CAM_W * CAM_H];
|
41
58
|
::memcpy(tmp_ucharImage, tmp_img.data, static_cast<size_t>((rect.width + w_offset) * rect.height));
|
42
59
|
for (int i = 0; i < rect.height; i++)
|
43
60
|
{
|
@@ -48,6 +65,18 @@
|
|
48
65
|
tmp_img.release();
|
49
66
|
}
|
50
67
|
```
|
68
|
+
表示部分2021/08/04追記
|
69
|
+
```C++
|
70
|
+
int W = 303;
|
71
|
+
int H = 300;
|
72
|
+
cv::Rect cv_roi_rect = cv::Rect(0,0,W, H);
|
73
|
+
//関数の呼び出し
|
74
|
+
ConvMatToUChar(pbImage, &frame_GRAY, cv_roi_rect);
|
75
|
+
//Qtで表示
|
76
|
+
QImage tmp_img = QImage(pbImage, W, H, QImage::Format_Indexed8);
|
77
|
+
QPixmap tmp_pixmap = QPixmap::fromImage(tmp_img);
|
78
|
+
Scene.addPixmap(tmp_pixmap);
|
79
|
+
```
|
51
80
|
|
52
81
|
### 試したこと
|
53
82
|
|
@@ -60,6 +89,12 @@
|
|
60
89
|
unsigned char *p_tmp = tmp_ucharImage + i * rect.width + x_offset;
|
61
90
|
|
62
91
|
```
|
92
|
+
|
93
|
+
変更後画像 2021/08/04追記
|
94
|
+
幅301pixel 高さ300pixelで切り取り
|
95
|
+

|
96
|
+
|
97
|
+
|
63
98
|
また、処理後の画像を確認すると斜めにゆがんでおり、問題が解決したわけでもないようです。
|
64
99
|
このことから、どうも自分が考えているようなメモリの並びになっていないことは何となくわかったのですが、OpenCVに関する知識が不足しているため、どのようなメモリ構造で保持されているのかを理解することができませんでした。
|
65
100
|
|