zoukankan      html  css  js  c++  java
  • 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 <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" 
    
    #pragma comment(lib,"opencv_highgui2410d.lib")  
    #pragma comment(lib,"opencv_core2410d.lib")  
    #pragma comment(lib,"opencv_imgproc2410d.lib")  
     
    
    
    #include <math.h>
    #include <GL/glut.h>  
    #include <iostream>
    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 <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" 
    
    #pragma comment(lib,"opencv_highgui2410d.lib")  
    #pragma comment(lib,"opencv_core2410d.lib")  
    #pragma comment(lib,"opencv_imgproc2410d.lib")  
    
    
    
    #include <math.h>
    #include <GL/glut.h>  
    #include <iostream>
    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;
    }
    
    
    
    

    效果如下:


  • 相关阅读:
    CVS使用经验谈(zz from chinaunix.net)
    登黄山
    登黄山之二
    Dennis Ritchie 去世
    观迎客松
    从程序员角度看ELF
    再次回到这里
    异步时钟下跨时钟域信号处理
    Fedora14下的Novas和Synopsys
    Oralce导入\导出
  • 原文地址:https://www.cnblogs.com/wangyaning/p/4236972.html
Copyright © 2011-2022 走看看