c ++ - GTK + flytende vindue baseret på ansigtsdetekteringskoordinater

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har et program her, der udfører ansigtsdetektering, og jeg vil gerne bruge disse koordinater til at flytte et vindue oprettet med GTK + 3.22 ved hjælp af GTK s
gtk\_window\_move funktion. Jeg vil gerne have vinduet åbent hele tiden, mens det bevæger sig ligner OpenCVs moveWindow-funktion.


Jeg har lige downloadet GTK + -pakkerne i går, så jeg er ikke alt for bekendt.


Programmet vil udføre en loop 100 gange og spore et ansigt hele tiden. I øjeblikket fungerer ansigtssporing, men vinduet vises ikke, før sløjfen er færdig. Hvorfor er det? Jeg tror funktionen gtk\_move\_window virker, men vinduet forbliver ikke åbent. Jeg har forsøgt at genåbne vinduet hver gang i løkken, eller bare åbne en gang før løkken. Hvis du er bekendt med OpenCVs moveWindow-funktion, er det præcis det, jeg leder efter. Her er prøvekode.


Forresten, hvis du ved, hvordan en GTK + -funktion, der bringer vinduet til det allerbedste lag oven på alle de andre vinduer, der åbnes, når det kaldes, er det også nyttige oplysninger til mig.


#include "FlyCapture2.h"
#include <opencv2/core/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaobjdetect.hpp>
#include <math.h>
#include <thread>
#include <iostream>
#include <vector>
#include <gtk-3.0/gtk/gtk.h>

using namespace FlyCapture2;


cv::Ptr<cv::cuda::CascadeClassifier> face\_detect;

void detect\_faces(cv::Mat img, cv::cuda::GpuMat buf,GtkWidget *win)
{
    std::vector<cv::Rect>faces;
    cv::cuda::GpuMat image\_gpu(img);

    //Face detection here
     ...

    if (faces.size() > 0) 
    {
        float x = faces[0].x;
        float y = faces[0].y;
        int new\_x = roundf(x*40/51);
        int new\_y = roundf(y*135/256);  

        gtk\_window\_move(GTK\_WINDOW (win),new\_x,new\_y);
        gtk\_widget\_show  (win); //Should this go here?
        std::cout<<faces[0]<<std::endl;
    }
}

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

    //Camera connect here
    ...

    //face detect variables
    face\_detect = cv::cuda::CascadeClassifier::create("/home/nvidia/opencv/data/haarcascades\_cuda/haarcascade\_frontalface\_default.xml");
cv::cuda::GpuMat objbuf;

     //GTK+ Params
    GtkWidget *window;
    GdkRGBA *color;
    gtk\_init (&argc, &argv);
    gdk\_rgba\_parse(color,"(0,0,0)");
    window = gtk\_window\_new (GTK\_WINDOW\_TOPLEVEL);
    gtk\_window\_set\_decorated(GTK\_WINDOW (window),FALSE);
    gtk\_window\_set\_position(GTK\_WINDOW (window), GTK\_WIN\_POS\_CENTER);
    gtk\_widget\_override\_background\_color(window, GTK\_STATE\_FLAG\_NORMAL, color);
    gtk\_widget\_show  (win); //Should this go here?


    // capture loop
    for (int i=0;i<100;i++)
    {
        // Get the image
        Image rawImage;
        camera.RetrieveBuffer( &rawImage );

        // convert to rgb
        Image rgbImage;
        rawImage.Convert( FlyCapture2::PIXEL\_FORMAT\_MONO8, &rgbImage );

        // convert to OpenCV Mat
        unsigned int rowBytes = (double)rgbImage.GetReceivedDataSize()/(double)rgbImage.GetRows();       
        cv::Mat image = cv::Mat(rgbImage.GetRows(), rgbImage.GetCols(), CV\_8UC1, rgbImage.GetData(),rowBytes);

        //Detect Faces
        detect\_faces(image,objbuf,window);
    }

    //Disconnect Camera
    camera.StopCapture();
    camera.Disconnect();

    gtk\_main();

    return 0;
}

Bedste reference


Koden i din optagelsessløjfe skal være i en hændelses-tilbagekaldelse.
Du skal først ringe g\_timeout\_add eller g\_idle\_add for at registrere din tilbagekald. [7] [8]


Tilbagekaldelsen du registrerede er en GSourceFunc, der skal kaldes efter gtk\_main køres. Returværdien (G\_SOURCE\_CONTINUE eller G\_SOURCE\_REMOVE) styrer, hvis du vil have tilbagekaldelsen til at blive kaldt igen.