🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
OpenCV

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

C++

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

Q&A

解決済

1回答

3733閲覧

opencv 色空間を取得したい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

C++

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

0グッド

0クリップ

投稿2021/01/09 08:57

提示コードの//コメント部内部でopencvの関数を使って色空間を取得してRGB とRGBAの時でglTexImage2Dの引数が変わるので色空間を取得したいのですがどうすればいいのでしょうか?調べましたが出てきません。

参考サイト: http://labs.eecs.tottori-u.ac.jp/sd/Member/oyamada/OpenCV/html/py_tutorials/py_imgproc/py_colorspaces/py_colorspaces.html

cpp

1 2class Game; 3/*################################################################################################################ 4* 画像 描画クラス 5################################################################################################################*/ 6 7//コンストラクタ 8Sprite::Sprite(Game* g, const char* FileName,glm::vec2 start,glm::vec2 size) : Transform_2D() 9{ 10 shader = new Shader(g,"Shader/2D/Sprite.vert", "Shader/2D/Sprite.frag"); 11 Owner = g;//Gameクラス 12 13 mSize.x = size.x - start.x; 14 mSize.y = size.y - start.y; 15 16 //テクスチャを設定 17 glGenTextures(1, &TextureID); 18 glBindTexture(GL_TEXTURE_2D, TextureID); 19 20 21 22 23 /* 24 int width, height; 25 int numComponents; 26 unsigned char* data = stbi_load(FileName, &width, &height, &numComponents, 4); 27 if (data != NULL) { 28 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); 29 } 30 else { 31 std::cerr << "Unable to load texture: " << FileName << std::endl; 32 } 33 */ 34 35 36 37 int width, height; 38 int numComponents; 39// unsigned char* data = stbi_load(FileName, &width, &height, &numComponents, 4); 40 unsigned char* data = Owner->LoadTexture(FileName,&width,&height); 41/////////////////////////////////////////////////////////////////////////////////////////////////////////// 42 if (data != NULL) 43 { 44 printf("いい\n"); 45 // glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (void*)data); 46 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 47 printf("ああ\n"); 48 49 } 50 else { 51 std::cerr << "Unable to load texture: " << FileName << std::endl; 52 } 53/////////////////////////////////////////////////////////////////////////////////////////////////////////// 54 55 56 57 58 59 60 61 62 float uvWidth = 1.0f / (float)width; 63 float uvHeight = 1.0f / (float)height; 64 65 vertex[0] = attribute{ -(float)(size.x ) / 2.0f , (float)(size.y) / 2.0f , uvWidth * start.x, uvHeight * start.y}; 66 vertex[1] = attribute{ -(float)(size.x ) / 2.0f , -(float)(size.y) / 2.0f , uvWidth * start.x, (uvHeight * start.y) + (uvHeight * size.y)}; 67 vertex[2] = attribute{ (float)(size.x ) / 2.0f, -(float)(size.y) / 2.0f , (uvWidth * start.x) + (uvWidth * size.x),(uvHeight * start.y) + (uvHeight * size.y) }; 68 vertex[3] = attribute{ (float)(size.x ) / 2.0f , (float)(size.y) / 2.0f , (uvWidth * start.x) + (uvWidth * size.x), uvHeight * start.y }; 69 70 //VAO 71 glGenVertexArrays(1, &VAO); 72 glBindVertexArray(VAO); 73 74 //VBO 75 glGenBuffers(1, &VBO); 76 glBindBuffer(GL_ARRAY_BUFFER, VBO); 77 glBufferData(GL_ARRAY_BUFFER, (sizeof(vertex) / sizeof(vertex[0])) * sizeof(attribute), vertex, GL_STATIC_DRAW); 78 79 //頂点座標 80 glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(attribute), NULL); 81 glEnableVertexAttribArray(0); 82 83 //UV座標 84 glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(attribute), (void*)(sizeof(float) * 2)); 85 glEnableVertexAttribArray(1); 86 87 //IBO 88 glGenBuffers(1, &IBO); 89 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IBO); 90 glBufferData(GL_ELEMENT_ARRAY_BUFFER, (sizeof(index) / sizeof(index[0])) * sizeof(unsigned int), index, GL_STATIC_DRAW); 91 92 //ミニマップを設定 93 glGenerateMipmap(GL_TEXTURE_2D); 94 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 95 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 96 97 //異方性フィルタリングを設定 98 GLfloat largest; 99 glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &largest); 100 101 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, largest); 102 103 stbi_image_free(data); 104} 105

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

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

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

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

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

episteme

2021/01/09 09:51

> 色空間を取得したい BGR から HSV に変換したいんですか?
退会済みユーザー

退会済みユーザー

2021/01/09 09:58

いや。色空間の名前?RGBとかRGBAとかっていうのを取得したいです。
episteme

2021/01/09 10:06

つまりチャネル数がわかればいいですか?
退会済みユーザー

退会済みユーザー

2021/01/09 10:34

数なのですか?種類を特定したいのですがw
episteme

2021/01/09 11:32

いや、チャネル数は RGBなら3、RGBAなら4だろうから。
退会済みユーザー

退会済みユーザー

2021/01/09 11:33

なるほど、それはどうすればいいのでしょうか?
episteme

2021/01/09 13:23 編集

> それはどうすればいいのでしょうか? 「それ」とは何ですか? OpenCVのマニュアルを読んでください。 調べもせずに丸投げではいつまでも若葉マークが外れません。
guest

回答1

0

ベストアンサー

提示コードのようにimage.channels();関数を使ってチャンネル数を返すことにより取得出来ました。

cpp

1int getTextureChannel(const char* str) 2{ 3 cv::Mat image; 4 image = cv::imread(str); 5 6 if (image.empty() == true) 7 { 8 printf("image.empty()\n"); 9 return -1; 10 } 11 else { 12 printf("load \n"); 13 14 return image.channels(); 15 } 16} 17

投稿2021/01/10 01:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

episteme

2021/01/10 03:17

> image = cv::imread(str); これだと強制的に3チャネルになりますが、それでいいのかな。だったらRGB決め打ちでいいことになる。
episteme

2021/01/10 04:20

マニュアル通りじゃないですか? 明らかにRGB/RGBAな画像ファイルを食わせてみればいい。
退会済みユーザー

退会済みユーザー

2021/01/10 04:38 編集

文章が曖昧なので詳細にお願い出来ますか?ちゃんと考えてます。
fana

2021/01/10 04:42

チャンネル数と色空間はまぁ関係はあるけども色空間を特定する情報ではない. cv::Mat には「現在どの色空間での情報を持っているか」といったような情報自体が無い. データ値が何を示しているのか?というのを管理することはプログラマが管理すべき事柄.
退会済みユーザー

退会済みユーザー

2021/01/10 04:44

つまりどうすればいいのでしょうか?
fana

2021/01/10 04:52

> どうすればいい 仕様を自身で決める.それだけ. 例えば,3chのカラー画像を使うのなら,「用途に適切な画像ファイルを用意して,それを imread で8UC3として読む」とかいう話を決めてその通りに 実装/運用 すればよい. そのようにしている限りは「読み込み結果は常に 8bit 3ch なのであって,データフォーマットは BGR なのだ」ということは自明なのだから 「このMatのデータってのはどの色空間で表現しているのだろう?」とか考えねばならない事態そのものが生じないのだし,わざわざチャンネル数をどうにかして取得するとかいう行為の必要性は全く無いハズ.
退会済みユーザー

退会済みユーザー

2021/01/10 05:00

なるほど。じゃあ決まりごとを作る「RGBAで画像を作る」というルールを作ればいいだけでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問