#include "qtshowvideo.h"
#include <QtGui/QApplication>
#include <QtGui/QMainWindow>
#include <QtGui/QWidget>
#include <QtGui/QImage.h>
#include <QtGui/qevent.h>
GLfloat lightAmbient[4] = { 0.5, 0.5, 0.5, 1.0 };
GLfloat lightDiffuse[4] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat lightPosition[4] = { 0.0, 0.0, 2.0, 1.0 };
QImage * IplImageToQImageRGB(const IplImage * iplImage)
{
int width = iplImage->width;
int widthStep = iplImage->widthStep;
int height = iplImage->height;
uchar *qImageBuffer = (uchar *) malloc(width*height*4*sizeof(uchar));
uchar *QImagePtr = qImageBuffer;
const uchar *iplImagePtr = (const uchar *) iplImage->imageData;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
QImagePtr[0] = iplImagePtr[0];
QImagePtr[1] = iplImagePtr[1];
QImagePtr[2] = iplImagePtr[2];
QImagePtr[3] = 0;
QImagePtr += 4;
iplImagePtr += 3;
}
iplImagePtr += widthStep-3*width;
}
QImage *qImage = new QImage(qImageBuffer, width, height, QImage::Format_RGB32);
return qImage;
}
QtShowVideo::QtShowVideo( QWidget* parent, const char* name, bool fs )
: QGLWidget( parent/*, name */)
{
xRot = yRot = zRot = 0.0;
zoom = -5.0;
xSpeed = ySpeed = 0.0;
filter = 0;
light = false;
fullscreen = fs;
setGeometry( 100, 100, 640, 480 );
if ( fullscreen )
showFullScreen();
}
QtShowVideo::~QtShowVideo()
{
cvReleaseCapture(&pCapture);
}
void QtShowVideo::paintGL()
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glLoadIdentity();
glTranslatef( 0.0, 0.0, zoom );
glRotatef( xRot, 1.0, 0.0, 0.0 );
glRotatef( yRot, 0.0, 1.0, 0.0 );
//glBindTexture( GL_TEXTURE_2D, texture[filter] );
glBindTexture( GL_TEXTURE_2D, texName );
QImage tex, *buf;
IplImage* pFrame = cvQueryFrame(pCapture);
if (!pFrame)
{
return;
}
buf = IplImageToQImageRGB(pFrame);
tex = convertToGLFormat(*buf);
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
glBegin( GL_QUADS );
glNormal3f( 0.0, 0.0, 1.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );
glNormal3f( 0.0, 0.0, -1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 );
glNormal3f( 0.0, 1.0, 0.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, 1.0, 1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, 1.0, 1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );
glNormal3f( 0.0, -1.0, 0.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, -1.0, -1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, -1.0, -1.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );
glNormal3f( 1.0, 0.0, 0.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, -1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, -1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );
glNormal3f( -1.0, 0.0, 0.0 );
glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, -1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, -1.0 );
glEnd();
/*xRot += xSpeed;
yRot += ySpeed; */
}
void QtShowVideo::initializeGL()
{
pCapture = cvCreateCameraCapture(-1);
loadGLTextures();
glEnable( GL_TEXTURE_2D );
glShadeModel( GL_SMOOTH );
glClearColor( 0.0, 0.0, 0.0, 0.5 );
glClearDepth( 1.0 );
glEnable( GL_DEPTH_TEST );
glDepthFunc( GL_LEQUAL );
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
glLightfv( GL_LIGHT1, GL_AMBIENT, lightAmbient );
glLightfv( GL_LIGHT1, GL_DIFFUSE, lightDiffuse );
glLightfv( GL_LIGHT1, GL_POSITION, lightPosition );
glEnable( GL_LIGHT1 );
//新建一个QTimer对象
timer = new QTimer();
//设置定时器每个多少毫秒发送一个timeout()信号
timer->setInterval(30);
//启动定时器
timer->start();
//信号和槽
connect(timer, SIGNAL(timeout()), this, SLOT(onTimerOut()));
}
void QtShowVideo::onTimerOut()
{
updateGL();
}
void QtShowVideo::resizeGL( int width, int height )
{
if ( height == 0 )
{
height = 1;
}
glViewport( 0, 0, (GLint)width, (GLint)height );
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
gluPerspective( 45.0, (GLfloat)width/(GLfloat)height, 0.1, 100.0 );
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
}
void QtShowVideo::keyPressEvent( QKeyEvent *e )
{
switch ( e->key() )
{
case Qt::Key_L:
light = !light;
if ( !light )
{
glDisable( GL_LIGHTING );
}
else
{
glEnable( GL_LIGHTING );
}
updateGL();
break;
case Qt::Key_F:
filter += 1;;
if ( filter > 2 )
{
filter = 0;
}
updateGL();
break;
case Qt::Key_PageUp:
zoom -= 0.2;
updateGL();
break;
case Qt::Key_PageDown:
zoom += 0.2;
updateGL();
break;
case Qt::Key_Up:
//xSpeed -= 0.01;
xRot -= 1;
updateGL();
break;
case Qt::Key_Down:
//xSpeed += 0.01;
xRot += 1;
updateGL();
break;
case Qt::Key_Right:
//ySpeed += 0.01;
yRot += 1;
updateGL();
break;
case Qt::Key_Left:
//ySpeed -= 0.01;
yRot -= 1;
updateGL();
break;
case Qt::Key_F2:
fullscreen = !fullscreen;
if ( fullscreen )
{
showFullScreen();
}
else
{
showNormal();
setGeometry( 100, 100, 640, 480 );
}
update();
break;
case Qt::Key_Escape:
close();
default:
updateGL();
}
}
void QtShowVideo::loadGLTextures()
{
QImage tex, *buf;
/*qWarning( "Could not read image file, using single-color instead." );
if ( !buf.load( "Nash.jpg" ) )
//if ( !buf.load( "bird.bmp" ) )
{
qWarning( "Could not read image file, using single-color instead." );
QImage dummy( 512, 512, / *32* /QImage::Format_Indexed8);
dummy.fill( Qt::green );
buf = dummy;
} */
IplImage* srcImg = cvLoadImage("Nash.jpg");
buf = IplImageToQImageRGB(srcImg);
tex = QGLWidget::convertToGLFormat( *buf );
glGenTextures(1,&texName);
glBindTexture( GL_TEXTURE_2D, texName );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
glGenTextures( 3, &texture[0] );
glBindTexture( GL_TEXTURE_2D, texture[0] );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
glBindTexture( GL_TEXTURE_2D, texture[1] );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexImage2D( GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex.bits() );
glBindTexture( GL_TEXTURE_2D, texture[2] );
glTexParameteri( GL_TEXTUR
没有合适的资源?快使用搜索试试~ 我知道了~
Qt+OpenGL在立方体表面显示视频流
共62个文件
tlog:24个
obj:8个
cpp:5个
4星 · 超过85%的资源 需积分: 48 176 下载量 45 浏览量
2013-03-02
21:05:46
上传
评论 8
收藏 11.25MB RAR 举报
温馨提示
在Qt框架下使用OpenGL,在空间中绘制一个立方体,把摄像头捕获的视频流当做OpenGL贴图,实时地贴到立方体各个表面上。可以用键盘的上下左右键,来旋转立方体,以便观察效果。"L"键切换光照模式。
资源推荐
资源详情
资源评论
收起资源包目录
QtShowVideo.rar (62个子文件)
QtShowVideo
ipch
qtshowvideo-e3f4c3e6
QtShowVideo
Release
CL.write.1.tlog 1KB
mt.read.1.tlog 616B
moc_qtshowvideo.obj 12KB
QtShowVideo.exe.intermediate.manifest 381B
custombuild.write.1.tlog 690B
custombuild.command.1.tlog 2KB
link.command.1.tlog 2KB
CL.read.1.tlog 131KB
mt.write.1.tlog 256B
qrc_qtshowvideo.obj 5KB
mt.command.1.tlog 446B
link.write.1.tlog 692B
QtShowVideo.lastbuildstate 47B
QtShowVideo.log 920B
cl.command.1.tlog 4KB
main.obj 13KB
qtshowvideo.obj 35KB
custombuild.read.1.tlog 384B
link.read.1.tlog 5KB
bird.bmp 48KB
QtShowVideo.vcxproj 12KB
Resources
qtshowvideo.ui 1KB
QtShowVideo.vcxproj.filters 3KB
GeneratedFiles
Release
moc_qtshowvideo.cpp 3KB
qrc_qtshowvideo.cpp 730B
ui_qtshowvideo.h 3KB
Debug
moc_qtshowvideo.cpp 3KB
Debug
CL.write.1.tlog 2KB
mt.read.1.tlog 608B
moc_qtshowvideo.obj 118KB
QtShowVideo.exe.intermediate.manifest 381B
custombuild.write.1.tlog 686B
custombuild.command.1.tlog 1KB
link.command.1.tlog 2KB
vc100.pdb 1.45MB
CL.read.1.tlog 131KB
mt.write.1.tlog 248B
qrc_qtshowvideo.obj 17KB
mt.command.1.tlog 434B
link.write.1.tlog 856B
QtShowVideo.lastbuildstate 45B
QtShowVideo.log 3KB
cl.command.1.tlog 4KB
main.obj 120KB
qtshowvideo.obj 155KB
custombuild.read.1.tlog 384B
link.read.1.tlog 5KB
qtshowvideo.h 917B
Nash.jpg 143KB
main.cpp 746B
1.jpg 100KB
2.jpg 63KB
qtshowvideo.cpp 8KB
QtShowVideo.vcxproj.user 575B
qtshowvideo.qrc 71B
QtShowVideo.suo 13KB
QtShowVideo.sln 900B
QtShowVideo.sdf 47.33MB
Win32
Release
QtShowVideo.exe 22KB
Debug
QtShowVideo.ilk 695KB
QtShowVideo.pdb 1.81MB
QtShowVideo.exe 55KB
共 62 条
- 1
stevenash10086
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
前往页