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

質問編集履歴

3

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

2021/08/04 06:54

投稿

M_Aki
M_Aki

スコア1

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

誤字

2021/08/04 06:54

投稿

M_Aki
M_Aki

スコア1

title CHANGED
File without changes
body CHANGED
@@ -67,7 +67,7 @@
67
67
  ```
68
68
  表示部分2021/08/04追記
69
69
  ```C++
70
- int W = 303;
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

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

2021/08/04 02:53

投稿

M_Aki
M_Aki

スコア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
+ ![元の画像](a8f2b211ab74936b71bdb2a35c6c2dba.jpeg)
26
+ 幅300pixel 高さ300pixelで切り取り
27
+ ![幅300pixel](fea0363df9cfab2737bab1fad938d6cf.jpeg)
28
+ 幅301pixel 高さ300pixelで切り取り
29
+ ![イメージ説明](5348e6de06a7b75af26e85fbc3566cbb.jpeg)
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 > SMC_W)
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[SMC_W * SMC_H];
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
+ ![イメージ説明](86123b6b3b7750847d7ef208ad5639c9.jpeg)
96
+
97
+
63
98
  また、処理後の画像を確認すると斜めにゆがんでおり、問題が解決したわけでもないようです。
64
99
  このことから、どうも自分が考えているようなメモリの並びになっていないことは何となくわかったのですが、OpenCVに関する知識が不足しているため、どのようなメモリ構造で保持されているのかを理解することができませんでした。
65
100