在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送
Posted
技术标签:
【中文标题】在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送【英文标题】:Create Mat object in a Java client, sent from a C++ server using opencv 【发布时间】:2013-12-31 13:18:14 【问题描述】:我的 C++ 服务器将视频流从计算机的 USB 发送到 Java 客户端。 为了从 C++ 发送图像(Mat 对象),我使用 FileStorage 类将图像存储在字符串中:
cv::FileStorage fs(".xml", cv::FileStorage::WRITE + cv::FileStorage::MEMORY);
fs << "mymatrix" << frame;
string buff = fs.releaseAndGetString(); //buff has all the Mat object info.
客户端接收buff,创建XML文件并使用:Java: How to read and write xml files?读取它
图像数据类型是“3u”(=CV_8UC3),所以我创建了一个字节数组来存储矩阵数据:
//data is a string that contains the matrix data
byte[] Bdata = data.getBytes();
并使用此代码创建 Mat 对象(取自 https://groups.google.com/forum/#!topic/android-opencv/QEwhgO88ZwM):
//Irows = number of rows
//Icols = number of columns
Mat mat = new Mat(Irows,Icols,CvType.CV_8UC3);
mat.put(0,0,Bdata);
但是“mat.put..”会产生这个错误:
Exception in thread "main" java.lang.UnsupportedOperationException: Provided data element number (3742097) should be multiple of the Mat channels count (3)
我不明白字节数组有什么问题? 任何想法将不胜感激。
编辑:虽然我不在我的电脑附近,所以我无法确认这一点,看起来错误中的大数字是数组的长度,它不会除以 3 - 通道数.我不知道为什么。
【问题讨论】:
【参考方案1】:老实说,通过网络流式传输未压缩的字节(甚至是 xml)对我来说听起来是个可怕的想法。
这里有一个替代方案:
在服务器端,编码为 jpeg:
std::vector<uchar>outbuf;
std::vector<int> params;
params.push_back(cv::IMWRITE_JPEG_QUALITY);
params.push_back(100);
cv::imencode(".jpg", frame, outbuf, params);
int outlen = outbuf.size();
// send outlen bytes to client
在客户端,解包:
// read into a MatOfBytes, until the jpeg end sequence ff d9 is discovered.
Mat img = Highgui.imdecode(bytes_buf, IMREAD_UNCHANGED)
【讨论】:
以上是关于在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 fxLayout 在 mat-card-content 中创建两个响应列?
如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件