c++ - 通过 TCP 将图像从 labVIEW 发送到 QT

标签 c++ image qt tcp labview

我正在 try catch 从连接到 myRIO 的相机拍摄的图像,并通过 TCP/IP 连接将它们从 labVIEW 发送到 QT GUI 应用程序。

我的问题是,当我读取数据时,QT 一直抛出堆指针异常并崩溃。 表达式:is_block_type_valid(header->_block_use)

我认为这可能是因为发送的数据超过 35k 字节,所以我尝试读取单独 block 中的数据,但仍然出现错误。

下面是我在发出 readyRead() 时调用的函数:

void TCPHandler::onRead() {


QByteArray byteArray;
QByteArray buffer;
QByteArray dataSize = mainSocket->read(5); //read the expected amount of bytes incoming (about 35000)
while (buffer.size() < dataSize.toInt()) {
    int bytesLeft = dataSize.toInt() - buffer.size();
    if (bytesLeft < 1024) {
        byteArray = mainSocket->read(bytesLeft);
    }
    else {
        byteArray = mainSocket->read(1024);
    }

    buffer.append(byteArray);
}
QBuffer imageBuffer(&buffer);
imageBuffer.open(QIODevice::ReadOnly);

QImageReader reader(&imageBuffer, "JPEG");
QImage image;
if(reader.canRead())
    image = reader.read();
else {
    emit read("Cannot read image data");
}

if (!image.isNull())
{
    image.save("C:/temp");
}
else
{
    emit read(reader.errorString());
}}

在 LabVIEW 代码中,我首先发送字节大小,然后是原始图像数据:

LabVIEW code image

编辑:连接插槽。还应该提到这是在主 GUI 的单独线程中运行的。

TCPHandler::TCPHandler(QObject *parent)
    : QObject(parent),
    bytesExpected(0)
{
    mainSocket = new QTcpSocket(this);

    connect(mainSocket, SIGNAL(readyRead()), this, SLOT(onRead()));
    connect(mainSocket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error), this, &TCPHandler::displayError);
}

最佳答案

您正在将您的长度作为十进制字符串发送。然后是字符串。 我希望长度是二进制值。因此,不要使用“I32 到字符串”函数,而是使用 typecast以字符串作为类型。

关于c++ - 通过 TCP 将图像从 labVIEW 发送到 QT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49431543/

相关文章:

c++ - 如何为控制台输入 (stdin) 获取类似 QIODevice 的信号?

c++ - std::bitset 位顺序是可移植的吗?

c++ - 选择 Qt 写入文本文件的自定义行结尾

python - 如何在python中使用Matlab的imresize

image - Prestashop img 文件夹太大(几乎 40GB)

python - 为项目选择合适的 GUI 框架

c++ - 我为什么要在这里使用右括号?

c++ - NACL 的 NPAPI 插件

image - 仅 IE 中的链接图像上不需要的填充

c++ - 如何在QOpenGLTexture中创建带alpha的纹理?