我使用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显示捕获的帧?
谢谢!
在我的工作中,我将捕获的帧的一部分与图像重叠.我用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) 我想用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窗口上)从网络摄像头捕获的帧,我没有问题.我还注意到,如果我在角落处使用相同的图像没有数字,它可以正常工作(即使它不在标记的相同位置/坐标).
有谁有想法吗?