C++ 如何使用qt(QProcess)获取深色检测到的对象名称?

C++ 如何使用qt(QProcess)获取深色检测到的对象名称?,c++,qt,ubuntu,yolo,C++,Qt,Ubuntu,Yolo,我想使用QProcess类为qt中的单个图像调用darknet detect命令。 这是我的主窗口代码: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QProcess * process = new QProcess(); QString temp = "./darknet detect cfg/y

我想使用QProcess类为qt中的单个图像调用darknet detect命令。 这是我的主窗口代码:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QProcess * process = new QProcess();
    QString temp = "./darknet detect cfg/yolov3.cfg yolov3.weights 
    iii.jpg";
    connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), 
    this, SLOT(ReadOut(int, QProcess::ExitStatus)));
    process->start(temp);
}

void MainWindow::ReadOut(int i, QProcess::ExitStatus statur)
{
  QProcess *p = dynamic_cast<QProcess *>( sender() );
  if (p)
    ui->textBrowser->append( p->readAllStandardOutput() );  
  p->close();
  delete p;
}
MainWindow::MainWindow(QWidget*父项):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
QProcess*process=新的QProcess();
QString temp=“./darknet detect cfg/yolov3.cfg yolov3.weights
iii.jpg”;
连接(进程,信号(已完成(int,QProcess::ExitStatus)),
这个插槽(读出(int,QProcess::ExitStatus));
过程->启动(临时);
}
void main window::ReadOut(int i,QProcess::ExitStatus statur)
{
QProcess*p=动态_转换(发送方());
如果(p)
ui->textBrowser->append(p->readAllStandardOutput());
p->close();
删除p;
}
但由于检测后,darkent等待另一个输入,我无法获得终端的输出,因为进程仍在进行中。或者可能存在另一个问题

我的问题是:

  • 如何更正从进程中获取检测到的对象名称的代码

  • 有没有其他方法来实现这一点


  • 您可以尝试使用
    QProcess::readyReadStandardOutput()
    信号而不是进程完成信号。

    您可以尝试使用
    QProcess::readyReadStandardOutput()
    信号而不是进程完成信号。

    使用QProcess时最常见的错误是:

    • 程序的相对路径是相对于可执行文件夹的,但程序通常不在可执行文件夹中

    • 程序可以使用与程序相关的资源,因此在这些情况下,工作目录必须是程序所在的目录

    考虑到上述情况,解决方案是:

    #包括
    类DarknetWidget:publicqwidget{
    Q_对象
    公众:
    DarknetWidget(QWidget*parent=nullptr):QWidget(parent)
    {
    QGridLayout*lay=新的QGridLayout(本);
    lay->addWidget(新的QLabel(“最暗的目录”)、0、0;
    目录_le=新QLineEdit;
    lay->addWidget(目录,1,0);
    QPushButton*目录按钮=新的QPushButton(“选择”);
    连接(目录按钮,&QPushButton::clicked,this,&DarknetWidget::onSelectDirectory);
    lay->addWidget(目录按钮,1,1);
    lay->addWidget(新的QLabel(“命令”)),2,0;
    命令_le=新的QLineEdit;
    命令_le->setText(“暗色检测cfg/yolov3.cfg”);
    lay->addWidget(命令3,0,1,2);
    lay->addWidget(新的QLabel(“权重”),4,0;
    权重=新QLineEdit;
    lay->addWidget(权重5,0);
    QPushButton*重量按钮=新的QPushButton(“选择”);
    连接(权重按钮、&QPushButton::clicked、this、&DarknetWidget::onSelectWeight);
    lay->addWidget(权重按钮,5,1);
    lay->addWidget(新的QLabel(“输入图像”)),6,0;
    image_le=新的QLineEdit;
    lay->addWidget(图7,0);
    QPushButton*图像按钮=新的QPushButton(“选择”);
    连接(图像按钮、&QPushButton::clicked、this、&DarknetWidget::onSelectImage);
    lay->addWidget(图像按钮,7,1);
    run_btn=新的QPUSH按钮;
    运行\u btn->setText(“运行”);
    连接(run_btn,&QPushButton::clicked,this,&DarknetWidget::runDarket);
    lay->addWidget(运行\u btn,8,0,1,2);
    log_te=新的QPlainTextEdit;
    日志->设置只读(真);
    lay->addWidget(日志,9,0,1,2);
    调整大小(640480);
    流程=新的QProcess(此);
    process->setProcessChannelMode(QProcess::MergedChannels);
    连接(进程,&QProcess::stateChanged,this,&DarknetWidget::onStateChanged);
    连接(进程,&QProcess::readyReadStandardOutput,this,&DarknetWidget::onReadyReadStandardOutput);
    }
    受保护的:
    作废关闭事件(QCloseEvent*事件){
    进程->杀死();
    QWidget::closeEvent(事件);
    }
    专用Q_插槽:
    void onSelectDirectory(){
    QString filename=QFileDialog::getExistingDirectory(这个,tr(“打开暗目录”);
    如果(!filename.isEmpty()){
    目录\u le->setText(文件名);
    }
    }
    void onSelectWeight(){
    QString filename=QFileDialog::getOpenFileName(这个,tr(“打开权重路径”);
    如果(!filename.isEmpty()){
    权重->设置文本(文件名);
    }
    }
    void onSelectImage(){
    QString filename=QFileDialog::getOpenFileName(此,
    tr(“开放映像路径”),
    QDir::currentPath(),
    tr(“图像文件(*.jpg)”);
    如果(!filename.isEmpty()){
    图像->设置文本(文件名);
    }
    }
    void runDarket(){
    日志->清除();
    进程->设置工作目录(目录->文本());
    QString命令=QString(“%1%2%3”)
    .arg(命令->文本()
    .arg(重量->文本())
    .arg(图像->文本());
    进程->启动(命令);
    }
    void onReadyReadStandardOutput(){
    日志->插入明文(进程->readAllStandardOutput());
    日志->垂直滚动条()->设置值(日志->垂直滚动条()->最大值());
    }
    void onStateChanged(QProcess::ProcessState状态){
    如果(状态==QProcess::Running){
    运行\u btn->setEnabled(假);
    }
    else if(状态==QProcess::NotRunning){
    运行\u btn->setEnabled(真);
    }
    }
    私人:
    QLineEdit*目录;
    QLineEdit*命令_le;
    QLineEdit*权重;
    QLineEdit*图像编辑;
    QPushButton*run_btn;
    QPlainTextEdit*日志;
    QProcess*过程;
    };
    int main(int argc,char*argv[]){
    QApplication应用程序(argc、argv);
    暗枝w;
    w、 show();
    返回app.exec();
    }
    #包括“main.moc”
    

    使用QProcess时最常见的错误是:

    • 程序的相对路径是相对于作为exe的