关闭

opencv与opengl混用实现三维点云图像

646人阅读 评论(0) 收藏 举报
分类:

/*

灰度图转换为高度图,为双目视觉三维重建做准备。

*/

#include <iostream>  

#include <stdlib.h>  
//#include <cv.h>  
//#include <cxcore.h>  
//#include <highgui.h>  
#include "opencv2/calib3d/calib3d.hpp"    
#include "opencv2/imgproc/imgproc.hpp"    
#include "opencv2/highgui/highgui.hpp"    
#include "opencv2/contrib/contrib.hpp"   
#include <cmath>  
#include <glut.h>    
#include <iostream>  

#pragma comment(lib,"opencv_highgui248.lib")    
#pragma comment(lib,"opencv_core248.lib")    
#pragma comment(lib,"opencv_imgproc248.lib")    




using namespace cv;
using namespace std;


#define MAX_SIZE 1024  


float imgdata[MAX_SIZE][MAX_SIZE];


int w = 0;
int h = 0;
float scalar = 50;


void renderScene(void)
{


glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();              
gluLookAt(0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotatef(-90, 0.0, 1.0, 0.0);
glRotatef(-90, 0.0, 0.0, 1.0); 
glRotatef(-180, 0.0, 1.0, 0.0);


float imageCenterX = w*0.5;
float imageCenterY = h*0.5;
float x, y, z;
glPointSize(1.0);
glBegin(GL_POINTS);//GL_POINTS  
for (int i = 0; i<h; i++)
{
for (int j = 0; j<w; j++)
{
// color interpolation  
glColor3f(1 - imgdata[i][j] / 255, imgdata[i][j] / 255, imgdata[i][j] / 255);
x = ((float)j - imageCenterX) / scalar;
y = ((float)i - imageCenterY) / scalar;
z = imgdata[i][j] / scalar;
glVertex3f(x, y, z);
}
}
glEnd();
glFlush();
}
void reshape(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 100.0);
glMatrixMode(GL_MODELVIEW);
}


void displayDisparity(IplImage* disparity)
{
double xyscale = 100;
int j = 0;
int i = 0;
CvScalar s;


//accessing the image pixels  
for (i = 0; i<h; i++)
{
for (j = 0; j<w; j++)
{
s = cvGet2D(disparity, i, j);
imgdata[i][j] = s.val[0];//for disparity is a grey image.  
}
}
}
int main(int argc,char *argv[])
{
string imgname="1.jpg";
IplImage* grey = cvLoadImage(imgname.c_str(), 1); //read image as a grey one  
if (grey == NULL)
{
cout << "No valid image input." << endl;
char c = getchar();
return 1;
}
w = grey->width;
h = grey->height;


displayDisparity(grey);
cvNamedWindow("original", CV_WINDOW_AUTOSIZE);
cvShowImage("original", grey);


//------------------OpenGL-------------------------  
glutInit(&argc, (char**)argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_DEPTH | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("3D disparity image");
glutDisplayFunc(renderScene);
glutReshapeFunc(reshape);
glutMainLoop();
cvWaitKey(0);
//release opencv stuff.  
cvReleaseImage(&grey);
cvDestroyWindow("Original");


return 0;
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

关于OpenNI2和OpenCV2的那些事——获取三维点云数据并用OpenGL表示

上一节呢,我们利用openni2获得了彩色图像和深度图像,这一节我们用openni2的转换函数将深度数据转换为三维点云,然后用彩色数据作为纹理将点云用opengl画出来。 首先介绍CoordinateConverter::convertDepthToWorld(const VideoStream&a...
  • aptx704610875
  • aptx704610875
  • 2015-11-12 15:45
  • 7575

Marching Cube(C++ OpenGl代码)读取医学三维图像*.raw进行三维重建

Marching Cube(C++ OpenGl代码)读取医学三维图像*.raw进行三维重建 #define GLUT_DISABLE_ATEXIT_HACK #include #include #include "stdio.h" #include "math....
  • HW140701
  • HW140701
  • 2016-11-23 20:19
  • 3153

一种基于OpenCV的三维重建实现方案

一种基于OpenCV的三维重建实现方案 来源:淘金者论文范文 作者:Www.TaoJz.Com 日期:08/30/09 摘 要 本文以计算机视觉三维重建技术为研究对象,分析了开放计算机视觉函数库OpenCV中的三维重建模型,通过六个步骤,特别是摄像机...
  • zkl99999
  • zkl99999
  • 2015-09-11 14:06
  • 5510

使用OpenGL显示双目视觉三维重构效果

http://blog.csdn.net/chenyusiyuan/article/details/5691481  上一篇笔记中使用Matlab初步显示了双目视觉重构出的环境三维效果图,不过并没有加上纹理信息。在OpenCV中文论坛里,大象的...
  • wu_wenhuan
  • wu_wenhuan
  • 2016-09-23 09:51
  • 2098

基于图像的三维重建与基于三维点云数据的曲面拟合

侧影轮廓线三维重建 此类方法是使用一系列物体的轮廓线条构成三维形体。当物体的部分表面无法在轮廓联机展现时,重建后将丢失三维信息。常见的方式是将待测物放置于电动转盘上,每次旋转一小角度后拍摄其图像,再经由图像处理技巧去除背景并取出轮廓线条,搜集各角度之轮廓线后即可“刻画”成三维模型。 ...
  • piaoxuezhong
  • piaoxuezhong
  • 2017-04-07 13:50
  • 2356

openGL显示3d 点云图像

刚学习openGL,所以想写个opengl 显示3d 点云的例子,但是由于一些东西还太理不清楚,所以有些问题 没有得到理想的效果,现将代码贴在这里,期待高手解惑。 主要步骤如下: 1,通过opencv读取rgb图和depth图,得到一个4通道的float矩阵,其中前三个通道存储x, y, z的...
  • caizou123123
  • caizou123123
  • 2016-07-28 14:25
  • 1492

OpenGL OpenCV根据视差图重建三维信息

代码如下:   // disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" //Huang,Haiqiao coded on Dec.2009代码出处: //http...
  • wangyaninglm
  • wangyaninglm
  • 2014-11-23 15:19
  • 8641

用VS+Opencv3.1从双目立体视差图中重建三维点云

用VS+Opencv3.1从双目立体视差图中重建三维点云并显示
  • u014283958
  • u014283958
  • 2016-09-26 19:49
  • 6797

利用PCL(Point Cloud Library)进行点云拼接

本文翻译自官网教程 近期在做一个关于三维扫描的项目,需要用到点云拼接,从而接触到PCL。PCL是一个类似于OpenCV的开源库,只是OpenCV提供的是对二维图像的处理方法,而PCL提供了很多三维点云的处理功能,其中就包括点云拼接。在三维扫描项目中,需要利用点云拼接方法将多次扫描得到的点云数据拼合成...
  • Damoninhit
  • Damoninhit
  • 2014-11-27 19:55
  • 10508

利用Kinect深度图像生成三维点

1. 相机针孔模型 首先,我们来介绍一下相机针孔模型 。如下图所示, 是空间中的一个点,是其对应图像中的点。为了简化模型,这里图像中心在相机的光学中心上,如图。 这里有两个坐标系,分别是相机坐标系 和图像坐标系。这里点和是随机的(存在映射关系)。 在数学上,简化...
  • u012700322
  • u012700322
  • 2016-07-04 16:15
  • 5295
    个人资料
    • 访问:89854次
    • 积分:1321
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:74篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论