Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - cherault

Pages: [1]
1
Général / Re : Optimisation du code
« le: Juin 27, 2015, 03:29:50 pm »
Merci Laurent,

Oui tu as raison, je n'avais pas mis ta recommandation, mais c'est fait !  ;)
Ok, donc si tu considères que tu ne vois pas trop de problèmes majeurs...c'est super !

En tout cas merci pour ton aide.

Amitiés,

Chris,

2
Général / Optimisation du code
« le: Juin 27, 2015, 11:18:52 am »
Bonjour à tous,

Je viens de créer une début de jeu en réalité augmentée, avec la SFML et OpenCV.
L'ensemble tourne bien, mais j'aimerai savoir comment je peux améliorer mon code (Template, Fonctions, Classes), pour aller plus vite et ne pas utiliser inutilement de la mémoire.

Je vous joins le code:

///--HEADER C++--///
#include <string>
#include <sstream>
#include <iostream>

///--HEADER SFML--///
#include <SFML/Graphics.hpp>
#include <SFML/Graphics/Text.hpp>

///--HEADER OPENCV2--///
#include <opencv2/core/core.hpp>
#include <opencv2/video/video.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

///--FONCTION FLOAT -> STRING--///
std::string float2string(float f)
{
    std:: ostringstream os;
    os << f;
    return os.str();
}

