OpenCV

2012-02-03 13 views
6

के साथ ओपनजीएल के लिए बनावट बना रहा है मैंने ओपनजीएल के लिए बनावट लोड करने के लिए कई कोड नमूने देखे हैं, उनमें से कई बहुत सारे कोड के साथ नए कार्यों को समझने या आवश्यक करने के लिए थोड़ा जटिल हैं।OpenCV

मैं सोच रहा था कि OpenCV के रूप में हमें किसी भी छवि प्रारूप लोड करने के लिए यह ओपन को बनावट लोड करने के लिए एक सरल एक कारगर तरीका हो सकता है की अनुमति देता है, लेकिन मैं कुछ याद आ रही है। मैं 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); 
} 

और यह इस त्रुटि के कारण संकलन नहीं है:

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

कोई सुझाव? सीवी :: मैट से ओपनजीएल बनावट में रूपांतरण कैसे करना चाहिए?

+0

के बजाय मुझे लगता है कि लोड हो रहा है बनावट के लिए OpenCV का उपयोग कर overkill है। पुस्तकालय देविल है जिसे इसके लिए स्पष्ट रूप से डिजाइन किया गया है। – datenwolf

+0

मैं अपने प्रोजेक्ट में ओपनसीवी का उपयोग कर रहा हूं और मैं लगातार ओपनजी से ओपनसीवी डेटा में बदल रहा हूं, यही कारण है कि मुझे पुस्तकालयों को कम करने का विचार मिला। देविल के लिए वैसे भी धन्यवाद, मैं इसे देख लूंगा। –

+0

फ्री इमेज डेविल के लिए एक और (हालिया) विकल्प भी है =) – MiJyn

उत्तर

8

आपकी त्रुटि वहां दिखाई देती है, है ना?

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

क्योंकि if(expr) expr में bool होना चाहिए या bool लिए casted जा सकता है। लेकिन cv::Mat को बूलियन में रूपांतरित करने का कोई तरीका नहीं है। लेकिन तुम imread उस तरह का परिणाम देख सकते हैं:

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

देखें: cv::Mat::empty(), cv::imread

आशा है कि आप में मदद की।

3

असाइनमेंट ऑपरेटर

texture_cv = imread("stones.jpg") 

एक cv::Mat कि एक सशर्त अभिव्यक्ति में नहीं किया जा सकता देता है। आप this दस्तावेज़ से

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

या

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

की तरह कुछ लिखना चाहिए, मैं सुझाव है कि आप अपने परीक्षण को बदलने के लिए:

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

एक और छोटा सा सवाल ... मुझे लगता है कि आप कर सकते हैं

glTexImage2D(GL_TEXTURE_2D, 0, 3, texture_cv.cols, texture_cv.rows, 0, GL_RGB, GL_UNSIGNED_BYTE, texture_cv.ptr()); 
का उपयोग करने की आवश्यकता है

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