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

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

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

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

Q&A

解決済

1回答

5637閲覧

OpenCVでjpg画像を読み込んでOpenGLで画面出力

syokoyama55

総合スコア10

OpenCV

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

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

0グッド

0クリップ

投稿2018/11/16 11:16

OpenCVでjpg画像を読み込みOpenGLで画面出力

現在、OpenCVでjpg画像を読み込んで、その画像をOpenGLで画面出力するプログラムを作っています
そのために、以下の1~3ような処理をおこなっています。
1.OpenCVでカメラ映像を取得
2.OpenGLでカメラ映像からテクスチャを作成
3.OpenGLでPC画面上にテクスチャを出力

サイトや書籍を参考にプログラムを作成していますがウィンドウが真っ黒な状態で画像が出力されません。OpenCVによるjpg画像の読み込みはできたのでテクスチャの作成に失敗していると考えていますが、どのように修正すべきでしょうか分かっていません

よろしくお願いします

補足情報(FW/ツールのバージョンなど)

ライブラリはNuGetを利用してインストールしました

  • Visual Stduio 2013
  • GLEW 1.9.0.1
  • GLFW 3.2.1.5
  • OpenCV 2.4.11

プログラムコード

C++

1#include<opencv2\opencv.hpp> 2#include<GL\glew.h> 3#include<GLFW\glfw3.h> 4#include<Windows.h> 5 6GLuint g_texID; 7int textureWidth, textureHeight; 8int windowWidth = 640, windowHeight = 480; 9GLFWwindow* window; 10cv::Mat image; 11 12void setupTexture(GLuint texID, const char *file, const int width, int height); 13void render(); 14 15int main(void) 16{ 17 if (!glfwInit()) 18 { 19 std::cout << "Failed to initialize glfw" << std::endl; 20 return -1; 21 } 22 23 window = glfwCreateWindow(windowWidth, windowHeight, "window", NULL, NULL); 24 if (!window) 25 { 26 std::cout << "Failed to create the window" << std::endl; 27 return -1; 28 } 29 30 glfwSwapInterval(1); 31 32 glMatrixMode(GL_PROJECTION); 33 glLoadIdentity(); 34 glOrtho(0.0f, windowWidth, 0.0f, windowHeight, -1.0f, 1.0f); 35 36 glGenTextures(1, &g_texID); 37 setupTexture(g_texID, 256, 256); 38 39 while (1) { 40 41 // 画面の初期化 42 glClearColor(0.5f, 0.5f, 0.5f, 0.0f); 43 glClear(GL_COLOR_BUFFER_BIT); 44 45 render(); 46 47 // バッファの入れ替え 48 glfwSwapBuffers(window); 49 } 50 51 glfwTerminate(); 52 53 return 0; 54} 55 56void setupTexture(GLuint texID, const int width, int height) 57{ 58 image = cv::imread("Picture.jpg"); 59 60 if (image.empty()){ 61 std::cout << "No Image" << std::endl; 62 } 63 else{ 64 cv::flip(image, image, 0); 65 66 //cv::imshow("window", image); 67 //cv::waitKey(0); //引数:ms //キー入力の待機 68 //cv::destroyAllWindows(); //ウィンドウの破棄 69 } 70 71 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 72 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 73 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 74 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 75 76 glBindTexture(GL_TEXTURE_2D, texID); 77 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.cols, image.rows, 0, GL_BGR, GL_UNSIGNED_BYTE, image.data); 78} 79 80void render() 81{ 82 static const GLfloat vtx[] = { 83 200, 120, 84 440, 120, 85 440, 360, 86 200, 360, 87 }; 88 glVertexPointer(2, GL_FLOAT, 0, vtx); 89 90 // テクスチャの領域指定 91 static const GLfloat texuv[] = { 92 0.0f, 1.0f, 93 1.0f, 1.0f, 94 1.0f, 0.0f, 95 0.0f, 0.0f, 96 }; 97 glTexCoordPointer(2, GL_FLOAT, 0, texuv); 98 99 // テクスチャの画像指定 100 glBindTexture(GL_TEXTURE_2D, g_texID); 101 102 // テクスチャの描画 103 glEnable(GL_TEXTURE_2D); 104 glEnableClientState(GL_VERTEX_ARRAY); 105 glEnableClientState(GL_TEXTURE_COORD_ARRAY); 106 glDrawArrays(GL_QUADS, 0, 4); 107 glDisableClientState(GL_TEXTURE_COORD_ARRAY); 108 glDisableClientState(GL_VERTEX_ARRAY); 109 glDisable(GL_TEXTURE_2D); 110} 111

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

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

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

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

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

guest

回答1

0

自己解決

別の方の質問の回答をよく確認していませんでした

画面が真っ黒な状態は、GLFWを使って処理をおこなう前にglfwMakeContextCurrent関数で対象のウィンドウを指定することで解決しました。今回はglfwSwapInterval(1);の前です

投稿2018/11/17 08:48

編集2018/11/23 06:03
syokoyama55

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問