Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Afficher des coordonnées d'un point dans la fenetre - RESOLUE !  (Lu 4936 fois)

0 Membres et 1 Invité sur ce sujet

cherault

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
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
« Modifié: Juin 21, 2015, 08:10:01 am par cherault »

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #1 le: Juin 20, 2015, 09:11:40 am »
Citer
L'ensemble fonctionne bien et est très fluide.
Tu as un très bon PC alors, parce que ton code est très inefficace :P

1. Tu charges la police de caractères à chaque tour de boucle, pourquoi faire ?
2. image.create + texture.loadFromImage, c'est très lent, ce que tu veux c'est texture.update

Et sinon pour répondre à ta question, si j'ai bien compris il te manque juste la conversion de tes coordonnées en chaîne de caractère pour les mettre dans myText. Bizarre que tu aies réussi à faire tout le reste et pas ça :P bref Google saura répondre à cette question triviale de C++.
Laurent Gomila - SFML developer

cherault

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #2 le: Juin 20, 2015, 09:22:12 am »
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.

cherault

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #3 le: Juin 20, 2015, 09:34:13 am »
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,

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #4 le: Juin 20, 2015, 10:40:35 am »
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) en chaine de caractère
??????
Ben la même. (si en fait tu sais pas, google devrait donner des résultats sur "C++ convertir float string")
Si les coordonnées changent, bah tu les reconvertis et tu les remets dans ton sf::Text avec setString. ;)

Pourquoi tu voudrais pas "utiliser C++" ?
Si tu trouves que c'est pas une solution simple faudra montrer comment tu fais car c'est simple normalement. :p
« Modifié: Juin 20, 2015, 10:44:03 am par G. »

cherault

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #5 le: Juin 20, 2015, 11:09:01 am »
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

cherault

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #6 le: Juin 20, 2015, 11:10:44 am »
PS: la fonction float to string:
std::string float2string(float f)
{
    std:: ostringstream os;
    os << f;
    return os.str();
}
 

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #7 le: Juin 20, 2015, 11:25:52 am »
Tu peux concaténer (mettre bout à bout) des std::string avec +
Par ex :
std::string coords = coordX + " " + coordY;
coordText.setString(coords);


Sinon tu peux utiliser l'ostringstream pour mettre en forme directement.
Par ex :
std::ostringstream os;
os << coordX << " " << coordY;
coordText.setString(os.str());

Y'a aussi la récente fonction to_string pour convertir un truc en string.
« Modifié: Juin 20, 2015, 11:28:58 am par G. »

cherault

  • Newbie
  • *
  • Messages: 10
    • Voir le profil
Re : Afficher des coordonnées d'un point dans la fenetre
« Réponse #8 le: Juin 20, 2015, 11:28:25 am »
MERCI !!!  ;)

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

Amitiés,

Chris

 

anything