int main()
{
    int L(640);
    int H(480);
    int Ep(2);
    float Radius(5.0f);

    int stepColor(0);

    sf::RenderWindow window(sf::VideoMode(L,H), "Flight Mode");
    cv::Mat frameRGB, frameRGBA;

    cv::VideoCapture cap(0);
    if(!cap.isOpened())
    {
        return 0;
    }

    ///--RECTANGLE CIBLE--///
    sf::RectangleShape cible(sf::Vector2f(50,50));
    cible.setPosition((L/2)+25,(H/2)+25);
    cible.setFillColor(sf::Color(0,0,0));

    ///--RETICULE CENTRAL--//
    sf::RectangleShape recH(sf::Vector2f(50,1));
    recH.setPosition(295,H/2);
    recH.setFillColor(sf::Color(0,0,0));

    sf::RectangleShape recW(sf::Vector2f(50,1));
    recW.setPosition(L/2,215);
    recW.setFillColor(sf::Color(0,0,0));
    recW.rotate(90);

    ///--BARRE GAUCHE--///
    sf::RectangleShape barG(sf::Vector2f(300,Ep));
    barG.setPosition(200,90);
    barG.setFillColor(sf::Color(0,255,0));
    barG.rotate(90);

    ///--BARRE DROITE--///
    sf::RectangleShape barD(sf::Vector2f(300,Ep));
    barD.setPosition(440,90);
    barD.setFillColor(sf::Color(0,255,0));
    barD.rotate(90);

    bool move = false;
    float zone(10.0f);
    int turbo(6);

    sf::Image image;
    sf::Texture texture;
    sf::Event event;
    sf::Sprite sprite;
    sf::Clock tickClock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    sf::Time TimePerFrame = sf::seconds(1.f / 60.f);
    sf::Time duration = sf::Time::Zero;

    sf::Font font;
    sf::Text myText;

    sf::Text coordX;
    sf::Text coordY;
    sf::Text coordZ;
    sf::Text coordPovX;
    sf::Text coordPovY;
    sf::Text coordText;

    ///--CHARGEMENT DE LA FONTE--///
    font.loadFromFile("Font/arial.ttf");

    while (window.isOpen())
    {
        cap >> frameRGB;

        if(frameRGB.empty())
        {
            break;
        }

        ///--OPENCV RECTANGLE--///
        cv::rectangle(frameRGB,cvPoint(300,220),cvPoint(340,260),CV_RGB(255,0,0),1,1);

        ///--AFFICHAGE TEXTE--///
        myText.setFont(font);
        myText.setString("Engaging target...");
        myText.setCharacterSize(12);
        myText.setColor(sf::Color::Green);
        myText.setStyle(sf::Text::Italic);
        myText.setPosition(10,5);

        cv::cvtColor(frameRGB, frameRGBA, cv::COLOR_BGR2RGBA);
        image.create(frameRGBA.cols, frameRGBA.rows, frameRGBA.ptr());

        ///--POSITION JOYSTICK--///
        float x = sf::Joystick::getAxisPosition(0, sf::Joystick::X);
        float y = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);
        float z = sf::Joystick::getAxisPosition(0, sf::Joystick::Z);

        float povx = sf::Joystick::getAxisPosition(0, sf::Joystick::PovX);
        float povy = sf::Joystick::getAxisPosition(0, sf::Joystick::PovY);

        ///--CONVERTIR FLOAT EN STRING--///
        std::string coordX = float2string(x);
        std::string coordY = float2string(y);
        std::string coordZ = float2string(z);

        std::string coordPovX = float2string(povx);
        std::string coordPovY = float2string(povy);

        ///--AFFICHE STRING DANS FENETRE--///
        std::ostringstream os;
        os << "X: " << coordX << std::endl << "Y: " << coordY << std::endl << "Z: " << coordZ << std::endl
           << std::endl << "Pov X: " << coordPovX << std::endl << "Pov Y: " << coordPovY << std::endl;

        ///--ROTATION CIBLE--///
        cible.setRotation(180);
        cible.rotate(x);

        ///--PARAMETRES D'AFFICHAGE DU STRING--///
        coordText.setString(os.str());
        coordText.setCharacterSize(12);
        coordText.setFont(font);
        coordText.setColor(sf::Color::Green);
        coordText.setPosition(10,25);

        ///--AFFICHE COORDONNEES JOYSTICK SI MOUVT--///
        if (event.type == sf::Event::JoystickMoved)
        {
            move = true;
            std::cout << "X axis: " << x << std::endl;
            std::cout << "Y axis: " << y << std::endl;
            std::cout << "Z axis: " << z << std::endl;
        }
        else
        {
            move = false;
        }

        timeSinceLastUpdate += tickClock.restart();

        ///--SI LE BOUTON 0 JOYSTICK EST PRESSE--///
        if (sf::Joystick::isButtonPressed(0,0))
        {
            cible.setFillColor(sf::Color(255,0,0));
        }

        ///--SI LE BOUTON 1 JOYSTICK EST PRESSE--///
        if (sf::Joystick::isButtonPressed(0,1))
        {
            int stepColor(15);
            cible.setFillColor(sf::Color(0,255,0));
        }

        ///--CHANGE COULEUR--///
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
            if (stepColor < 255)
            {
                stepColor += 5 ;
            }
            //cible.setFillColor(sf::Color(255,0,0,stepColor));
            recH.setFillColor(sf::Color(0,255,0,stepColor));
            recW.setFillColor(sf::Color(0,255,0,stepColor));
            barD.setFillColor(sf::Color(0,255,0,stepColor));
            barG.setFillColor(sf::Color(0,255,0,stepColor));
        }

        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
        {
            if (stepColor > 0)
            {
                stepColor -= 5 ;
            }
            //cible.setFillColor(sf::Color(255,0,0,stepColor));
            recH.setFillColor(sf::Color(0,255,0,stepColor));
            recW.setFillColor(sf::Color(0,255,0,stepColor));
            barD.setFillColor(sf::Color(0,255,0,stepColor));
            barG.setFillColor(sf::Color(0,255,0,stepColor));
        }

        while (timeSinceLastUpdate > TimePerFrame)
        {
            int stepColor(15);
            timeSinceLastUpdate -= TimePerFrame;

            /*
            if (x > zone || x < -zone || y > zone || y < -zone)
            {
                recH.move(turbo*x*TimePerFrame.asSeconds(), 0);
                recW.move(0, turbo*y*TimePerFrame.asSeconds());
                cible.move(turbo*x*TimePerFrame.asSeconds(), turbo*y*TimePerFrame.asSeconds());
            }
            */

        }

        if (!texture.loadFromImage(image))
        {
            break;
        }

        sprite.setTexture(texture);

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        ///--AFFICHE LES FORMES--///
        window.draw(sprite);

        ///--AFFICHE LE RETICULE--///
        window.draw(recW);
        window.draw(recH);
        window.draw(barG);
        window.draw(barD);

        ///--AFFICHE CIBLE--///
        //window.draw(cible);

        ///--AFFICHE LES TEXTES--///
        window.draw(myText);
        window.draw(coordText);

        ///--AFFICHE L'ENSEMBLE--///
        window.display();
        window.clear();
    }
    return 0;
}

 

