C++ 将OpenCV-CV转换为-CV2-Code

C++ 将OpenCV-CV转换为-CV2-Code,c++,pointers,opencv,opengl,C++,Pointers,Opencv,Opengl,我正在尝试将我在互联网上找到的OpenCV代码样本从旧的IplImage格式转换为当前使用的Mat格式,但我对指针/类的正确使用缺乏经验,希望有人能帮助我转换这几行代码。该代码主要用于初始化网络摄像头,抓取帧并通过OpenGL显示它们 上述困难代码: CvCapture *cvCapture = 0; cvCapture = cvCreateCameraCapture(0); IplImage* newImage = cvQueryFrame( cvCapture ); cvReleaseCap

我正在尝试将我在互联网上找到的OpenCV代码样本从旧的IplImage格式转换为当前使用的Mat格式,但我对指针/类的正确使用缺乏经验,希望有人能帮助我转换这几行代码。该代码主要用于初始化网络摄像头,抓取帧并通过OpenGL显示它们

上述困难代码:

CvCapture *cvCapture = 0;
cvCapture = cvCreateCameraCapture(0);
IplImage* newImage = cvQueryFrame( cvCapture );
cvReleaseCapture( &cvCapture );
我试过:

cv::VideoCapture *cvCapture = 0;
cvCapture.open(0);
cvCapture.read(cv:Mat& newImage);
cvCapture.release;
原始代码:

#ifdef WIN32
#include <windows.h>
#endif

#include <stdio.h>
#include <gl/glew.h>
#include <gl/glut.h>

#include <opencv/highgui.h>

//-----------------------------------------------------------------------------


//-----------------------------------------------------------------------------
// GLUT callbacks and functions

void initGlut(int argc, char **argv);
void displayFunc(void);
void idleFunc(void);
void reshapeFunc(int width, int height);
void mouseFunc(int button, int state, int x, int y);
void mouseMotionFunc(int x, int y);
void keyboardFunc(unsigned char key, int x, int y);
void specialFunc(int key, int x, int y);
//-----------------------------------------------------------------------------

// other [OpenGL] functions
void countFrames(void);
void renderBitmapString(float x, float y, float z, void *font, char *string);

//-----------------------------------------------------------------------------

bool bFullsreen = false;
int nWindowID;

//-----------------------------------------------------------------------------

// parameters for the framecounter
char pixelstring[30];
int cframe = 0;
int time = 0;
int timebase = 0;

//-----------------------------------------------------------------------------

// OpenCV variables

CvCapture *cvCapture = 0;

GLuint cameraImageTextureID;

//-----------------------------------------------------------------------------

bool bInit = false;

//-----------------------------------------------------------------------------

void displayFunc(void) {

if(!bInit) {

    // initialize 1st camera on the bus
    cvCapture = cvCreateCameraCapture(0);

    // initialze OpenGL texture     
    glEnable(GL_TEXTURE_RECTANGLE_ARB);

    glGenTextures(1, &cameraImageTextureID);
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, cameraImageTextureID);

    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    bInit = true;
}

IplImage* newImage = cvQueryFrame( cvCapture );

if( (newImage->width > 0) && (newImage->height > 0)) {

    // clear the buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glEnable(GL_TEXTURE_RECTANGLE_ARB);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,(GLdouble)newImage->width,0.0,(GLdouble)newImage->height);   

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, cameraImageTextureID);

    if(newImage->nChannels == 3)
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, newImage->width, newImage->height, 0,
GL_BGR, GL_UNSIGNED_BYTE, newImage->imageData);
    else if(newImage->nChannels == 4)
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, newImage->width, newImage->height,
0, GL_BGRA, GL_UNSIGNED_BYTE, newImage->imageData);

    glBegin(GL_QUADS);
        glTexCoord2i(0,0);
        glVertex2i(0,0);
        glTexCoord2i(newImage->width,0);
        glVertex2i(newImage->width,0);
        glTexCoord2i(newImage->width,newImage->height);
        glVertex2i(newImage->width,newImage->height);
        glTexCoord2i(0,newImage->height);
        glVertex2i(0,newImage->height);
    glEnd();

}

glDisable(GL_TEXTURE_RECTANGLE_ARB);

countFrames();

glutSwapBuffers();
}

//-----------------------------------------------------------------------------

