计算机视觉
图像处理

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

代码如下:

// disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



//Huang,Haiqiao coded on Dec.2009代码出处:
//http://www.Opencv.org.cn/forum.php?mod=viewthread&tid=8722&extra=&page=1
#include "stdafx.h"
#include 
#include 
//#include 
//#include 
//#include 
#include "opencv2/calib3d/calib3d.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/contrib/contrib.hpp" 

#pragma comment(lib,"opencv_highgui2410d.lib")  
#pragma comment(lib,"opencv_core2410d.lib")  
#pragma comment(lib,"opencv_imgproc2410d.lib")  
 


#include 
#include <GL/glut.h>  
#include 
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;//scalar of converting pixel color to float coordinates

void renderScene(void) 
{

	glClear (GL_COLOR_BUFFER_BIT);
	glLoadIdentity();				// Reset the coordinate system before modifying
	gluLookAt (0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	glRotatef(-30, 0.0, 1.0, 0.0); //rotate about the x axis
	glRotatef(-180, 0.0, 0.0, 1.0); //rotate about the z axis
	glRotatef(-180, 0.0, 1.0, 0.0); //rotate about the y axis

	float imageCenterX = w*.5;
	float imageCenterY = h*.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)
{  
	cout << "OpenCV and OpenGL working together!"<<endl;
	//char* filename = "tsuDisparity.bmp;";

	string image_name;
	cout<<"input image name:"<<endl; cin>>image_name;
	IplImage* imgGrey = cvLoadImage(image_name.c_str(),0); //read image as a grey one
	if (imgGrey==NULL)
	{
		cout << "No valid image input."<<endl; char c=getchar(); return 1; } w = imgGrey->width;
	h = imgGrey->height;

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

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

	return 0;
}




效果:

 

 

 

添加鼠标移动事件,代码如下:

// disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



//Huang,Haiqiao coded on Dec.2009代码出处:
//http://www.opencv.org.cn/forum.php?mod=viewthread&tid=8722&extra=&page=1
#include "stdafx.h"
#include 
#include 
//#include 
//#include 
//#include 
#include "opencv2/calib3d/calib3d.hpp"  
#include "opencv2/imgproc/imgproc.hpp"  
#include "opencv2/highgui/highgui.hpp"  
#include "opencv2/contrib/contrib.hpp" 

#pragma comment(lib,"opencv_highgui2410d.lib")  
#pragma comment(lib,"opencv_core2410d.lib")  
#pragma comment(lib,"opencv_imgproc2410d.lib")  



#include 
#include <GL/glut.h>  
#include 
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;//scalar of converting pixel color to float coordinates

#define pi 3.1415926
bool mouseisdown=false;
bool loopr=false;
int mx,my;
int ry=10;
int rx=10;


void timer(int p)
{
	ry-=5;
	//marks the current window as needing to be redisplayed.
	glutPostRedisplay();
	if (loopr)
		glutTimerFunc(200,timer,0);
}


void mouse(int button, int state, int x, int y)
{
	if(button == GLUT_LEFT_BUTTON)
	{
		if(state == GLUT_DOWN)
		{
			mouseisdown=true;
			loopr=false;
		}
		else
		{
			mouseisdown=false;
		}
	}

	if (button== GLUT_RIGHT_BUTTON)
		if(state == GLUT_DOWN)
		{
			loopr=true;
			glutTimerFunc(200,timer,0);
		}
}

void motion(int x, int y)
{
	if(mouseisdown==true)
	{
		ry+=x-mx;
		rx+=y-my;
		mx=x;
		my=y;
		glutPostRedisplay();
	}
}

void special(int key, int x, int y)
{
	switch(key)
	{
	case GLUT_KEY_LEFT:
		ry-=5;
		glutPostRedisplay();
		break;
	case GLUT_KEY_RIGHT:
		ry+=5;
		glutPostRedisplay();
		break;
	case GLUT_KEY_UP:
		rx+=5;
		glutPostRedisplay();
		break;
	case GLUT_KEY_DOWN:
		rx-=5;
		glutPostRedisplay();
		break;
	}
}


void renderScene(void) 
{

	glClear (GL_COLOR_BUFFER_BIT);
	glLoadIdentity();				// Reset the coordinate system before modifying
	gluLookAt (0.0, 0.0, 10.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
	//gluLookAt (0.0, 0.0, 7.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0);
	//glRotatef(-30, 0.0, 1.0, 0.0); //rotate about the x axis
	//glRotatef(-180, 0.0, 0.0, 1.0); //rotate about the z axis
	//glRotatef(-180, 0.0, 1.0, 0.0); //rotate about the y axis

	glRotatef(ry,0,1,0);
	glRotatef(rx-180,1,0,0);

	float imageCenterX = w*.5;
	float imageCenterY = h*.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)
{  
	cout << "OpenCV and OpenGL working together!"<<endl;
	//char* filename = "tsuDisparity.bmp;";

	string image_name;
	cout<<"input image name:"<<endl; cin>>image_name;
	IplImage* imgGrey = cvLoadImage(image_name.c_str(),0); //read image as a grey one
	if (imgGrey==NULL)
	{
		cout << "No valid image input."<<endl; char c=getchar(); return 1; } w = imgGrey->width;
	h = imgGrey->height;

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

	//------------------OpenGL-------------------------
	glutInit(&argc,(char**)argv);
	glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);
	glutInitWindowPosition(100,100);
	glutInitWindowSize(500,500);
	glutCreateWindow("3D disparity image");
	glutDisplayFunc(renderScene);
	glutReshapeFunc (reshape);

	glutMouseFunc(mouse);
	glutMotionFunc(motion);
	glutSpecialFunc(special);

	glutMainLoop();

	cvWaitKey(0);
	//release opencv stuff.
	cvReleaseImage(&imgGrey);
	cvDestroyWindow("Original");

	return 0;
}




 

效果如下:

转载请注明来源:CV视觉网 » OpenGL OpenCV根据视差图重建三维信息

分享到:更多 ()
扫描二维码,给作者 打赏
pay_weixinpay_weixin

请选择你看完该文章的感受:

0不错 0超赞 0无聊 0扯淡 0不解 0路过

评论 24

评论前必须登录!

 

  1. #7

    看的眼疼

    助美整形网1年前 (2016-10-14)
  2. #6

    就爱一本正经的看代码文章,然后假装自己看懂了。

    佛山影视1年前 (2016-09-29)
  3. #5

    老厉害了

    污污影视1年前 (2016-09-24)
  4. #4

    偶然来访,受益良多!

    卢松松博客1年前 (2016-09-24)
  5. #3

    技术活

    茶叶知识1年前 (2016-09-18)
  6. #2

    文章很好~

  7. #1

    今天没吃药感觉自己萌萌哒

    卢松松博客1年前 (2016-09-10)