小编Cri*_*986的帖子

用OpenCV打开webcamera并用QLabel - 白色窗口显示它

我使用OpenCV和Qt Libraries以及VS 2010在Win7 x64上工作.

我想用OpenCV打开我的相机然后用Qt显示捕获的帧,例如使用QLabel,从Mat转换为QImage.

我想这样做是因为使用函数imshow("camera",image)和waitKey()减慢了流式摄像机的速度.

这是我的代码:

int main () {
 QApplication a(argc, argv);
 QLabel myLabel;
 VideoCapture cap(0);
 //namedWindow(c"camera", 1);

 for (;;) {

    cap >> image;
        //conversion from Mat to QImage
    Mat dest;
    cvtColor(image, dest,CV_BGR2RGB);
    QImage image1= QImage((uchar*) dest.data, dest.cols, dest.rows, dest.step, QImage::Format_RGB888);

        //show Qimage using QLabel
    myLabel.setPixmap(QPixmap::fromImage(image1));
    myLabel.show();
    //imshow("camera",image);
    //if (waitKey(30)>= 0)  break;
 }
return a.exec();
}   
Run Code Online (Sandbox Code Playgroud)

网络摄像头打开正常并且可以正常工作,但是我看到一个白色的窗口而不是捕获的帧,正如您在此图像中看到的那样 在此输入图像描述

如果我取消注释:namedWindow (..), imshow(..), if(waitKey(..),它可以工作(我看到两个窗口具有相同的图像),但我用OpenCV显示捕获的帧,这是我想要避免的.

我的问题是:我错了什么?我不知道,从Mat到Qimage的转换是错误的??或者,我不能只用Qt显示捕获的帧?

谢谢!

c++ qt opencv video-capture qlabel

6
推荐指数
1
解决办法
2万
查看次数

使用opengl和Antialiasing投影图像

在我的工作中,我将捕获的帧的一部分与图像重叠.我用openCV打开网络摄像头,然后在纹理中转换捕获的帧并在GLUT窗口中显示它.此外,我将此纹理的一部分与此图像重叠:

在此输入图像描述

我是实时做的,结果是:

在此输入图像描述

如您所见,投影图像的边缘不准确.我认为这是一个别名问题,但我不知道如何使用opengl进行抗锯齿处理.我试图在网上寻找,但我找不到解决问题的好方法.

在我的"计算"功能中,我将mat图像转换为纹理,使用以下代码:

GLvoid calculate(){
...
...
cvtColor(image, image, CV_BGR2RGB);
    glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glBindTexture(GL_TEXTURE_2D, textures[1]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
    //glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);
    gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, image.cols, image.rows, GL_RGB, GL_UNSIGNED_BYTE, image.data);
}
Run Code Online (Sandbox Code Playgroud)

并使用此代码显示结果:

GLvoid Show(void) {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);

    // Matrice di proiezione
    glMatrixMode (GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, WIDTH, HEIGHT, 0); 

    // Matrice model view
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 
...
...
glBindTexture(GL_TEXTURE_2D, textures[1]);
        glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)((coord[3].x)),(GLfloat)(coord[3].y));
        glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)((coord[0].x)),(GLfloat)(coord[0].y));
        glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)((coord[1].x)),(GLfloat)(coord[1].y));
        glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)((coord[2].x)),(GLfloat)(coord[2].y)); 

        glEnd();    
    }
    glFlush();
    glutSwapBuffers();

} …
Run Code Online (Sandbox Code Playgroud)

c++ opengl antialiasing

5
推荐指数
1
解决办法
986
查看次数

OpenGL纹理没有正确显示 - 奇怪的行为

我想用OpenCV检测一个标记,然后我想用OpenGL将它与图像重叠.第一部分是好的(我完美地实现了检测标记),但我对第二部分有一些问题.

标记是:

在此输入图像描述

和图像是:

在此输入图像描述

但结果如下:

在此输入图像描述

生成图像纹理的代码是:

GLuint *textures = new GLuint[2];
glGenTextures(2, textures);
Mat image = imread("Immagine.png");
glBindTexture(GL_TEXTURE_2D, textures[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 4,image.cols, image.rows, 0, GL_RGB,GL_UNSIGNED_BYTE, image.data);
Run Code Online (Sandbox Code Playgroud)

并显示我使用的纹理:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0, WIDTH, HEIGHT, 0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glBindTexture(GL_TEXTURE_2D, textures[1]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex2f((GLfloat)(coord[1].x),(GLfloat)(coord[1].y));
glTexCoord2f(1.0f, 0.0f); glVertex2f((GLfloat)(coord[2].x),(GLfloat)(coord[2].y));
glTexCoord2f(1.0f, 1.0f); glVertex2f((GLfloat)(coord[3].x),(GLfloat)(coord[3].y));
glTexCoord2f(0.0f, 1.0f); glVertex2f((GLfloat)(coord[0].x),(GLfloat)(coord[0].y)); 
glEnd();
Run Code Online (Sandbox Code Playgroud)

我不知道为什么纹理图像是如此奇怪.此外,我使用相同的代码来显示(在opengl窗口上)从网络摄像头捕获的帧,我没有问题.我还注意到,如果我在角落处使用相同的图像没有数字,它可以正常工作(即使它不在标记的相同位置/坐标).

有谁有想法吗?

c++ opengl opencv texture2d

4
推荐指数
1
解决办法
556
查看次数

标签 统计

c++ ×3

opencv ×2

opengl ×2

antialiasing ×1

qlabel ×1

qt ×1

texture2d ×1

video-capture ×1