Opencv 导入图片 Opengl 显示纹理(含用例代码)

本篇主要是讲使用Opencv导入一副图片,然后讲该副图片当成纹理显示在opengl当中。

  1. 首先说如何配置Opencv

我的硬件环境是: Windows10+Visual Studio 2015+opencv3.0

先在此网站下载opencv,下载之后,它是长这样的,点击它,会自动解压缩成名字为“opencv”的文件夹

接下来进行环境配置:从控制面板开始,按着这个路径  Control Panel\System and Security\System 来到高级系统设置(advanced system settings)就进入了如下界面:

在系统变量里面找到Path,然后在Value中添加OpenCV的目录:我的是:C:\Users\Dell\Downloads\opencv\build\x86\vc12\bin。(我的opencv直接保存在了downloads里面)

然后你新建一个VS2015的项目(新建项目方法我就不说了),然后点击:项目--->属性--->配置属性--->VC++目录----->包含目录

把下面这些目录添加进去:

C:\Users\Dell\Downloads\opencv\build\include

C:\Users\Dell\Downloads\opencv\build\include\opencv

C:\Users\Dell\Downloads\opencv\build\include\opencv2

最后大概长这样:

再在库目录中添加这些目录:

C:\Users\Dell\Downloads\opencv\build\x86\vc12\lib

C:\Users\Dell\Downloads\opencv\build\x86\vc12\staticlib

 注意:你可以发现我这里面用的是x86架构,其实opencv里面还给了x64架构。这主要取决于你的项目用的是什么架构,可以看这里来判断

最后一步:

点击链接器---> 输入---->附加依赖项中加入:

opencv_ts300.lib; opencv_world300.lib

至此 opencv就配置好了。你当然也要配置opengl,但是这里我就不说了。

2. 图片作为纹理在opengl中显示

先把要用的资源图片放在你VS项目中的目录中,与cpp文件一个目录下面。

请复制一下代码:

#include<gl/glut.h>
#include <opencv.hpp>
using namespace cv;

//OpenCV读取图像
Mat I = imread("ntulogo.bmp");
//设置长宽
int width = I.cols;
int height = I.rows;
//设置图像指针
GLubyte* pixels;

GLuint load_texture()
{
    //OpenGL纹理用整型数表示
    GLuint texture_ID;

    //获取图像指针
    int pixellength = width*height * 3;
    pixels = new GLubyte[pixellength];
    memcpy(pixels, I.data, pixellength * sizeof(char));
    imshow("OpenCV", I);

    //将texture_ID设置为2D纹理信息
    glGenTextures(1, &texture_ID);
    glBindTexture(GL_TEXTURE_2D, texture_ID);
    //纹理放大缩小使用线性插值
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    //纹理水平竖直方向外扩使用重复贴图
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    //纹理水平竖直方向外扩使用边缘像素贴图(与重复贴图二选一)
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

    //将图像内存用作纹理信息
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);

    free(pixels);
    return texture_ID;
}

void display()
{
    // 清除屏幕
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    //获取纹理对象
    GLuint image = load_texture();

    //重新设置OpenGL窗口:原点位置为左上角,x轴从左到右,y轴从上到下,坐标值与像素坐标值相同
    glViewport(0, 0, (GLsizei)width, (GLsizei)height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, width, height, 0);

    //显示纹理
    glEnable(GL_TEXTURE_2D);    //允许使用纹理
    glBindTexture(GL_TEXTURE_2D, image);    //选择纹理对象

                                            //原始完全填充四边形
    glBegin(GL_POLYGON);    //设置为多边形纹理贴图方式并开始贴图
    glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);    //纹理左上角对应窗口左上角
    glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);    //纹理左下角对应窗口左下角
    glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height);    //纹理右下角对应窗口右下角
    glTexCoord2f(1.0f, 0.0f); glVertex2f(width, 0);    //纹理右上角对应窗口右上角
    glEnd();    //结束贴图*/

                /*//三角形
                glBegin(GL_POLYGON);
                glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);
                glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);
                glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height);
                glEnd();*/

            /*    //多边形
                glBegin(GL_POLYGON);
                glTexCoord2f(0, 0); glVertex2f(0, 0);
                glTexCoord2f(0, 1); glVertex2f(0, height/3);
                glTexCoord2f(1, 1); glVertex2f(width/4, height/3);
                glTexCoord2f(1, 0); glVertex2f(width/4, 0);
                glTexCoord2f(0.0f, 0.5f); glVertex2f(0, height/2);
                glEnd();*/

                /*//任意变换
                glBegin(GL_POLYGON);
                glTexCoord2f(0.0f, 0.0f); glVertex2f(width/4, height/4);
                glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);
                glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height*2/3);
                glTexCoord2f(1.0f, 0.0f); glVertex2f(width*4/5, 50);
                glEnd();*/

                //边缘贴图效果
                /*glBegin(GL_POLYGON);
                glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);
                glTexCoord2f(0.0f, 2.0f); glVertex2f(0, height);
                glTexCoord2f(2.0f, 2.0f); glVertex2f(width, height);
                glTexCoord2f(2.0f, 0.0f); glVertex2f(width, 0);
                glEnd();*/

    glDisable(GL_TEXTURE_2D);    //禁止使用纹理

                                //双缓存交换缓存以显示图像
    glutSwapBuffers();
}