void initGlut(int argc, char **argv) {

// GLUT Window Initialization:
glutInit (&argc, argv);
glutInitWindowSize (640, 480);
glutInitWindowPosition(300, 100);
glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
nWindowID = glutCreateWindow ("simpleGLUT - CvCamera");

// Register callbacks:
glutDisplayFunc     (displayFunc);
glutReshapeFunc     (reshapeFunc);              
glutKeyboardFunc    (keyboardFunc);
glutSpecialFunc     (specialFunc);
glutMouseFunc       (mouseFunc);
glutMotionFunc      (mouseMotionFunc);
glutIdleFunc        (idleFunc);
}



//-----------------------------------------------------------------------------

void idleFunc(void) {
glutPostRedisplay();
}

//-----------------------------------------------------------------------------

void reshapeFunc(int width, int height) {
glViewport(0, 0, width, height);
}

//-----------------------------------------------------------------------------


// mouse callback
void mouseFunc(int button, int state, int x, int y) {

}

//-----------------------------------------------------------------------------

void mouseMotionFunc(int x, int y) {

}

//-----------------------------------------------------------------------------

void keyboardFunc(unsigned char key, int x, int y) {

switch(key) {

    // -----------------------------------------

#ifdef WIN32
    // exit on escape
    case '\033':

        if(bInit) {
            glDeleteTextures(1, &cameraImageTextureID);
            cvReleaseCapture( &cvCapture );
        }
        exit(0);
        break;
#endif

    // -----------------------------------------

        // switch to fullscreen
    case 'f':

        bFullsreen = !bFullsreen;
        if(bFullsreen) 
            glutFullScreen();
        else {
            glutSetWindow(nWindowID);
            glutPositionWindow(100, 100);
            glutReshapeWindow(640, 480);
        }
        break;

    // -----------------------------------------
}
}

//-----------------------------------------------------------------------------

void specialFunc(int key, int x, int y) {
//printf("key pressed: %d\n", key);
}

//-----------------------------------------------------------------------------

void countFrames(void)  {

time=glutGet(GLUT_ELAPSED_TIME);
cframe++;
if (time - timebase > 50) {
    sprintf(pixelstring, "fps: %4.2f", cframe*1000.0/(time-timebase));      
    timebase = time;
    cframe = 0;
// Draw status text and uni-logo:
} 
glDisable(GL_LIGHTING);
glColor4f(1.0,1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0, 200, 0, 200);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

// render the string
renderBitmapString(5,5,0.0,GLUT_BITMAP_HELVETICA_10,pixelstring);

glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}

//-----------------------------------------------------------------------------

void renderBitmapString(float x, float y, float z, void *font, char *string) {
char *c;
glRasterPos3f(x, y,z);
for (c=string; *c != '\0'; c++) {
glutBitmapCharacter(font, *c);
}
}

//-----------------------------------------------------------------------------


