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
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,
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
PS: la fonction float to string:
std::string float2string(float f)
{
std:: ostringstream os;
os << f;
return os.str();
}
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 (http://en.cppreference.com/w/cpp/string/basic_string/to_string) pour convertir un truc en string.