gpt4 book ai didi

c++ - Qt:无法对类型为 'QProcess::ProcessError' 的参数进行排队 - QProcess::ProcessError(FailedToStart)

转载 作者:搜寻专家 更新时间:2023-10-31 01:31:31 27 4
gpt4 key购买 nike

我正在尝试将序列化图像传递到我在 Qt 程序中启动的进程。但是,这样做时我收到此错误消息:

QObject::connect: Cannot queue arguments of type 'QProcess::ProcessError'
(Make sure 'QProcess::ProcessError' is registered using qRegisterMetaType().)

我试图传递的图像是一个 cv::Mat,我将其转换为 QImage,然后再将其转换为 QString。

有人可以告诉我在将参数流式传输到变量参数时我做错了什么吗?我目前的猜测是问题在于图像的序列化形式,即它包含许多双引号,这就是为什么在下面的行中插入 matQStr 的值(将其流式传输到参数)时,会出现误解

其他一切正常,只是在尝试传递图像时出现问题。

如果您可能需要此信息,我开始的过程是一个使用 openCV 的 python 函数,它带有 1 个参数,即我试图传递的图像。序列化图像以将其传递给函数,显然是最简单的解决方案。

代码:

double myClass::runPythonScrypt()
{
cv::Mat imageParameter = cv::imread("/home/John/Desktop/image1.jpg", CV_LOAD_IMAGE_COLOR);
QImage img((uchar*)imageParameter.data, imageParameter.cols, imageParameter.rows, imageParameter.step1(), QImage::Format_RGB32);
std::string matStdString(imageParameter.begin<unsigned char>(), imageParameter.end<unsigned char>());
QString matQStr = QString::fromStdString(matStdString);

QProcess p;
QStringList params;
connect(&p, &QProcess::errorOccurred, qApp, &QApplication::aboutQt );
int a=55;
//I added "this is the end in the string because in the beginning I thought maybe some overflow occured and therefor not the entire image was passed to the process, yet you can see that this sentence gets printed"
params<< "-c" << "import cv2; import imp; foo = imp.load_source('myTest', '/home/John/fw/demos/myTest.py'); from myTest import myClass; myClassObj = myClass(); print myClassObj.myTestFunction( "+ matQStr +" ) this isthe end;";



qDebug()<<params;
p.start("python2", params);
if(! p.waitForFinished(-1))
{qDebug()<<"it failedddd";}

qDebug()<<"error that occured: "<<p.error();

QString errors = p.readAllStandardError();
qDebug()<<"occured errors:"<<errors;

QString p_stdout = p.readAllStandardOutput();


...

}

生成的输出:

started recognition thread
("-c", "import cv2; import imp; foo = imp.load_source('myTest', '/home/John/fw/demos/myTest.py'); from myTest import myClass; myClassObj = myClass(); print myClassObj.myTestFunction(

...etc...

����������������������Ѧ����<\u0013\u001B\u0014�������������������������������������������������������������������
����������������������������������������������������������������������u0011\u0017\u0005\b=
*\u0007\u0005\u0016=/\"6=;<@@;;>AA@:311373//+1HcVFPs\u007FeH?z\u007FBY�f\\�oJV��������������������t?
>K\\`RJMTY`a[RSWQMJECBDDIEEEJKN
KJGJHF>@AGFHDC=<89:AA<0/4*%%+/../+##.657>9;=@BBBA@A@><:9<?@@?>?BB;;:88:;<>;;;>>=<;<@@>=<<<;:::;;<998:7337:;<;:
88955555677;;956:954578887879::8533146764441/./0110/--0563/1220./2665420/011222147;FEA>?>;8>=<BGG;04,,-%$&$ \")0
1./3332/,))++)),.)

etc...

10210.,,,-.-/12/*'',-023432-%#')')/04;94:<3.).51/1.((*.10,'1/23547702.0%#0+114; ) this isthe end;")

started recognition thread
QObject::connect: Cannot queue arguments of type 'QProcess::ProcessError'
(Make sure 'QProcess::ProcessError' is registered using qRegisterMetaType().)
it failedddd
error that occured: QProcess::ProcessError(FailedToStart)
occured errors: ""
name: ""
certitude: 0
return value: 0
2

编辑:

使用的python脚本:

#!/usr/bin/env python2

import cv2
import os
import numpy as np


class myClass:

def __init__(self): pass

def myTestfunction2(self):
image= cv2.imread("/home/John/Desktop/image1.jpg")
cv2.imshow("image", image)

def myTestFunction(self, a):
print('my test function showing passed image as parameter')
cv2.imshow('a', a)
cv2.waitKey(0)
return ('John', a)

请注意,这一行,用于流式传输参数而不是当前在我的软件中的参数,效果非常好:

params<< "-c" << "import cv2; import imp; foo = imp.load_source('myTest', '/home/John/fw/demos/myTest.py'); from myTest import myClass; myClassObj = myClass(); print myClassObj.myTestFunction(cv2.imread('/home/John/Desktop/image1.jpg'));";

但它并不能完全满足我的需要,我需要传递一个 cpp 变量而不是使用 cv2.imread()

最佳答案

我没有在你的代码中看到 registering metaType 行,所以请尝试:

QProcess p;
QStringList params;
qRegisterMetaType<QProcess::ProcessError>("QProcess::ProcessError"); // new line
connect(&p, &QProcess::errorOccurred, qApp, &QApplication::aboutQt );

这应该可以解决

QObject::connect: Cannot queue arguments of type 'QProcess::ProcessError'
(Make sure 'QProcess::ProcessError' is registered using qRegisterMetaType().)

问题,所以你的连接会正常工作,你会看到关于 Qt 的窗口,但如果由于某些原因 QProcess 无法启动,那么它仍然会有问题的原始来源,所以 ^ 只是修复连接。

无论如何 QProcess 在这里向您展示了问题的根源:

 error that occured:  QProcess::ProcessError(FailedToStart)

这通常意味着您尝试使用一些错误的路径。请重新检查路径或尝试使用absolutePath,也许它会解决原来的问题。

编辑:

好的,在你的评论之后很清楚,linux 不能在参数中接受无限量的数据,你尝试在这里编码非常大量的信息,检查这个 link f.e.所以实际上你的第一种方法有正常的长度并且它有效,现在你传递了巨大的信息并且你甚至没有运行 python,是的,它是正确的路径,但系统只是拒绝它并向你显示 QProcess::ProcessError( FailedToStart),当然,使用 ... has too big argument 之类的信息可能会更方便,但我们没有。

总结:

所以你的方法是不可能实现的(而且不同的系统有不同的限制,所以看起来它甚至很危险(不可移植)),所以你需要重写你的应用程序。我只能建议尝试从 Qt 保存 tmp 文件并将 tmp 路径传递给 python 脚本在上面的链接中建议。

但最好的方法可能是为 C++/Qt 编译 OpenCV 并直接在此处使用原始 OpenCV 代码而不使用 tmp 文件等,这将大大提高性能。与您的团队讨论这个,如果这是一些任务,或者按照您的意愿,如果它是您的个人项目。

关于c++ - Qt:无法对类型为 'QProcess::ProcessError' 的参数进行排队 - QProcess::ProcessError(FailedToStart),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45652776/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com