void main(int argc, char **argv) {

initGlut(argc, argv);
glutMainLoop();

}
#ifdef WIN32
#包括
#恩迪夫
#包括
#包括
#包括
#包括
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
//GLUT回调和函数
void initGlut(int argc,字符**argv);
void displayFunc(void);
void idleFunc(void);
空洞形状(整型宽度、整型高度);
void mouseFunc(int按钮、int状态、int x、int y);
void mouseMotionFunc(int x,int y);
void keyboardFunc(无符号字符键,整数x,整数y);
void specialFunc(整数键,整数x,整数y);
//-----------------------------------------------------------------------------
//其他[OpenGL]函数
void countFrames(void);
void renderBitmapString(float x、float y、float z、void*字体、char*字符串);
//-----------------------------------------------------------------------------
bool bFullsreen=假;
int nWindowID;
//-----------------------------------------------------------------------------
//帧计数器的参数
字符像素串[30];
int cframe=0;
整数时间=0;
int时基=0;
//-----------------------------------------------------------------------------
//OpenCV变量
CvCapture*CvCapture=0;
GLuint cameraImageTextureID;
//-----------------------------------------------------------------------------
bool-bInit=false;
//-----------------------------------------------------------------------------
void displayFunc(void){
如果(!bInit){
//初始化总线上的第一个摄像头
cvCapture=cvCreateCameraCapture(0);
//初始化OpenGL纹理
glEnable(GL_纹理_矩形_ARB);
glGenTextures(1和cameraImageTextureID);
glBindTexture(GL_纹理_矩形_ARB,cameraImageTextureID);
glTexParameterf(GL\u纹理\u矩形\u ARB、GL\u纹理\u包裹\u S、GL\u夹紧\u至\u边缘);
glTexParameterf(GL\u纹理\u矩形\u ARB、GL\u纹理\u包裹\u T、GL\u夹紧\u到边);
glTexParameterf(GL\u纹理\u矩形\u ARB,GL\u纹理\u最小\u过滤器,GL\u线性);
glTexParameterf(GL_纹理、矩形、GL_纹理、MAG_过滤器、GL_线性);
glTexEnvf(GL_纹理_环境,GL_纹理_环境模式,GL_替换);
bInit=true;
}
IplImage*newImage=cvQueryFrame(cvCapture);
如果((新图像->宽度>0)和(&(新图像->高度>0)){
//清除缓冲区
glClear(GL_颜色_缓冲_位| GL_深度_缓冲_位);
glDisable(GLU深度测试);
glDisable(GLU照明);
glEnable(GL_纹理_矩形_ARB);
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,(GLdouble)新图像->宽度,0.0,(GLdouble)新图像->高度);
glMatrixMode(GLU模型视图);
glLoadIdentity();
glBindTexture(GL_纹理_矩形_ARB,cameraImageTextureID);
如果(新建图像->通道==3)
glTexImage2D(GL_纹理_矩形_ARB,0,GL_RGB,新图像->宽度,新图像->高度,0,
GL_BGR,GL_无符号字节,newImage->imageData);
else if(newImage->nChannels==4)
glTexImage2D(GL_纹理_矩形_ARB,0,GL_RGBA,新图像->宽度,新图像->高度,
0,GL_BGRA,GL_无符号字节,newImage->imageData);
glBegin(GL_QUADS);
glTexCoord2i(0,0);
glVertex2i(0,0);
glTexCoord2i(新图像->宽度,0);
glVertex2i(新图像->宽度,0);
glTexCoord2i(新图像->宽度,新图像->高度);
glVertex2i(新图像->宽度,新图像->高度);
glTexCoord2i(0,新图像->高度);
glVertex2i(0,新图像->高度);
格伦德();
}
glDisable(GL_纹理_矩形_ARB);
countFrames();
glutSwapBuffers();
}
//-----------------------------------------------------------------------------
void initGlut(int argc,char**argv){
//GLUT窗口初始化:
glutInit(&argc,argv);
GLUTINITWindowsSize(640480);
位置(300100);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_深度);
nWindowID=glutCreateWindow(“simpleGLUT-CvCamera”);
//注册回调:
glutDisplayFunc(显示函数);
GLUTEFUNC(重塑EFUNC);
glutKeyboardFunc(键盘Func);
glutSpecialFunc(specialFunc);
glutMouseFunc(mouseFunc);
glutMotionFunc(mouseMotionFunc);
glutIdleFunc(idleFunc);
}
//-----------------------------------------------------------------------------
void idleFunc(void){
再发现();
}
//-----------------------------------------------------------------------------
空心形状(整型宽度、整型高度){
glViewport(0,0,宽度,高度);
}
//-----------------------------------------------------------------------------
//鼠标回调
void mouseFunc(int按钮、int状态、int x、int y){
}
//-----------------------------------------------------------------------------
void mouseMotionFunc(整数x,整数y){
}
//-----------------------------------------------------------------------------
void keyboardFunc(无符号字符键,整数x,整数y){
开关(钥匙){
// -----------------------------------------
#ifdef WIN32
//逃生出口
案例“\033”:
如果(bInit){
glDeleteTextures(1和cameraImageTextureID);
cvReleaseCapture(&cvCapture);
}
出口(0);
打破
#恩迪夫
// -----------------------------------------
//切换到全屏
案例“f”:
bFullsreen=!bFullsreen;
如果(bFullsreen)
全屏显示();
否则{
glutSetWindow(nWindowID);
窗口(100100);
GLUTREVEREWINDOW(640480);
}
打破
// -----------------------------------------
}
}
//-----------------------------------------------
#ifdef WIN32
#include <windows.h>
#endif

#include <stdio.h>
#include <gl/glew.h>
#include <gl/glut.h>

#include <opencv/highgui.h>
#include <opencv2\highgui.hpp>
#include <opencv2\core.hpp>

//-----------------------------------------------------------------------------
// GLUT callbacks and functions

void initGlut(int argc, char **argv);
void displayFunc(void);
void idleFunc(void);
void reshapeFunc(int width, int height);
void mouseFunc(int button, int state, int x, int y);
void mouseMotionFunc(int x, int y);
void keyboardFunc(unsigned char key, int x, int y);
void specialFunc(int key, int x, int y);
//-----------------------------------------------------------------------------

// other [OpenGL] functions
void countFrames(void);
void renderBitmapString(float x, float y, float z, void *font, char *string);

//-----------------------------------------------------------------------------

bool bFullsreen = false;
int nWindowID;