void main(int argc, char** argv)
{
    //初始化GL
    glutInit(&argc, argv);
    //设置显示参数(双缓存,RGB格式)
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    //设置窗口尺寸:width*height
    glutInitWindowSize(width, height);
    //设置窗口位置:在屏幕左上角像素值(100,100)处
    glutInitWindowPosition(100, 100);
    //设置窗口名称
    glutCreateWindow("OpenGL");
    //显示函数,display事件需要自行编写
    glutDisplayFunc(display);

    //重复循环GLUT事件
    glutMainLoop();
}

最后你会看到这个结果:

还有不懂之处,请参考一下参考网站

reference:

1. https://zhuanlan.zhihu.com/p/24714986?refer=ry000

2. http://blog.csdn.net/lanergaming/article/details/48689841

3. https://learnopengl-cn.readthedocs.io/zh/latest/01%20Getting%20started/06%20Textures/

时间: 2024-10-20 08:43:23

Opencv 导入图片 Opengl 显示纹理(含用例代码)的相关文章

extjs中新建窗体时,给窗体添加背景图片不显示问题之一

1.在extjs中新建窗体时,给窗体添加背景图片不显示,例如下面的代码. 不显示的原因:因为设置了  layout: 'fit', Ext.create('Ext.Window', { title: '客户关系管理系统', width: 1024, height: 600, //plain: true, bodyStyle: 'background:url(images/登录背景.jpg);', headerPosition: 'top', layout: 'fit', items: { bor

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

使用OpenCV读取图片代码如下 img = imread(m_fileName); if (img.empty()) { fprintf(stderr, "Can not load image %s\n", m_fileName); return -1; } //设置长宽 int width = img.cols; int height = img.rows; int channel = img.channels(); printf(" depth %d\n",

OPENGL 显示BMP图片+旋转

VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取,再用它来生成纹理,首先用auxDIBImageLoad函数将图片数据读到AUX_RGBImageRec结构体当中. 然后 //生成纹理数据 glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->siz

使用freemaker 导出word 含多张图片,若无图片则显示文本信息

1.使用的Microsoft Office 2007,添加一个无边框的表格,并插入一张图片,最后另存为编码utf-8,一开始保存的word xml格式的,图片的base64编码位于文档最后,暂时没有找到解决方法,所以就保存. 2.用编辑工具打开,找到base64编码替换为ftl标签,红色所示,图片设置长宽(蓝色所示) <w:p wsp:rsidR="00A50283" wsp:rsidRDefault="00A50283" wsp:rsidP="00

用 Python 和 OpenCV 检测图片上的条形码

  用 Python 和 OpenCV 检测图片上的的条形码 这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现.我所实现的算法本质上基于StackOverflow 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进. 首先需要留意的是,这个算法并不是对所有条形码有效,但会给你基本的关于应用什么类型的技术的直觉. 假设我们要检测下图中的条形码: 图1:包含条形码的示例图片 现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编

iOS开发- 文件共享(利用iTunes导入文件, 并且显示已有文件)

今天要实现一个功能, 通过iTunes导入文件到应用中, 并且在应用中对这个文件进行编辑. 类似我们平时经常使用的 PDF阅读器那样的东西, 我们可以自己导入我们的电子书. 源码下载:https://github.com/colin1994/iTunesTest.git 下面具体介绍下实现过程. 先看效果图. 图1. 未实现功能前, iTunes截图 图2. 实现功能后, iTunes截图 图3. 实现功能后, 运行截图. 好了, 通过图片, 我们可以看到实现的效果. 功能包括: 允许通过iTu

OpenGL显示列表

OpenGL显示列表(Display List)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就依次执行表中所列出的函数语句.前面内容所举出的例子都是瞬时给出函数命令,则OpenGL瞬时执行相应的命令,这种绘图方式叫做立即或瞬时方式(immediate mode).本章将详细地讲述显示列表的基本概论.创建.执行.管理以及多级显示列表的应用等内容. 16.1.显示列表概论     16.1.1 显示列表的优势 OpenGL显示列表的设计能优化程序运行性能,尤其

Eclipse下导出java程序可执行的jar包图片无法显示问题的一种解决方法

说明:在eclipse中运行java程序的时候一切正常,可是当把jar包导出的时候却发现图片没法显示,这估计是java程序的各种配置和路径问题所导致,后来找到一种解决方法,供遇到这方面问题的学习java程序的鞋同参考: Java项目下的目录结构如下: 其中class类放在包:package accpedu; (即实际是在如上bin/accpedu文件夹下面) 通过下面的方法来引用图片时,在eclipse里面执行是可以正常显示图片的: ImageIcon image1 = new ImageIco

游戏内图片-文件格式与纹理格式

有一篇好文章,链接门:Unity3D手游开发实践<腾讯桌球>客户端开发经验总结 文章里提到了游戏内图片-文件格式与纹理格式 我才第一次恍然知道了,文件格式和纹理格式原来是酱紫的关系.以前我是有多神经大条,处理了那么多图片竟然没有懂细想它们的关系…… 常用的图像文件格式有BMP,TGA,JPG,GIF,PNG等: 常用的纹理格式有R5G6B5,A4R4G4B4,A1R5G5B5,R8G8B8, A8R8G8B8等. 文件格式是图像为了存储信息而使用的对信息的特殊编码方式,它存储在磁盘中,或者内存