将opengl的绘制效果保存成图片
(2012-03-05 16:09:12)
标签:
杂谈 |
#include "windows.h"
#include
<GL/glut.h>
#include
<GL/GLAUX.H>
#include
<iostream>
using namespace std;
//
typedef GLbyte*
bytePt;
int winWidth = 400;
int winHeight = 400;
int arrLen = winWidth * winHeight *
3;
GLbyte* colorArr = new GLbyte[ arrLen
];
void
saveColorData(bytePt& _pt, string&
_str) {
FILE* pFile = NULL;
pFile = fopen(_str.c_str(),
"wt");
if(!pFile) { fprintf(stderr, "error
\n"); exit(-1); }
for(int i=0;
i<winWidth * winHeight * 3; i ++) {
if(colorArr[i] == -1) { colorArr[i] =
255; }
}
for(int i=0;
i<winWidth * winHeight * 3; i ++) {
fprintf(pFile, "%d\n",
colorArr[i]);
}
fclose(pFile);
printf("color data saved!
\n");
}
void init() {
glClearColor(0.5, 0.5, 0.5,
0.0);
glShadeModel(GL_SMOOTH);
}
void display() {
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 100.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0, 1.0, 0.1,
500.0);
glMatrixMode(GL_MODELVIEW);
glColor3f(1.0, 0.0,
0.0);
glBegin(GL_TRIANGLES);
glVertex3f(0.0, 25.0,
0.0);
glVertex3f(-25.0, -25.0,
0.0);
glVertex3f(25.0, -25.0,
0.0);
glEnd();
glFlush();
}
void keyboard(unsigned char key, int
x , int y) {
GLint viewPort[4] =
{0};
switch(key) {
case 'c':
case 'C':
glGetIntegerv(GL_VIEWPORT,
viewPort);
glReadPixels(viewPort[0],
viewPort[1], viewPort[2], viewPort[3], GL_RGB, GL_UNSIGNED_BYTE,
colorArr);
printf("color data read
!\n");
saveColorData(colorArr,
(string)"tmpcolor.txt");
default:
break;
}
}
int main(int argc, char** argv)
{
glutInit(&argc,
argv);
glutInitDisplayMode(GLUT_SINGLE |
GLUT_RGB);
glutInitWindowPosition(200,
200);
glutInitWindowSize(400,
400);
glutCreateWindow(argv[0]);
init();
glutDisplayFunc(display);
glutKeyboardFunc(keyboard);
glutMainLoop();
delete [] colorArr;
return 0;
}
function test
end
void
saveColorData2img(bytePt& _pt,
string& _str) {
cv::Mat img;
vector<cv::Mat>
imgPlanes;
img.create(winHeight, winWidth,
CV_8UC3);
cv::split(img,
imgPlanes);
for(int i = 0; i <
winHeight; i ++) {
UCHAR* plane0Ptr =
imgPlanes[0].ptr<UCHAR>(i);
UCHAR* plane1Ptr =
imgPlanes[1].ptr<UCHAR>(i);
UCHAR* plane2Ptr =
imgPlanes[2].ptr<UCHAR>(i);
for(int j = 0; j <
winWidth; j ++) {
int k = 3 * (i * winWidth +
j);
plane2Ptr[j] =
_pt[k];
plane1Ptr[j] =
_pt[k+1];
plane0Ptr[j] =
_pt[k+2];
}
}
cv::merge(imgPlanes,
img);
cv::flip(img, img ,0); //
!!!
cv::imwrite(_str.c_str(),
img);
printf("opencv save opengl img done!
\n");
}
class glGrabber {
public:
glGrabber();
~glGrabber();
void glGrab();
void
saveColorData2Img(string& _str);
private:
GLbyte* colorArr;
GLint viewPort[4];
int winWidth;
int winHeight;
};
//
glGrabber::glGrabber()
{
colorArr = NULL;
}
//
glGrabber::~glGrabber()
{
if(colorArr!=NULL) { delete []
colorArr; colorArr = NULL; }
}
//
void glGrabber::glGrab()
{
glGetIntegerv(GL_VIEWPORT,
viewPort);
if(colorArr != NULL) { delete []
colorArr; colorArr = NULL; }
winWidth =
viewPort[2];
winHeight =
viewPort[3];
colorArr = new GLbyte[ winWidth *
winHeight * 4 ]; // MFC的像素格式只支持RGBA
glReadPixels(viewPort[0],
viewPort[1], viewPort[2], viewPort[3], GL_RGBA, GL_UNSIGNED_BYTE,
colorArr); // RGBA
printf("x: %d, y: %d, window width:
%d, window height: %d \n", viewPort[0], viewPort[1], viewPort[2],
viewPort[3]);
printf("color data read!
\n");
}
//
void
glGrabber::saveColorData2Img(string& _str)
{
cv::Mat img;
vector<cv::Mat>
imgPlanes;
img.create(winHeight, winWidth,
CV_8UC3);
cv::split(img,
imgPlanes);
for(int i = 0; i <
winHeight; i ++) {
UCHAR* plane0Ptr =
imgPlanes[0].ptr<UCHAR>(i);
UCHAR* plane1Ptr =
imgPlanes[1].ptr<UCHAR>(i);
UCHAR* plane2Ptr =
imgPlanes[2].ptr<UCHAR>(i);
for(int j = 0; j <
winWidth; j ++) {
int k = 4 * (i * winWidth + j); //
RGBA
plane2Ptr[j] =
colorArr[k];
plane1Ptr[j] =
colorArr[k+1];
plane0Ptr[j] =
colorArr[k+2];
}
}
cv::merge(imgPlanes,
img);
cv::flip(img, img ,0); //
!!!
cv::namedWindow("openglGrab");
cv::imshow("openglGrab",
img);
cv::waitKey();
//cv::imwrite(_str.c_str(),
img);
printf("opencv save opengl img done!
\n");
}
前一篇:matlab,一些问题
后一篇:openCV,一些问题