#include "qscarletgl_augmentedreality.h"
#include<QOpenGLShaderProgram>
#include<QDebug>
#include<QKeyEvent>
#include<QGLFormat>
#include<QImage>
//#include<glut.h>
//=====Eigen
#include<Eigen/Core>
#include<Eigen/Dense>
//=====std
#include<vector>
#include<fstream>
#include<iostream>
using namespace std;
using namespace cv;
QScarletGLAugmentedReality::QScarletGLAugmentedReality(QWidget*parent)
:QGLWidget(parent)
{
cam.open(0);
initWidget();
initializeGL();
qDebug()<<"initial3";
//resizeGL(640,480);
clk.start(30);
qDebug()<<"initial1";
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);
//start();//开始
qDebug()<<"initial done!";
}
QScarletGLAugmentedReality::~QScarletGLAugmentedReality()
{
clk.stop();
if(cam.isOpened() ==true)//释放camera
cam.release();
}
//cam
//三个重载函数
void QScarletGLAugmentedReality::initializeGL()
{
initialize_AugmentReality();
}
void QScarletGLAugmentedReality::paintGL()
{
paint_AugmentReality();
//update();
}
void QScarletGLAugmentedReality::resizeGL(int width,int height)
{
resize_AugmentReality(width,height);
}
void QScarletGLAugmentedReality::initWidget()
{
//setGeometry(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);//设置窗口位置及大小
setWindowTitle(tr("opengl demo"));
}
//==========实际绘制
void QScarletGLAugmentedReality::loadGLTextures()//加载纹理
{
qDebug()<<"initializeGL0";
//initializeOpenGLFunctions();
QImage tex;QImage buf;
if (!buf.load(":/logo/logo/Scarletogo3.png"))
//if (!buf.load(":/logo/logo/box.png"))
{
qWarning("load image failed!");
QImage dummy(128, 128, QImage::Format_RGB32);
dummy.fill(Qt::green);
buf = dummy;
}
qDebug()<<"initializeGL1";
tex = QGLWidget::convertToGLFormat(buf);
qDebug()<<"initializeGL2";
glGenTextures(1, &texturImage);//对应图片的纹理定义
qDebug()<<"initializeGL3";
glBindTexture(GL_TEXTURE_2D, texturImage);//进行纹理绑定
//纹理创建
glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//加载视频纹理
// video >> frame; cvtColor(frame, frame, CV_BGR2RGB);
// buf = QImage((const unsigned char*)frame.data, frame.cols, frame.rows, frame.cols * frame.channels(), QImage::Format_RGB888);
// tex = QGLWidget::convertToGLFormat(buf);
// glGenTextures(1, &texturImage);//对应图片的纹理定义
// glBindTexture(GL_TEXTURE_2D, texturImage);//进行纹理绑定
// //纹理创建
// glTexImage2D(GL_TEXTURE_2D, 0, 3, tex.width(), tex.height(), 0,
// GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
//gluBuild2DMipmaps( GL_TEXTURE_2D, GL_RGB, tex.width(), tex.height(), GL_RGBA, GL_UNSIGNED_BYTE, tex.bits());
}
void QScarletGLAugmentedReality::initialize_AugmentReality()
{
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 QScarletGLAugmentedReality::paint_AugmentReality()
{
//updateWindow();
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个单位
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

御伽草子
- 粉丝: 477
最新资源
- 2022届应届生求职避坑指南-记录2022年大规模毁约应届生的公司名单及详细情况-帮助应届生识别高风险企业避免踩坑-包含互联网科技金融教育等多个行业-提供公司名称毁约时间毁约人数毁.zip
- (源码)基于嵌入式系统和实时系统的生产者消费者项目.zip
- (源码)基于HTML、CSS和JavaScript的电动汽车展示网站.zip
- (源码)基于STM32微控制器的田径比赛计时显示系统.zip
- 基于模拟硬盘的类Linux文件系统设计与实现-100MB文本文档模拟硬盘空间-支持多用户登录与文件操作-包含系统用户和普通用户账号管理-实现文件创建删除读写权限控制-支持互斥写操作.zip
- 基于SpringBootMyBatis微信小程序开发的B2C电子商务平台-包含商品展示-购物车管理-订单处理-会员系统-支付接口-物流跟踪-优惠券发放-商品评价-后台管理-数据.zip
- (源码)基于Solidity和React的简单去中心化交易所.zip
- 一个面向计算机科学初学者的DIY项目集合-包含自制操作系统-CPU-编译器-数据库-编程语言-网络协议栈-文件系统-虚拟机-游戏引擎-区块链等各类计算机系统实现-通过从零开始构建各.zip
- (源码)基于ANSI C语言的简易矩阵表达式计算解释器.zip
- (源码)基于ES6和Pixi的H5游戏开发项目.zip
- (源码)基于Arduino的家庭云信息显示系统.zip
- (源码)基于物联网的蘑菇农场管理系统.zip
- lingbai-kong-MIPS89-pipeline-CPU-58184-1753000904969.zip
- (源码)基于React Native的智能家居管理系统.zip
- (源码)基于Arduino和RFID技术的Kill Confirm系统.zip
- 计算机系统基础课程实验项目之数据实验室-位操作与整数浮点数表示深度解析-用于帮助学生理解计算机底层数据表示和位运算原理-通过修改bitsc文件完成指定位操作函数-使用dlc编译器.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


