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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。