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 1024float imgdata[MAX_SIZE][MAX_SIZE];int w=0;int h=0;float scalar=50;//scalar of converting pixel color to float coordinatesvoid renderScene(void) {glClear (GL_COLOR_BUFFER_BIT);glLoadIdentity();// Reset the coordinate system before modifyinggluLookAt (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 axisglRotatef(-180, 0.0, 0.0, 1.0); //rotate about the z axisglRotatef(-180, 0.0, 1.0, 0.0); //rotate about the y axisfloat imageCenterX = w*.5;float imageCenterY = h*.5;float x,y,z;glPointSize(1.0);glBegin(GL_POINTS);//GL_POINTSfor (int i=0;i<h;i++){for (int j=0;j<w;j++){// color interpolationglColor3f(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 pixelsfor (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 oneif (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 1024float 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.1415926bool 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 modifyinggluLookAt (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 axisglRotatef(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_POINTSfor (int i=0;i<h;i++){for (int j=0;j<w;j++){// color interpolationglColor3f(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 pixelsfor (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 oneif (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;}

效果如下:

想要成功,就一定要和成功的人在一起,不然反之

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

相关文章:

你感兴趣的文章:

标签云: