我正在製作一些自定義圖像處理應用程序。該程序將由控制檯中的簡單菜單驅動。用戶將輸入圖像的文件名,該圖像將在窗口中使用openGL顯示。當用戶選擇對圖像進行一些處理時,處理完成,openGL窗口應該重新繪製圖像。控制檯菜單更新OpenGL窗口
我的問題是我的圖像從來沒有繪製到窗口,而是窗口始終是黑色的。我認爲這可能與我在程序中組織線程的方式有關。主執行線程處理菜單輸入/輸出和圖像處理,並調用Display方法,而第二個線程運行openGL主循環。
這裏是我的主要代碼:
#include <iostream>
#include <GL/glut.h>
#include "ImageProcessor.h"
#include "BitmapImage.h"
using namespace std;
DWORD WINAPI openglThread(LPVOID param);
void InitGL();
void Reshape(GLint newWidth, GLint newHeight);
void Display(void);
BitmapImage* b;
ImageProcessor ip;
int main(int argc, char *argv[]) {
DWORD threadID;
b = new BitmapImage();
CreateThread(0, 0, openglThread, NULL, 0, &threadID);
while(true) {
char choice;
string path = "TestImages\\";
string filename;
cout << "Enter filename: ";
cin >> filename;
path += filename;
b = new BitmapImage(path);
Display();
cout << "1) Invert" << endl;
cout << "2) Line Thin" << endl;
cout << "Enter choice: ";
cin >> choice;
if(choice == '1') {
ip.InvertColour(*b);
}
else {
ip.LineThinning(*b);
}
Display();
}
return 0;
}
void InitGL() {
int argc = 1;
char* argv[1];
argv[0] = new char[20];
strcpy(argv[0], "main");
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowPosition(0, 0);
glutInitWindowSize(800, 600);
glutCreateWindow("ICIP Program - Character recognition using line thinning, Hilbert curve, and wavelet approximation");
glutDisplayFunc(Display);
glutReshapeFunc(Reshape);
glClearColor(0.0,0.0,0.0,1.0);
glEnable(GL_DEPTH_TEST);
}
void Reshape(GLint newWidth, GLint newHeight) {
/* Reset viewport and projection parameters */
glViewport(0, 0, newWidth, newHeight);
}
void Display(void) {
glClear (GL_COLOR_BUFFER_BIT); // Clear display window.
b->Draw();
glutSwapBuffers();
}
DWORD WINAPI openglThread(LPVOID param) {
InitGL();
glutMainLoop();
return 0;
}
這裏是我的BitmapImage抽獎方法:
void BitmapImage::Draw() {
cout << "Drawing" << endl;
if(_loaded) {
glBegin(GL_POINTS);
for(unsigned int i = 0; i < _height * _width; i++) {
glColor3f(_bitmap_image[i*3]/255.0, _bitmap_image[i*3+1]/255.0, _bitmap_image[i*3+2]/255.0);
// invert the y-axis while drawing
glVertex2i(i % _width, _height - (i/_width));
}
glEnd();
}
}
任何想法的問題?
編輯:問題在技術上通過從每500毫秒調用glutPostRedisplay()的openglThread啓動glutTimer來解決。現在可以,但我更喜歡一種解決方案,在每次更改位圖時只需重新顯示(以節省處理時間),另一種解決方案不需要運行另一個線程(定時器是另一個線程我假設)。這主要是因爲主要的處理線程將進行大量的密集工作,我想將大部分資源投入到這個線程中,而不是其他任何東西。
投票關閉,爲什麼不是這段代碼工作。 – 2016-05-01 09:25:04