通过套接字将 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);
相关文章:
- 在java中解决这段代码时面临循环中的问题
- 尝试用java代码编译和运行c++代码
- 在这种情况下,java对象是否可以调用本机函数
- 在java中读取c++字节的位字段
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 使用已使用 java 编码的 openssl 解码数据
- SWIG Java 在使用 -DSWIGWORDSIZE64 时将int64_t转换为 jlong
- Android Java USB for native cpp
- 在由Sublime文本3编译后在cmd上显示Java程序输出
- C++ equivalent to Java Map getOrDefault?
- C++ 中的 Java 样式枚举
- 是否有技术原因阻止 Java 中的 final C++ 像 const 一样严格?
- 加密在 Windows、C++ 和 Java 中传输中的数据
- Java从C++回调到C++回调
- 在 c++ 中模拟输入并在 JAVA 中读取它?
- 用C++包装 Java 库 (JNI)
- 使用 TreeSet Java 对反转进行计数
- 验证openssl c++中的签名,这是由JAVA DSA签名的?
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- 如何从保存在 Java 中C++的字节数组中读取数字?