通过网络发送图像

Posted

技术标签:

【中文标题】通过网络发送图像【英文标题】:Send an image over a network 【发布时间】:2014-05-20 17:51:07 【问题描述】:

我已经向a question before 询问了有关通过网络发送结构化数据的问题,以及如何在服务器端处理这些数据。

我实际上正在尝试做的是通过网络从客户端 (c++/Qt) 向服务器端 (python) 发送图像。

双方都在使用OpenCV library

我发现这些 OpenCV 函数可以帮助我:cv::imencode()cv::imdecode()

发送部分(客户端):

cv::Mat img = cv::imread("lena.png")

vector<uchar> buf;
cv::imencode( ".png", img, buf );

// rawImage: the data that are supposed to be sended and decoded with cv2.imdecode() 
QByteArray rawImage = QByteArray( (const char *) buf.data(), buf.size() );

// construct paquet
QByteArray sep = QByteArray();
sep.append( "<break>" );

QByteArray paquet;
paquet.append( _token );
paquet.append( sep );
paquet.append( query );
paquet.append( sep );
paquet.append( QJsonDocument( jsonObject ).toJson( QJsonDocument::Compact ) );
paquet.append( sep );
paquet.append( rawImage );
write( paquet );

接收部分(服务器端)

# get the data here...
lines = data.split( '<break>' )
raw = lines[3]
img = cv2.imdecode( raw, cv2.CV_LOAD_IMAGE_COLOR )
# process img ...

我遇到了这个错误:

...
img = cv2.imdecode( raw, cv2.CV_LOAD_IMAGE_COLOR )
exceptions.TypeError: buf is not a numpy array, neither a scalar

我认为这不是发送(或编码)此图像的更好方法。有什么帮助吗?

编辑: 我认为 OpenCV 函数在 C++ 和 Python 版本之间不兼容,并且图像在内存中的存储方式不同。有人要确认吗?

【问题讨论】:

【参考方案1】:

您可以使用多部分请求来避免编码/解码,它允许同时上传图像和键/值对。在 php 中,通过多部分请求上传的图像可以通过$_FILES 变量访问。可以用QHttpMultiPart类实现。

【讨论】:

以上是关于通过网络发送图像的主要内容,如果未能解决你的问题,请参考以下文章

ios - 通过 POST 方法发送带有其他参数的图像

通过网络连续传输图像的最有效方式

使用 JavaScript 通过 ESC/POS 将图像打印命令发送到以太网上的热敏打印机

发送连续网络摄像头图像时出现内存不足错误java

无法将图像发送到 Go 服务器

通过 URL 通过代理向内存数据提供图像数据