Bonjour,
Voici une video de présentation de l'utilisation de GLC_lib conjointement avec OpenCV pour la capture en temps réel de la vidéo d'une webcam projeté sur 64 rectangles dans une scène 3D.
@+
Laurent Ribon
Bonjour,
Voici une video de présentation de l'utilisation de GLC_lib conjointement avec OpenCV pour la capture en temps réel de la vidéo d'une webcam projeté sur 64 rectangles dans une scène 3D.
@+
Laurent Ribon
Tu veux pas mettre le code source histoire de voir comment tu as fais ?
Avec plaisir
J'utilise opencv 2.2.0 pour Mac et bien sur GLC_lib 2.1.0.
Le code de départ est basé sur l'exemple 7 fournie avec GLC_lib.
Le premier code que je présente n'est pas de moi, je l'ai juste adapté. il consisste à convertir une image opencv "IplImage" en une image Qt4 "QImage). le voici :
Le constructeur de la classe GLWidget :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 QImage GLWidget::IplImage2QImage(IplImage *iplImg) { int h = iplImg->height; int w = iplImg->width; int channels = iplImg->nChannels; QImage qimg(w, h, QImage::Format_ARGB32); char *data = iplImg->imageData; for (int y = 0; y < h; y++, data += iplImg->widthStep) { for (int x = 0; x < w; x++) { char r, g, b, a = 0; if (channels == 1) { r = data[x * channels]; g = data[x * channels]; b = data[x * channels]; } else if (channels == 3 || channels == 4) { r = data[x * channels + 2]; g = data[x * channels + 1]; b = data[x * channels]; } if (channels == 4) { a = data[x * channels + 3]; qimg.setPixel(x, y, qRgba(r, g, b, a)); } else { qimg.setPixel(x, y, qRgb(r, g, b)); } } } return qimg; }
La fonction de création de la scène :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 GLWidget::GLWidget(QWidget *p_parent) : QGLWidget(p_parent) , m_Light() , m_World() , m_GlView(this) , m_MoverController() , m_MotionTimer() , m_pCapture(NULL) , m_pTexturedMaterial(NULL) { m_Light.setPosition(1.0, 1.0, 1.0); QColor repColor; repColor.setRgbF(1.0, 0.11372, 0.11372, 1.0); m_MoverController= GLC_Factory::instance()->createDefaultMoverController(repColor, &m_GlView); m_GlView.cameraHandle()->setDefaultUpVector(glc::Z_AXIS); m_GlView.cameraHandle()->setIsoView(); // Create objects to display CreateScene(); connect(&m_MotionTimer, SIGNAL(timeout()), this, SLOT(updateTexture())); setAttribute(Qt::WA_AcceptTouchEvents, true); }
Et pour finir, la méthode de mise à jour de la texture utilisée par les rectangles.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 void GLWidget::CreateScene() { // Load Backfround image. m_GlView.loadBackGroundImage(":fond_exemple07.png"); // create a material with the specified texture // test OpenCV m_pCapture = cvCreateCameraCapture( -1 ); IplImage *iplImage; cvGrabFrame(m_pCapture); iplImage = cvRetrieveFrame(m_pCapture); const double h = static_cast<double>(iplImage->height); const double w = static_cast<double>(iplImage->width); QImage textureImage= IplImage2QImage(iplImage); GLC_Texture* pTexture= GLC_Factory::instance()->createTexture(textureImage); m_pTexturedMaterial= new GLC_Material(pTexture, ""); GLC_3DRep rep= GLC_Factory::instance()->createRectangle(w, h); rep.geomAt(0)->addMaterial(m_pTexturedMaterial); GLC_StructReference* pRef= new GLC_StructReference(); pRef->setRepresentation(rep); const int size= 8; for (int i= 0; i < size; ++i) { const double deltaX= static_cast<double>(i) * w + (w / 10.0); GLC_Matrix4x4 matrix1(deltaX, 0.0, 0.0); for (int j= 0; j < size; ++j) { const double deltaY= static_cast<double>(j) * h + (h / 10.0); GLC_Matrix4x4 matrix(GLC_Matrix4x4(0.0, deltaY, 0.0) * matrix1); GLC_StructInstance* pInstance= new GLC_StructInstance(pRef); pInstance->move(matrix); m_World.rootOccurence()->addChild(pInstance); } } m_MotionTimer.start(60); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 void GLWidget::updateTexture() { if ( NULL != m_pTexturedMaterial) { IplImage *iplImage; cvGrabFrame(m_pCapture); iplImage = cvRetrieveFrame(m_pCapture); QImage textureImage= IplImage2QImage(iplImage); GLC_Texture* pTexture= GLC_Factory::instance()->createTexture(textureImage); m_pTexturedMaterial->setTexture(pTexture); updateGL(); } }
@+
Laurent Ribon
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager