質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2554閲覧

unsigned char*型を返す画像ロード関数を作りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/01/08 08:07

提示コードですがどうすれば画像データを読み込んでそのデータをunsigned char*型で返せるのでしょうか?提示コードは正常に読み込まれておらすglTexImage2D();関数で例外エラーが出てしまいます。どうすればいいのでしょうか?この関数になりが足りていないのでしょうか?

cpp

1//画像ファイルのバイナリを返す。 widht ,height は大きさで必要ない場合は指定しない。 2byte* Game::LoadTexture(const char* str,int *width, int *height) 3{ 4 cv::Mat image; 5 image = cv::imread(str); 6 7 if (image.empty() == true) 8 { 9 printf("image.empty()\n"); 10 return nullptr; 11 } 12 else { 13 printf("load \n"); 14 cv::cvtColor(image, image, cv::COLOR_RGB2BGR); //色空間を変更 15 16 17 int size = image.rows * image.cols; 18 byte* bytes = new byte[size]{ 0 }; 19 std::memcpy(bytes, image.data, size * sizeof(byte)); 20 21 // 画像サイズを取得 22 if (width != nullptr) 23 { 24 *width = image.cols; // 横 25 printf("widht: %d\n",*width); 26 } 27 28 if (height != nullptr) 29 { 30 *height = image.rows; // 縦 31 printf("height: %d\n", *height); 32 33 } 34 35 return bytes; // unsigned char*を返す 36 } 37} 38

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

何が足りないか?と言えば,

int size = image.rows * image.cols;

このサイズが全然足りないんじゃないですかね.
(1画素の情報に何byte必要なのか,という視点が抜けている)

あと,glTexImage2Dに食わせるのならばその際にフォーマットを指定すれば良いだろうからcvtColorとかしなくても良いのではないかと思う.

投稿2021/01/08 08:33

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/01/08 08:48 編集

int size = image.rows * image.cols * (int)sizeof(byte); としましたが例外が発生します。 またglTexImage2D();関数を glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)data); としましが例外が発生します。GL_RGBに変更してみましたがだめでした。
fana

2021/01/08 09:19

> int size = image.rows * image.cols * (int)sizeof(byte); 何を意図した変更なんですか? sizeof(byte) の値が1であれば,何も変わらないですよねコレ. cv::Mat における1画素の情報が {R,G,B}の3chであって且つそれぞれが8bitなのであれば,1画素のデータサイズは8*3=24bit なわけ. だから,画素値をコピーするには最低でも (画素数*3)[byte] のバッファが必要でしょ,って話.
退会済みユーザー

退会済みユーザー

2021/01/08 09:23

なるほど。nt size = image.rows * image.cols * 4; として治りました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問