我有一個程序在這裏執行人臉檢測,我想用這些座標來移動GTK + 3.22使用GTK的 gtk_window_move函數創建的窗口。我希望窗口在OpenCV的moveWindow函數移動過程中保持全部打開狀態。基於人臉檢測座標的GTK +移動窗口
我昨天剛剛下載了GTK +包,所以我並不都太熟悉。
該程序將執行一個循環100次,跟蹤整個時間的臉部。目前,人臉跟蹤工作,但窗口不會出現,直到循環完成。爲什麼是這樣?我相信gtk_move_window函數正在工作,但窗口不會保持打開狀態。我試過每次在循環中重新打開窗口,或者在循環之前打開一次。如果您熟悉OpenCV的moveWindow函數,那正是我正在尋找的。這裏是示例代碼。順便說一下,如果你知道一個GTK +函數如何將窗口帶到頂層的頂層,並在調用時打開所有其他窗口,這對我來說也是有用的信息。
#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;
}
我對Gtk +並不熟悉,但通常GUI框架是基於消息的,並且需要一些代碼來「抽取消息」以使UI響應。在這種情況下,'gtk_main'似乎是唯一的功能。我的猜測是你必須在你的捕獲中調用像['gtk_main_iteration_do()'](https://developer.gnome.org/gtk3/stable/gtk3-General.html#gtk-main-iteration-do)循環以便GUI更新。 –