//-----------------------------------------------------------------------------

// parameters for the framecounter
char pixelstring[30];
int cframe = 0;
int time = 0;
int timebase = 0;

//-----------------------------------------------------------------------------

// OpenCV variables

cv::VideoCapture cap(0);

GLuint cameraImageTextureID;

//-----------------------------------------------------------------------------

bool bInit = false;

//-----------------------------------------------------------------------------

void displayFunc(void) {

if(!bInit) {

    // initialize 1st camera on the bus

    // initialze OpenGL texture     
    glEnable(GL_TEXTURE_RECTANGLE_ARB);

    glGenTextures(1, &cameraImageTextureID);
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, cameraImageTextureID);                      

    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

    bInit = true;
}
cv::Mat newImage;
cap.read(newImage);


int rows = newImage.rows;
int cols = newImage.cols;
cv::Size s = newImage.size();
rows = s.height;
cols = s.width;

if( (s.width > 0) && (s.height > 0)) {

    // clear the buffers
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glDisable(GL_DEPTH_TEST);
    glDisable(GL_LIGHTING);
    glEnable(GL_TEXTURE_RECTANGLE_ARB);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0,(GLdouble)s.width,0.0,(GLdouble)s.height);   

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, cameraImageTextureID);

    if(newImage.channels() == 3)
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB, s.width, s.height, 0, GL_BGR,
GL_UNSIGNED_BYTE, newImage.data);
    else if(newImage.channels() == 4)
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA, s.width, s.height, 0, GL_BGRA, 
GL_UNSIGNED_BYTE, newImage.data);

    glBegin(GL_QUADS);
        glTexCoord2i(0,0);
        glVertex2i(0,0);
        glTexCoord2i(s.width,0);
        glVertex2i(s.width,0);
        glTexCoord2i(s.width,s.height);
        glVertex2i(s.width,s.height);
        glTexCoord2i(0,s.height);
        glVertex2i(0,s.height);
    glEnd();

}

glDisable(GL_TEXTURE_RECTANGLE_ARB);

countFrames();

glutSwapBuffers();
}


void idleFunc(void) {
glutPostRedisplay();
}

void reshapeFunc(int width, int height) {
glViewport(0, 0, width, height);
}

void mouseFunc(int button, int state, int x, int y) {

}

void mouseMotionFunc(int x, int y) {

}

void keyboardFunc(unsigned char key, int x, int y) {

switch(key) {

    // exit on escape
    case '\033':

        if(bInit) {
            glDeleteTextures(1, &cameraImageTextureID);
            cap.release();
        }
        exit(0);
        break;

    // switch to fullscreen
    case 'f':

        bFullsreen = !bFullsreen;
        if(bFullsreen) 
            glutFullScreen();
        else {
            glutSetWindow(nWindowID);
            glutPositionWindow(100, 100);
            glutReshapeWindow(640, 480);
        }
        break;
}
}

void specialFunc(int key, int x, int y) {
//printf("key pressed: %d\n", key);
}

void countFrames(void)  {

time=glutGet(GLUT_ELAPSED_TIME);
cframe++;
if (time - timebase > 50) {
    sprintf(pixelstring, "fps: %4.2f", cframe*1000.0/(time-timebase));      
    timebase = time;
    cframe = 0;
// Draw status text and uni-logo:
} 
glDisable(GL_LIGHTING);
glColor4f(1.0,1.0,1.0,1.0);
glMatrixMode(GL_PROJECTION);
    glPushMatrix();
    glLoadIdentity();
    gluOrtho2D(0, 200, 0, 200);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();

// render the string
renderBitmapString(5,5,0.0,GLUT_BITMAP_HELVETICA_10,pixelstring);

glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
}

void renderBitmapString(float x, float y, float z, void *font, char *string) {
char *c;
glRasterPos3f(x, y,z);
for (c=string; *c != '\0'; c++) {
glutBitmapCharacter(font, *c);
}
}

void main(int argc, char **argv) {

glutInit (&argc, argv);
glutInitWindowSize (640, 480);
glutInitWindowPosition(300, 100);
glutInitDisplayMode ( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
nWindowID = glutCreateWindow ("simpleGLUT - CvCamera");

// Register callbacks:
glutDisplayFunc     (displayFunc);
glutReshapeFunc     (reshapeFunc);              
glutKeyboardFunc    (keyboardFunc);
glutSpecialFunc     (specialFunc);
glutMouseFunc       (mouseFunc);
glutMotionFunc      (mouseMotionFunc);
glutIdleFunc        (idleFunc);


glutMainLoop();

}