实现opengl截取窗口图像到内存,然后用cv处理

来源:互联网 发布:idp诺思留学知乎 编辑:程序博客网 时间:2024/06/07 23:56
目前想实现opengl截取窗口图像到内存,然后用cv处理,所以需要用cv从内存把图像再取出来。可是一直是灰色的,代码稍作改动后会变成黑色加乱码
直接附上部分转换代码:
GLint iViewport[4] = { 0 };
glGetIntegerv(GL_VIEWPORT_BIT, iViewport);// 获取视图大小
GLubyte* buffer = (GLubyte*)malloc(iViewport[2] * iViewport[3] * sizeof(GLubyte)* 3);   //开辟内存
 //读gl的屏幕像素点到内存
glReadPixels(iViewport[0], iViewport[1], iViewport[2], iViewport[3], GL_RGB, GL_UNSIGNED_BYTE, buffer); 
//将图像保存到IplImage中;
IplImage* model2DImg = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);    
//复制地址,所以最后不能free(buffer);
model2DImg->imageData = (char*)buffer;
cvNamedWindow("result", 1);  
cvShowImage("result", model2DImg);
//cvWaitKey();      //等待响应时间10ms;
cvReleaseImage(&model2DImg);
free(buffer);
glutMainLoop();//循环
return(0);
        运行结果是一个是本程序显示的模型窗口,另一个是由cvshowimage从内存中显示出来的图像,但是后者一直是灰色的,不知道是glreadpixels读的格式问题还是IpIImage这里开始的问题,总之就是想找到opengl到opencv的接口,实现GL窗口图像到CV窗口的传输,然后用CV进行图像处理;最后的free和释放问题我也试过了,有没有都好像无所谓,就是传不过来图像一片灰。

        到底是glread没存到内存中还是cv没读出来呢?希望大大们告知一下,或者有没有更好的方法?


方法:

IplImage* model2DImg = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 3);

最后就是要加个cvFlip(model2DImg, NULL, 0);  
因为gl和cv在Y轴上颠倒

阅读全文
0 0
原创粉丝点击