Qu'en pensez-vous ?
Peut-on l'améliorer ?

Merci pour votre aide.

Amitiés,

Chris

3
Merci beaucoup pour ton conseil avisé.
Tu n'as que raison !!!

Merci encore.

Amitiés,

Chris.

4
Bonjour à tous,

J'ai un petit projet visant à créer un jeu en réalité augmenté.
J'ai donc interfacé SFML avec OPENCV et l'ensemble fonctionne très bien (Même si le code n'est pas optimisé).

Dans ma fenetre, j'ai des formes qui ont une couleur par défaut (Rouge par exemple).
J'aimerai, avec le clavier (Touche Up and Down) faire varier l'opacité de cette couleur graduellement (0-255), liée au coef. alpha.

J'ai donc créer une petite condition, mais elle ne fonctionne pas !!!

Voici la boucle:

///--CHANGE COULEUR--///
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
        {
            for (stepColor = 0; stepColor <= 255; stepColor+=5)
            {
                cible.setFillColor(sf::Color(255,0,0,stepColor));
            }
        }
 

la constante "stepColor" a été déclaré comme suit:

int stepColor(0);
 

Merci pour votre aide

Amitiés

Chris
Ou ais-je commis une erreur ?

5
MERCI !!!  ;)

C'est ce que je cherchais.
Merci beaucoup pour ton aide et ton efficacité !

Amitiés,

Chris

6
PS: la fonction float to string:
std::string float2string(float f)
{
    std:: ostringstream os;
    os << f;
    return os.str();
}
 

7
Merci G. pour ton aide.

Je continu de bloquer... :'( :'( :'(

Donc, je récupère les coordonnées du joystick comme ceci:
float x = sf::Joystick::getAxisPosition(0, sf::Joystick::X);
 float y = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);
 

ensuite, je convertis en chaine de caractère:
std::string coordX = float2string(x);
std::string coordY = float2string(y);
 

ma question est:
Comment l'afficher avec sf::Text coordX;
Quelle est la syntaxe exacte ???
J'ai essayé beaucoup de combinaisons sans succès !!!

J'ai un réel besoin d'aide pour une fonction "simpliste"...

Merci par avance.

Amitiés,

Chris

8
Petit oubli:

En fait, ce que je souhaite faire n'est pas convertir mes coordonnées en chaine de caractère en C++, ca je sais faire.
En revanche, ce que je ne sais pas, c'est quelle fonction de la SFML doit-on utiliser pour transformer mes coordonnées (x,y):

        float x = sf::Joystick::getAxisPosition(0, sf::Joystick::X);
        float y = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);
 

 en chaine de caractère, afin de l'afficher dans la fenetre "window", à chaque fois que les coordonnées changent.

Merci pour ton aide.

Amitiés,

Chris,

9
Bonjour Laurent,

Merci pour tes réponses.
Oui tu as raison ce n'est absolument pas optimisé, ni avec la SFML ni en C++
Je ne suis qu'un modeste électronicien qui se met à la prog...  ;D

Ok pour tes commentaires sur l'optimisation de la boucle, je vais modifier cela en conséquences.

En revanche, concernant mon problème, j'arrive à faire l'ensemble à taton...ca me prends beaucoup de temps étant débutant.
Mais je vais trouver...fonction par fonction.

L'intérêt que j'ai vu dans ce forum était la possibilité d'avoir des avis techniques bien sur, mais également de voir si des solutions "simples" existaient à mon problème.

Comment pourrais-tu convertir les coordonnées en chaine de caractère avec la SFML, pas en C++ ?

Merci pour ton aide précieuse.

Amitiés,

Chris.

10
Bonjour à tous,

