#include "BmpLoader.h"
#include "openglglut.h"
#include "stdio.h"
/**
** 纹理映射的学习
** 将一张bmp格式的图片以纹理贴图的方式,贴在正方体的6个面
*/
GLfloat xRot=0; /** 正方体绕x轴旋转角度*/
GLfloat yRot=0; /** 正方体绕y轴旋转角度*/
GLfloat zRot=0; /** 正方体绕z轴旋转角度*/
static GLuint texnum; /** 定义存储纹理*/
static GLuint texnum2; /** 再定义一个存储纹理*/
static GLuint texnum3;
static GLuint texnum4;
static GLuint texnum5;
BYTE* imgGray;
//函数声明
BOOL Convet2Gray(CONST BYTE* img,BYTE* imgGray,int heigh,int width);
BOOL Convet2Gray8(CONST BYTE* img,BYTE* imgGray,int heigh,int width);
BOOL Soble(CONST BYTE* img,BYTE* img2,int heigh,int width);
BOOL Convet2Gray24(CONST BYTE* imgsoble,BYTE* img,int heigh,int width);
BOOL Laplacian(CONST BYTE* img,BYTE* img2,int heigh,int width);
BOOL Roberts(CONST BYTE* img,BYTE* img2,int heigh,int width);
bool LoadBmpTexture(const char* filename,GLuint& texid,GLuint& texid2,GLuint& texid3,GLuint& texid4,GLuint& texid5)
{
BmpLoader bmp;
if(!bmp.loadBitmap((char*)filename))
{
printf("loadBitmap error\n");
return false;
}
glPixelStorei(GL_UNPACK_ALIGNMENT,4); /** ? */
glGenTextures(1,&texid); /** 创建一个纹理*/
glBindTexture(GL_TEXTURE_2D,texid); /** 为它指定一个纹理*/
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); /** 线性滤波 */
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); /** 线性滤波 */
/**
* glTexImage2D的参数比较复杂,
使用 GL_BGR_EXT的原因是: winapi里 bmp存储的格式是BGR 与opengl中RBG 需要做个转换
*/
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,bmp.bitInfo->biWidth,bmp.bitInfo->biHeight
,0,GL_RGB,GL_UNSIGNED_BYTE,bmp.image); /** 生成纹理*/
//DeleteObject(bBmp); /** 删除对象,释放内存*/
//定义的第二个纹理
BYTE* bmpGray;
BYTE* bmpGraysoble;
BYTE* bmpGraysoble2;
BYTE* bmpGray2;
BYTE* bmpGraylaplacian;
BYTE* bmpGray3;
BYTE* bmpGray4;
BYTE* bmpGrayroberts;
bmpGray= new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth*3];
bmpGray2= new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth*3];
bmpGray3= new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth*3];
bmpGray4= new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth*3];
bmpGraysoble= new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth];
bmpGraysoble2=new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth];
bmpGraylaplacian=new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth];
bmpGrayroberts=new BYTE[bmp.bitInfo->biHeight*bmp.bitInfo->biWidth];
Convet2Gray(bmp.image,bmpGray,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Convet2Gray8(bmpGray,bmpGraysoble,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Soble(bmpGraysoble,bmpGraysoble2,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Laplacian(bmpGraysoble,bmpGraylaplacian,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Roberts(bmpGraysoble,bmpGrayroberts,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Convet2Gray24(bmpGraysoble2,bmpGray2,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Convet2Gray24(bmpGraylaplacian,bmpGray3,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
Convet2Gray24(bmpGrayroberts,bmpGray4,bmp.bitInfo->biHeight,bmp.bitInfo->biWidth);
delete []bmpGraysoble2;
delete []bmpGraysoble;
delete []bmpGraylaplacian;
delete []bmpGrayroberts;
glGenTextures(1,&texid2); /** 创建一个纹理*/
glBindTexture(GL_TEXTURE_2D,texid2); /** 为它指定一个纹理*/
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); /** 线性滤波 */
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); /** 线性滤波 */
/**
* glTexImage2D的参数比较复杂,
使用 GL_BGR_EXT的原因是: winapi里 bmp存储的格式是BGR 与opengl中RBG 需要做个转换
*/
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,bmp.bitInfo->biWidth,bmp.bitInfo->biHeight
,0,GL_RGB,GL_UNSIGNED_BYTE,bmpGray);
glGenTextures(1,&texid3); /** 创建一个纹理*/
glBindTexture(GL_TEXTURE_2D,texid3); /** 为它指定一个纹理*/
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); /** 线性滤波 */
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); /** 线性滤波 */
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,bmp.bitInfo->biWidth,bmp.bitInfo->biHeight
,0,GL_RGB,GL_UNSIGNED_BYTE,bmpGray2);
glGenTextures(1,&texid4); /** 创建一个纹理*/
glBindTexture(GL_TEXTURE_2D,texid4); /** 为它指定一个纹理*/
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); /** 线性滤波 */
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); /** 线性滤波 */
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,bmp.bitInfo->biWidth,bmp.bitInfo->biHeight
,0,GL_RGB,GL_UNSIGNED_BYTE,bmpGray3);
glGenTextures(1,&texid5); /** 创建一个纹理*/
glBindTexture(GL_TEXTURE_2D,texid5); /** 为它指定一个纹理*/
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); /** 线性滤波 */
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); /** 线性滤波 */
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,bmp.bitInfo->biWidth,bmp.bitInfo->biHeight
,0,GL_RGB,GL_UNSIGNED_BYTE,bmpGray4);
return true;
}
//转化为灰度图像
BOOL Convet2Gray(CONST BYTE* img,BYTE* imgGray,int heigh,int width)
{
int j;
for (j=0;j<heigh*width*3;j=j+3)
{
*(imgGray+j+0)=(BYTE)*(img+j+0)*0.299+*(img+j+1)*0.589+*(img+j+2)*0.114;
*(imgGray+j+1)=*(imgGray+j+0);
*(imgGray+j+2)=*(imgGray+j+0);
}
return TRUE;
}
//转化为8位灰度图像
BOOL Convet2Gray8(CONST BYTE* img,BYTE* imgGray,int heigh,int width)
{
int j;
for (j=0;j<heigh*width*3;j=j+3)
{
*(imgGray+j/3)=*(img+j);
}
return TRUE;
}
//实现soble
BOOL Soble(CONST BYTE* img,BYTE* img2,int heigh,int width)
{
int i,j;
float temp;
for(i=1;i<(heigh-1);i++)
{
for(j=1;j<(width-1);j++)
{
temp=(*(img+(i-1)*width+j+1))+2*(*(img+i*width+j+1))+(*(img+(i+1)*width+j+1))
-(*(img+(i-1)*width+j-1))-2*(*(img+i*width+j-1))-(*(img+(i+1)*width+j-1));
temp=abs(temp);
temp=temp+(*(img+(i-1)*width+j-1))+2*(*(img+(i-1)*width+j))+(*(img+(i-1)*width+j+1))
-(*(img+(i+1)*width+j-1))-2*(*(img+(i+1)*width+j))-(*(img+(i+1)*width+j+1));
temp=abs(temp);
*(img2+i*width+j)=(BYTE)temp;
}
}
return TRUE;
}
//实现laplacian
BOOL Laplacian(CONST BYTE* img,BYTE* img2,int heigh,int width)
{
int i,j;
float temp;
for(i=1;i<(heigh-1);i++)
{
for(j=1;j<(width-1);j++)
{
temp=(8*(*(img+i*width+j)))-(*(img+(i-1)*width+j-1))
-(*(img+(i-1)*width+j))-(*(img+(i-1)*width+j+1))
-(*(img+i*width+j-1))-(*(img+i*width+j+1))
-(*(img+(i+1)*width+j-1))-(*(img+(i+1)*width+j))-(*(img+(i+1)*width+j+1));
if (temp>255.0)
{
temp=255;
}
else if (temp<0.0)
{
temp=0;
}
*(img2+i*width+j)=(BYTE)temp;
}
}
return TRUE;
}
//实现Roberts
BOOL Roberts(CONST BYTE* img,BYTE* img2,int heigh,int width)
{
int i,j;
float temp;
for(i=1;i<(heigh-1);i++)
{
for(j=1;j<(width-1);j++)
{
temp=abs((*(img+i*width+j))-(*(img+(i+1)*width+j+1)));
temp+=abs((*(img+(i+1)*width+j))-(*(img+i*width+j+1)));
*(img2+i*width+j)=(BYTE)temp;
}
}
return TRUE;
}
BOOL Convet2Gray24(CONST BYTE* imgsoble,BYTE* img,int heigh,int width)
{
int j;
for (j=0;j<heigh*width*3;j=j+3)
{
*(img+j+0)=*(imgsoble+j/3);
*(img+j+1)=*(imgsoble+j/3);
*(img+j+2)=*(imgsoble+j/3);
}
return TRUE;
}
int main(int argc,char** argv)
{
createWindow("homework Of CV",&argc,argv); /** 初始化并创建窗口*/
glutDisplayFunc(glutDisplay); /** 注册重绘函数*/
glutIdleFunc(glutIdle); /** 注册空闲回调函数*/
glutReshapeFunc(glutResize); /** 注册窗口调整函数*/
glutSpecialFunc(glutSpecial); /** 注册特殊按键窗口*/
glutKeyboardFunc(glutKeyboar
wcxwy1989
- 粉丝: 0
- 资源: 5
最新资源
- 【创新无忧】基于龙格库塔优化算法RUN优化广义神经网络GRNN实现数据回归预测附matlab代码.rar
- 【创新无忧】基于龙格库塔优化算法RUN优化广义神经网络GRNN实现光伏预测附matlab代码.rar
- 【创新无忧】基于龙格库塔优化算法RUN优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于龙格库塔优化算法RUN优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于龙格库塔优化算法RUN优化极限学习机KELM实现故障诊断附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化广义神经网络GRNN实现电机故障诊断附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化广义神经网络GRNN实现光伏预测附matlab代码.rar
- 【创新无忧】基于龙格库塔优化算法RUN优化相关向量机RVM实现数据多输入单输出回归预测附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化极限学习机KELM实现故障诊断附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化广义神经网络GRNN实现数据回归预测附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化相关向量机RVM实现北半球光伏数据预测附matlab代码.rar
- 【创新无忧】基于能量谷优化算法EVO优化广义神经网络GRNN实现电机故障诊断附matlab代码.rar
- 【创新无忧】基于麻雀搜索优化算法SSA优化相关向量机RVM实现数据多输入单输出回归预测附matlab代码.rar
- 【创新无忧】基于能量谷优化算法EVO优化极限学习机ELM实现乳腺肿瘤诊断附matlab代码.rar
- 【创新无忧】基于能量谷优化算法EVO优化广义神经网络GRNN实现光伏预测附matlab代码.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
前往页