我对将视频流从C ++服务器发送到Java客户端感兴趣。 C ++服务器是用boost / asio编写的。
我正在考虑使用opencv以便轻松连接到计算机的USB摄像头。但是,我在使用套接字发送Mat对象时遇到了麻烦。
我遇到的唯一方法就是这样:
Mat frame;
...
int imgSize = frame.total()*frame.elemSize();
bytes = send(clientSock, frame.data, imgSize, 0))
但我无法通过这种方式发送它,因为它必须采用以下形式之一: http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/basic_raw_socket/send_to.html
所以我想到将frame.data,imgSize转换为字符串,并发送这两个缓冲区的容器,但我不认为这是正确的方法。即使是这样,我如何在Java客户端中“重建”图像?
任何想法都会受到赞赏!
答案 0 :(得分:0)
您可以尝试在Base64中对图像进行编码,以使用XML或JSON等协议通过套接字发送它们。
Base64是一组类似的二进制文本编码方案 用ASCII字符串格式表示二进制数据
这可能不是最有效的方法,但对你来说这可能是最简单的方法。您可以在wiki page上找到有关Base64的更多信息,您可以找到有关将OpenCV Mat转换为Base64 here的更多信息。还有一些关于如何用Java显示Base64图像的教程。
答案 1 :(得分:0)
在服务器端,编码为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);