Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

std::thread & imshow() - no windows created

Hi dears,

First of all, thanks for your time :).

I'm trying to create thread (yes I know, multi-thread is bad however I'd like to experiment) in which I would display an image.

I have read OpenCV doesn't handle very much the threading and for some people, the window creation has to be done in main thread. So that's what I did.

int main(int argc, const char * argv[]) {

    bool success(true), ihm_run(true);

    Drone_Controller drone;
    Vision_Manager vision(drone);

    success = drone.connect();
    if (!success)
        return EXIT_FAILURE;

    cv::namedWindow("Display & Command", CV_WINDOW_AUTOSIZE);

    drone.enable_video_stream();
    vision.ihm_start(&ihm_run);

    while (ihm_run)
    {
        if (ihm.get_key_pressed == 27)
        {
            ihm_run = false;
        }
    }
    vision.stop_ihm();
}

Now I have a class named Vision_manager with the following vision_manager.h :

class Vision_Manager {

public:

/* ------ CONSTRUCTEUR & DESTRUCTEUR ------ */
Vision_Manager(Drone_Controller& drone);
~Vision_Manager();

/* ------ FONCTIONS MEMBRES UTILISABLES DANS LE MAIN ------ */
void video_controls(); //Affiche la vidéo et récupère les entrées clavier
char get_key_pressed();
void ihm_start(bool *m_IHMRun);
void ihm_stop();

private:

/* ------ ATTRIBUTS ------ */
Drone_Controller& m_drone;
cv::Mat m_picture_rgb;
char m_key_pressed;

bool *m_IHMRun;

//Déclaration du thread utilisé pour l'ihm
std::thread m_ihm_thread;
};

and vision_manager.c :

#include "vision_manager.hpp"

Vision_Manager::Vision_Manager(Drone_Controller& drone) : m_drone(drone)
{

}

Vision_Manager::~Vision_Manager()
{
    cv::destroyAllWindows();
}

void Vision_Manager::ihm_start(bool *IHMRun)
{
    m_ihm_thread = std::thread(&Vision_Manager::video_controls, this);
    //&Vision_Manager::video_controls, this, N

    m_IHMRun = IHMRun;
}

void Vision_Manager::ihm_stop()
{
    m_ihm_thread.join();

    std::cout << "Jointure effectuée" << std::endl;
}

void Vision_Manager::video_controls()
{
    int picture_nb;

    //Créationde la fenêtre
    //cv::namedWindow("Affichage & Commandes", CV_WINDOW_AUTOSIZE);

    picture_nb = m_drone.get_picture_nb();

    while (*m_IHMRun == true)
    {
        // Si l'initialitasion du stream n'a pas plantée et que l'image qu'on récupère est différente de celle d'avant
        if (m_drone.get_picture_nb() != picture_nb)
        {
            // On récupère l'image
            m_picture_rgb = m_drone.get_picture();
            picture_nb = m_drone.get_picture_nb();

            // Test si l'image a bien été récupérée
            if (m_picture_rgb.empty())
            {
                //Si elle est vide ça ne sert à rien (typiquement en début de programme)
                std::cout << "Image vide \n";
            }
            else
            {
                //Affichage de l'image avec le niveau de batterie
                cv::imshow("Affichage & Commandes", m_picture_rgb);
                std::cout << "ImShow OpenCV" << std::endl;
            }
        }

        m_key_pressed = cv::waitKey(50);
    }

    cv::destroyWindow("Affichage & Commandes");
}

char Vision_Manager::get_key_pressed()
{
    return m_key_pressed;
}

Everything is compiling and the thread is created as I see the prompts. However I do not have any window.

Does anyone know ?

Thanks again for your help :).