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)
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