0

シミュレーターで撮影した動画を表示しようとしています。ヘッダー ファイルをインクルードして ROS に QT コードを実装しています。私のコードが実行されています。問題:: フレームを表示するために新しいウィンドウが開かれるたびに。cvWaitKey(10000) を保持しているため、新しいウィンドウは時間の遅れの後に表示されます。ただし、更新されたフレームは同じウィンドウ内にある必要があります。Plsはどうすればそれを行うことができますか?? 私のコードは次のとおりです。

   void imageCallback( const sensor_msgs::ImageConstPtr& msg) //const sensor_msgs::ImageConstPtr&
{   
    imagePublisher.publish (cv_ptr->toImageMsg());                                                      

    QImage temp(&(msg->data[0]), msg->width, msg->height, QImage::Format_RGB888);

    QImage image;
    image=temp;
    // QT Layout with button and image  

    static QWidget *window = new QWidget;
    static QLabel *imageLabel= new QLabel;
    static QPushButton* quitButton= new QPushButton("Quit"); 
    static QPushButton* exitButton= new QPushButton("Exit Image");  
    QVBoxLayout* layout= new QVBoxLayout;


    imageLabel->setPixmap(QPixmap::fromImage(image));
    layout->addWidget(imageLabel);
    layout->addWidget(exitButton);      
    layout->addWidget(quitButton);  

    window->setLayout(layout);
    QObject::connect(quitButton, SIGNAL(clicked()),window, SLOT(close()));  // Adding Buttons
    QObject::connect(exitButton, SIGNAL(clicked()),imageLabel, SLOT(close()));

    window->show();
    cvWaitKey(1);


}

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

   ros::init(argc, argv, "imageSelectNode");
   ros::NodeHandle n("~");




   image_transport::ImageTransport it(n);    
   image_transport::Subscriber sub = it.subscribe("/camera/image_raw",1, imageCallback);

   imagePublisher = it.advertise("imagePublisherTopic", 1);     //Publish the image in 'imagePublisherTopic' node



QApplication a(argc, argv);

    ros::spin();
 return 0;

}

4

1 に答える 1

2

QLabelフレームごとに新しいウィンドウを作成するため、新しいウィンドウが開きます。必要なのは - one QLabel、どのピックスマップを変更する必要があるかです。これを行う最も簡単な方法は、imageLabel静的にすることです。

static QLabel *imageLabel = new QLabel;

更新

このラベルを一度だけ操作したい場合 (レイアウトに追加するなど)、次のようにすることができます。

QLabel * createLabel()
{
    QLabel *l = new QLabel;
    layout->addWidget(l);
    return l;
}

...

static QLabel *imageLabel = createLabel();

更新 4 :

QLabel * createLabel()
{
    QWidget *window = new QWidget;
    QLabel *imageLabel= new QLabel;
    QPushButton* quitButton= new QPushButton("Quit"); 
    QPushButton* exitButton= new QPushButton("Exit Image");  
    QVBoxLayout* layout= new QVBoxLayout;

    layout->addWidget(imageLabel);
    layout->addWidget(exitButton);      
    layout->addWidget(quitButton);  

    window->setLayout(layout);
    QObject::connect(quitButton, SIGNAL(clicked()),window, SLOT(close()));
    QObject::connect(exitButton, SIGNAL(clicked()),imageLabel, SLOT(close()));

    window->show();
    return imageLabel;
}

void imageCallback( const sensor_msgs::ImageConstPtr& msg)
{
    imagePublisher.publish (cv_ptr->toImageMsg());

    QImage temp(&(msg->data[0]), msg->width, msg->height, QImage::Format_RGB888);

    QImage image;
    image = temp;

    static QLabel *imageLabel = createLabel();
    imageLabel->setPixmap(QPixmap::fromImage(image));
    cvWaitKey(1);
}
于 2013-05-24T17:10:09.503 に答える