繁体   English   中英

通过套接字将Mat对象从C ++发送到Java

[英]Sending a Mat object over socket from c++ to Java

我有兴趣将视频流从C ++服务器发送到Java客户端。 C ++服务器是使用boost / asio编写的。
我当时在考虑使用opencv以便轻松连接到计算机的USB摄像机。 但是,我在通过套接字发送Mat对象时遇到了麻烦。

我遇到的唯一方法是这样的:

Mat frame;
...
int  imgSize = frame.total()*frame.elemSize();
bytes = send(clientSock, frame.data, imgSize, 0))

但我不能通过boost方式发送,因为它必须采用以下形式之一: http : //www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_raw_socket/send_to.html

所以我想到了将frame.data,imgSize转换为字符串,并发送包含这两个缓冲区的容器,但是我认为这不是正确的方法。 即使是这样,如何在Java客户端中“重建”映像?

任何想法将不胜感激!

您可以尝试使用Base64对图像进行编码,以使用XML或JSON等协议通过套接字将其发送。

Base64是一组类似的二进制到文本编码方案,它们以ASCII字符串格式表示二进制数据

可能这不是最有效的方法,但目前可能对您来说是最简单的方法。 您可以在Wiki页面上找到有关Base64的更多信息,还可以在此处找到有关将OpenCV Mat转换为Base64的更多信息。 也有一些关于如何在Java中显示Base64图像的教程。

在服务器端,编码为jpeg:

vector<uchar> buff;
vector<int> params;

params.push_back(cv::IMWRITE_JPEG_QUALITY);
//80 keeps the image size under 64KB ,ON MY CAMERA, so I can send the image in one piece
params.push_back(80);
cv::imencode(".jpg", frame, buff, params);

boost::asio::ip::udp::socket* _socket;
...
_socket->send_to(boost::asio::buffer(buff), some boost::asio::ip::udp::endpoint, 0, some boost::system::error_code);

在客户端:

DatagramPacket receivePacket; //stores the data sent from server
...
byte[] receivedImage = receivePacket.getData();
MatOfByte mob = new MatOfByte(receivedImage);
Mat img = Highgui.imdecode(mob, Highgui.IMREAD_UNCHANGED);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM