2012-02-03 25 views
6

Tôi đã thấy nhiều mẫu mã để tải họa tiết cho OpenGL, nhiều trong số chúng có chút phức tạp để hiểu hoặc yêu cầu chức năng mới với nhiều mã.Đang tải kết cấu cho OpenGL với OpenCV

Tôi đã suy nghĩ rằng như OpenCV cho phép chúng tôi để tải bất kỳ định dạng hình ảnh nó có thể là một một cách hiệu quả đơn giản để tải textures để OpenGL, nhưng tôi đang thiếu cái gì. Tôi có đoạn mã này trong C++:

cv::Mat texture_cv; 
GLuint texture[1]; 
int Status=FALSE; 

if(texture_cv = imread("stones.jpg")) { 

     Status=TRUE;       // Set The Status To TRUE 
     glGenTextures(1, &texture[0]);     // Create The Texture 


     glBindTexture(GL_TEXTURE_2D, texture[0]);    
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S , GL_REPEAT); 
     glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

     glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data); 
} 

Và nó không được biên dịch vì lỗi này:

error C2451: conditional expression of type 'cv::Mat' is illegal

Bất kỳ lời đề nghị? Làm thế nào tôi nên làm việc chuyển đổi từ cv :: Mat để kết cấu OpenGL?

+0

Tôi nghĩ rằng việc sử dụng OpenCV để tải họa tiết là quá mức cần thiết. Có thư viện DevIL đã được thiết kế rõ ràng cho việc này. – datenwolf

+0

Tôi đang sử dụng OpenCV trong dự án của mình và tôi liên tục thay đổi từ dữ liệu opengl sang opencv, đó là lý do tại sao tôi có ý tưởng giảm thư viện. Cảm ơn anyway cho Devil, tôi sẽ xem xét nó. –

+0

FreeImage cũng là một lựa chọn khác (gần đây) thay thế cho DevIL =) – MiJyn

Trả lời

8

Lỗi của bạn xuất hiện ở đó, phải không?

if(texture_cv = imread("stones.jpg")) { 

bởi vì trong if(expr) expr phải bool hoặc có thể được đúc để bool. Nhưng không có cách nào để chuyển đổi cv::Mat thành boolean ngầm. Nhưng bạn có thể kiểm tra kết quả của imread như thế:

texture_cv = imread("stones.jpg"); 
if (texture_cv.empty()) { 
    // handle was an error 
} else { 
    // do right job 
} 

Xem: cv::Mat::empty(), cv::imread

Hy vọng rằng sẽ giúp bạn.

3

Toán tử gán

texture_cv = imread("stones.jpg") 

trả về một cv::Mat mà không thể được sử dụng trong một biểu thức điều kiện. Bạn nên viết một cái gì đó giống như

if((texture_cv = imread("stones.jpg")) != /* insert condition here */) { 
     //... 
} 

hoặc

texture = imread("stone.jpg"); 
if(!texture.empty()) { 
      //... 
} 
2

từ this doc, tôi đề nghị bạn thay đổi thử nghiệm của bạn:

texture_cv = imread("stones.jpg"); 
if (texture_cv.data != NULL) { 
    ... 
0

Một câu hỏi ngắn ... Tôi nghĩ rằng bạn có thể cần sử dụng

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.ptr()); 

thay vì

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.data); 
Các vấn đề liên quan