gpt4 book ai didi

java - 在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:18 28 4
gpt4 key购买 nike

我的 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 - channel 数.我不知道为什么。

最佳答案

老实说,在我看来,通过网络传输未压缩的字节(甚至是 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 - 在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20858021/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com