在 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 中创建两个响应列?

在android上的opencv中创建yuv mat

如何使用 MAC OS MATLAB 读取在 windows MATLAB 中创建的 .mat 文件

选择一个 Mat 的子集并复制它们以在 C++/Opencv 中创建一个新的 mat

在opencv中创建4x4 mat矩阵时出错

需要代码在java中创建连接池