J'ai un mini projet qui consiste à faire un peu de réalité augmenté.
Il s'agissait de lié la SFML à OpenCV en codant en C++ (Prototype, donc pas très propre)  ;D

J'ai donc la fenetre SFML qui affiche le flux d'une webcam, et sur lequel je rajoute un réticule piloté par un joystick.
L'ensemble fonctionne bien et est très fluide.

Ce qu'il me manque et que je ne sais pas faire est la chose suivante:

Comment avec la SFML je peux afficher en haut à gauche de la fenetre les coordonnées du réticule ?

Je vous donne donc le code complet:

#include <iostream>
#include <SFML/Graphics.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/video/video.hpp>
#include <SFML/Graphics/Text.hpp>

int main()
{
    sf::RenderWindow window(sf::VideoMode(640,480), "Video");
    cv::Mat frameRGB, frameRGBA;

    cv::VideoCapture cap(0);
    if(!cap.isOpened())
    {
        return 0;
    }

    sf::CircleShape cible;
    cible.setFillColor(sf::Color(255,0,0));
    cible.setRadius(5.0f);
    cible.setPosition(315,235);

    sf::RectangleShape recW(sf::Vector2f(640, 1));
    recW.setPosition(0,240);
    recW.setFillColor(sf::Color(255,0,0));

    sf::RectangleShape recH(sf::Vector2f(480, 1));
    recH.rotate(90);
    recH.setPosition(320,0);
    recH.setFillColor(sf::Color(255,0,0));

    bool move = false;
    float zone(10.0f);
    int turbo(6);

    sf::Image image;
    sf::Texture texture;
    sf::Event event;
    sf::Sprite sprite;
    sf::Clock tickClock;
    sf::Time timeSinceLastUpdate = sf::Time::Zero;
    sf::Time TimePerFrame = sf::seconds(1.f / 60.f);
    sf::Time duration = sf::Time::Zero;

    sf::Font font;
    sf::Text myText;

    while (window.isOpen())
    {
        cap >> frameRGB;

        if(frameRGB.empty())
        {
            break;
        }

        font.loadFromFile("Font/arial.ttf");

        myText.setFont(font);
        myText.setString("Coordonnées: ");
        myText.setCharacterSize(12);
        myText.setColor(sf::Color::Blue);
        myText.setStyle(sf::Text::Bold);

        cv::cvtColor(frameRGB, frameRGBA, cv::COLOR_BGR2RGBA);
        image.create(frameRGBA.cols, frameRGBA.rows, frameRGBA.ptr());

        float x = sf::Joystick::getAxisPosition(0, sf::Joystick::X);
        float y = sf::Joystick::getAxisPosition(0, sf::Joystick::Y);

        if (event.type == sf::Event::JoystickMoved)
        {
            move = true;
            std::cout << "X axis: " << x <<std::endl;
            std::cout << "Y axis: " << y << std::endl;
        }
        else
        {
            move = false;
        }

        timeSinceLastUpdate += tickClock.restart();

        if (sf::Joystick::isButtonPressed(0,1))
        {
            cible.setFillColor(sf::Color(0,255,0));
        }

        while (timeSinceLastUpdate > TimePerFrame)
        {
            timeSinceLastUpdate -= TimePerFrame;

            if (x > zone || x < -zone || y > zone || y < -zone)
            {
                recH.move(turbo*x*TimePerFrame.asSeconds(), 0);
                recW.move(0, turbo*y*TimePerFrame.asSeconds());
                cible.move(turbo*x*TimePerFrame.asSeconds(), turbo*y*TimePerFrame.asSeconds());
            }
        }

        if (!texture.loadFromImage(image))
        {
            break;
        }

        sprite.setTexture(texture);

        while (window.pollEvent(event))
        {
            if (event.type == sf::Event::Closed)
                window.close();
        }

        window.draw(sprite);
        window.draw(cible);
        window.draw(recW);
        window.draw(recH);
        window.draw(myText);
        window.display();
    }
    return 0;
}
 

Pouvez-vous m'aider ?

En vous remerciant pour votre aide sur le sujet.

Amitiés,

 Chris

Pages: [1]