日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

OpenGL——OpenCV与SOIL读取图片进行纹理贴图

發(fā)布時間:2023/12/13 综合教程 26 生活家
生活随笔 收集整理的這篇文章主要介紹了 OpenGL——OpenCV与SOIL读取图片进行纹理贴图 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用OpenCV讀取圖片代碼如下

  /*傳入的參數(shù)
  std::string m_fileName;
  GLenum m_textureTarget = GL_TEXTURE_2D;
  GLuint m_textureObj;
  */
  Mat img = imread(m_fileName);

    if (img.empty())
    {
        fprintf(stderr, "Can not load image %s
", m_fileName);
        return -1;
    }
    //設置長寬
    int width = img.cols;
    int height = img.rows;
    int channel = img.channels();
    printf(" depth  %d
", channel);

    //獲取圖像指針
    int pixellength = width * height * channel;
    GLubyte* pixels = new GLubyte[pixellength];
    memcpy(pixels, img.data, pixellength * sizeof(char));
    //imshow("OpenCV", img);
    

    glGenTextures(1, &m_textureObj);
    glBindTexture(m_textureTarget, m_textureObj);
    //必須一個RGB  一個BGR(opencv的mat類的顏色通道是BGR) 否則會出現(xiàn)顏色偏差
    glTexImage2D(m_textureTarget, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, pixels);
    //紋理放大縮小使用線性插值
    glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);    
    glBindTexture(m_textureTarget, 0);
    free(pixels);

運行程序時,出現(xiàn)了兩個問題:

紋理貼圖是黑白的——解決方案:讀取的圖片的高和寬的大小改為2的倍數(shù)即可
貼圖顏色出現(xiàn)偏差——解決方案:(原因見上)

glTexImage2D(m_textureTarget, 0, GL_RGB, width, height, 0, GL_BGR, GL_UNSIGNED_BYTE, pixels);

使用SOIL讀取圖片代碼如下

    int picWidth, picHeight;
    int channel = 0;

    unsigned char* imageData = SOIL_load_image(m_fileName.c_str(), &picWidth, &picHeight, &channel, SOIL_LOAD_RGB);

    if (imageData == NULL)
    {
        fprintf(stderr, "Can not load image ");
        std::cout << m_fileName << "
";
        return false;
    }
    
    //產(chǎn)生指定數(shù)量的紋理對象,并將他們的引用句柄放到GLuint數(shù)組指針中
    glGenTextures(1, &m_textureObj);
   //告訴OpenGL后面所有和紋理相關(guān)調(diào)用中所引用的是該次綁定的紋理對象,直到新的對象被綁定
    glBindTexture(m_textureTarget, m_textureObj);
    glTexImage2D(m_textureTarget, 0, GL_RGB, picWidth, picHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, imageData);
    //紋理放大縮小使用線性插值
    glTexParameterf(m_textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(m_textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);    
    glBindTexture(m_textureTarget, 0);
    SOIL_free_image_data(imageData);

總結(jié)

以上是生活随笔為你收集整理的OpenGL——OpenCV与SOIL读取图片进行纹理贴图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。