#include "opengl.h"
OpenGL::OpenGL(QWidget *parent)
: QGLWidget(parent), number(0)
{
cam.open(0);
//cam.set(CV_CAP_PROP_FRAME_WIDTH, IMAGE_WIDTH);
//cam.set(CV_CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT);
//video.open("F:\\MOVIE\\NBA\\2016年06月20日 NBA总决赛 骑士VS勇士 ILP 720P 30fps.mp4");
initWidget();
initializeGL();
//resizeGL(640,480);
clk.start(30);
QObject::connect(&clk, SIGNAL(timeout()), this, SLOT(updateWindow()));
//
cameraMatrix.at<double>(0, 0) = 958.75165;
cameraMatrix.at<double>(0, 1) = 0;
cameraMatrix.at<double>(0, 2) = 288.77948;
cameraMatrix.at<double>(1, 0) = 0;
cameraMatrix.at<double>(1, 1) = 961.14463;
cameraMatrix.at<double>(1, 2) = 235.69318;
cameraMatrix.at<double>(2, 0) = 0;
cameraMatrix.at<double>(2, 1) = 0;
cameraMatrix.at<double>(2, 2) = 1;
//
distCoeffs.at<double>(0, 0) = -0.1569114923;
distCoeffs.at<double>(0, 1) = 0.0902004093;
distCoeffs.at<double>(0, 2) = 0.0047139050;
distCoeffs.at<double>(0, 3) = -0.0022716345;
Xworld.push_back(Point3f(-0.5, -0.5, 0));
Xworld.push_back(Point3f(-0.5, 0.5, 0));
Xworld.push_back(Point3f(0.5, 0.5, 0));
Xworld.push_back(Point3f(0.5, -0.5, 0));
WINDOW_SIZE = 0.5;
//
dstRect[0] = Point2f(83.3, 164.7);
dstRect[1] = Point2f(191.9, 226.4);
dstRect[2] = Point2f(185.5, 0);
dstRect[3] = Point2f(291.4, 61.7);
}
OpenGL::~OpenGL()
{
}
void OpenGL::initializeGL()
{
loadGLTextures(); //加载图片文件
glEnable(GL_TEXTURE_2D);//启用纹理
glShadeModel(GL_SMOOTH);
glClearColor(0, 0, 0.0, 0.0);
glClearDepth(1.0);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void OpenGL::initWidget()
{
setGeometry(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);//设置窗口位置及大小
setWindowTitle(tr("opengl demo"));
}
void OpenGL::paintGL()
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();//重置坐标系至屏幕中央 上+下- 左-右+ 里-外+
glTranslatef(3.2f, -0.6f, -100);//讲显示背景沿Z轴向后移动足够距离,防止遮挡渲染物体
glScalef(8.35f,8.35f,1.0f);//平移 放大 实现窗口填充-
//绑定纹理
glBindTexture(GL_TEXTURE_2D, texturFrame);
glBegin(GL_QUADS);//绘制图形接口,与glEnd()对应
glTexCoord2f(0.0, 0.0); glVertex3f(-4, -3, 0);//
glTexCoord2f(1.0, 0.0); glVertex3f(4, -3, 0);
glTexCoord2f(1.0, 1.0); glVertex3f(4, 3, 0);
glTexCoord2f(0.0, 1.0); glVertex3f(-4, 3, 0);
glEnd();
//将变换矩阵统一进行渲染
if (RotationMatrix.size())
{
for (int i = 0; i < RotationMatrix.size(); i++)
{
glLoadIdentity();//重置坐标系至屏幕中央 上+下- 左-右+ 里-外+
for (int j = 0; j < 16; j++)
rotMat[j] = RotationMatrix[i][j];
glLoadMatrixd(rotMat);//加载变换矩阵
glTranslatef(0, 0, -WINDOW_SIZE);//将物体向外移动WINDOW_SIZE个单位
//glRotatef(m_x, 1.0, 0.0, 0.0);//旋转
//glRotatef(m_y, 0.0, 1.0, 0.0);
//glRotatef(m_z, 0.0, 0.0, 1.0);
glBindTexture(GL_TEXTURE_2D, texturImage);
//glLoadMatrixd();
glBegin(GL_QUADS);//绘制图形接口,与glEnd()对应
//glBegin(GL_LINE_STRIP);//绘制图形接口,与glEnd()对应
/*这里有两个接口函数:
glTexCoord2f( x, y );
glVertex3f( x, y, z );
glTexCoord2f这个用于表示原图片的坐标,这样更容易理解, 就是以 在x,y 轴的平面里面, (0,0)表示图片的左下角,
(0,1) 表示左上角, (1,1)表示右上角, (1,0)表示右下角。
而对应的glVertex3f则对应为 (-1, -1) , (-1, 1) , (1, 1), (1, -1)
我们怎么来理解这种对应关系呢??
1.需要贴图的坐标必须一一对应,就是我们如果顺时针写,对应的坐都要顺时针,如果逆时针写,对应的坐标都要逆时针,一一对应。
2.我们的贴图是一张图片,所以它一定是一个平面。所以坐标从(0,0)开始,这个容易使用。而我们需要贴图的立体图形,
虽然每个面是平面图形,但它在坐标系中,始终以立体图形的中心为坐标原点,所以,它是一个三维坐标,三维坐标与二维的对应,就只有以相同的平面顶点
E旋转顺序来对应了。*/
glNormal3f(0.0, 0.0, 1.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);//
glTexCoord2f(1.0, 0.0); glVertex3f(WINDOW_SIZE, -WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(1.0, 1.0); glVertex3f(WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(0.0, 1.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);
glNormal3f(0.0, 0.0, -1.0);
glTexCoord2f(1.0, 0.0); glVertex3f(-WINDOW_SIZE, -WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(1.0, 1.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(0.0, 1.0); glVertex3f(WINDOW_SIZE, WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(0.0, 0.0); glVertex3f(WINDOW_SIZE, -WINDOW_SIZE, -WINDOW_SIZE);
glNormal3f(0.0, 1.0, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(0.0, 0.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(1.0, 0.0); glVertex3f(WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(1.0, 1.0); glVertex3f(WINDOW_SIZE, WINDOW_SIZE, -WINDOW_SIZE);
glNormal3f(0.0, -1.0, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(-WINDOW_SIZE, -WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(0.0, 1.0); glVertex3f(WINDOW_SIZE, -WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(0.0, 0.0); glVertex3f(WINDOW_SIZE, -WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(1.0, 0.0); glVertex3f(-WINDOW_SIZE, -WINDOW_SIZE, WINDOW_SIZE);
glNormal3f(1.0, 0.0, 0.0);
glTexCoord2f(1.0, 0.0); glVertex3f(WINDOW_SIZE, -WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(1.0, 1.0); glVertex3f(WINDOW_SIZE, WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(0.0, 1.0); glVertex3f(WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(0.0, 0.0); glVertex3f(WINDOW_SIZE, -WINDOW_SIZE, WINDOW_SIZE);
glNormal3f(-1.0, 0.0, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-WINDOW_SIZE, -WINDOW_SIZE, -WINDOW_SIZE);
glTexCoord2f(1.0, 0.0); glVertex3f(-WINDOW_SIZE, -WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(1.0, 1.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, WINDOW_SIZE);
glTexCoord2f(0.0, 1.0); glVertex3f(-WINDOW_SIZE, WINDOW_SIZE, -WINDOW_SIZE);
glEnd();
}
RotationMatrix.clear();
}
//纹理资源释放
glDeleteTextures(1, &texturFrame);
//glDeleteTextures(1, &texturImage);
//glLoadIdentity();//重置坐标系至屏幕中央 上+下- 左-右+ 里-外+
}
void OpenGL::resizeGL(int width, int height)
{
if (0 == height) {
height = 1;
}
glViewport(0, 0, (GLint)width, (GLint)height);//重置当前的物体显示位置
glLoadIdentity();
glMatrixMode(GL_PROJECTION);//选择矩阵模式
double f_x = cameraMatrix.at<double>(0, 0);
double f_y = cameraMatrix.at<double>(1, 1);
double c_x = cameraMatrix.at<double>(0, 2);
double c_y = cameraMatrix.at<double>(1, 2);
projection_matrix[0] = 2 * f_x / IMAGE_WIDTH;
projection_matrix[1] = 0.0f;
projection_matrix[2] = 0.0f;
projection_matrix[3] = 0.0f;
projection_matrix[4] = 0.0f;
projection_matrix[5] = 2 * f_y / IMAGE_HEIGHT;
projection_matrix[6] = 0.0f;
projection_matrix[7] = 0.0f;
projection_matrix[8] = 1.0f - 2 * c_x / IMAGE_WIDTH;
projection_matrix[9] = 2 * c_y / IMAGE_HEIGHT - 1.0f;
projection_matrix[10] = -(0.01f + 100.0f) / (100.0f - 0.01f);
projection_matrix[11] = -1.0f;
projection_matrix[12] = 0.0f;
projection_matrix[13] = 0.0f;
projection_matrix[14] = -2.0f * 100 * 0.01 / (100.0f - 0.01f);
projection_matrix[15] = 0.0f;
//导入相机内部参数模型
glMultMatrixf(projection_matrix);
//glLoadMatrixf(projection_matrix);
//glEnableClientState(GL_VERTEX_ARRAY); //启用客户端的某项功能
//glEnableClientState(GL_NORMAL_ARRAY);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void OpenGL::updateWindow()
{
//获取摄像头图像并进行格式转换
cam >> frame; // imshow("frame",frame);
cvtColor(frame, frame, CV_BGR2RGB);
for (char i = 0; i < 4; i++)
{
circle(frame, srcRect[i], 8, Scalar(255, 0, 0), -1, 8, 0);
}
circle(frame, Point(dobotPos.at<double>(0, 0), dobotPos.at<double>(1, 0)), 5, Scalar(0, 255, 255), -1, 8);
imageProcess(frame);
QImage buf, tex;
//将Mat类型转换成QImage
buf = QImage((
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
qtOpenGL.rar (52个子文件)
qtOpenGL
Win32
Debug
QtOpenGL.ilk 4.43MB
QtOpenGL.exe 289KB
QtOpenGL.pdb 13.03MB
QtOpenGL.sln 970B
QtOpenGL.sdf 61.5MB
QtOpenGL.v12.suo 47KB
QtOpenGL
qtopengl.qrc 68B
resource.h 387B
Debug
QtOpenGL.log 3KB
moc_qtopengl.obj 568KB
qtopengl.obj 642KB
vc120.pdb 4.8MB
QtOpenGL.res 32B
QtOpenGL.Build.CppClean.log 1KB
moc_opengl.obj 374KB
main.obj 564KB
QtOpenGL.tlog
cl.command.1.tlog 11KB
custombuild.read.1.tlog 612B
rc.command.1.tlog 384B
CL.read.1.tlog 442KB
custombuild.command.1.tlog 3KB
link.read.1.tlog 8KB
rc.read.1.tlog 2KB
link.write.1.tlog 1KB
CL.write.1.tlog 13KB
QtOpenGL.lastbuildstate 157B
link.command.1.tlog 3KB
custombuild.write.1.tlog 914B
rc.write.1.tlog 202B
qrc_qtopengl.obj 5KB
MarkerDetection.obj 393KB
opengl.obj 871KB
Marker.obj 324KB
qtopengl.h 731B
Resources
butterfly.jpg 65KB
qtopengl.cpp 1KB
opengl.ui 522B
opengl.cpp 14KB
QtOpenGL.aps 1KB
QtOpenGL.vcxproj 13KB
qtopengl.ui 7KB
QtOpenGL.vcxproj.filters 3KB
QtOpenGL.rc 2KB
GeneratedFiles
Debug
moc_qtopengl.cpp 4KB
moc_opengl.cpp 3KB
ui_qtopengl.h 6KB
Release
qrc_qtopengl.cpp 1KB
butterfly.jpg 65KB
dog.jpg 34KB
main.cpp 175B
QtOpenGL.vcxproj.user 2KB
opengl.h 1KB
共 52 条
- 1
资源评论
- shiluoxuan2017-11-23试试看有没有用
- 孙诚昊2018-02-07请问 此文件夹里面没有pro文件 ,怎样用Qt打开呢?
- 抱走的小牛2017-02-17不错 很好 good
- PushBug2018-11-02666 ,,对我这种小白很贴心
- 光松2020-03-10想学习一下opengl,可以用
WAmani
- 粉丝: 97
- 资源: 8
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功