我正试图通过TCP发送Mat图像。首先,Mat已经转换为uchar,然后转换为char格式。 char格式的整个图像将由大小为1024字节的缓冲区发送出缓冲区。以下是我的代码。
Mat decodeImg = imdecode(Mat(bufferFrame), 1);
uchar *transferImg = decodeImg.data;
char* charImg = (char*) transferImg;
int length = strlen(charImg);
int offset = 0;
while (true)
{
bzero(bufferSend, BUFFER_SIZE);
if (offset + BUFFER_SIZE <= length)
{
for (int i = 0; i < BUFFER_SIZE; i++)
{
bufferSend[i] = charImg[i + offset];
}
// memcpy(charImg+offset, bufferSend,BUFFER_SIZE);
if (send(sockfd, bufferSend, sizeof(bufferSend), 0) < 0)
{
printf("Send FIle Failed,total length is%d,failed offset is%d\n",
length,
offset);
break;
}
}
else
{
for (int i = 0; i < length - offset; i++)
{
bufferSend[i] = charImg[i + offset];
}
if (send(sockfd, bufferSend, sizeof(bufferSend), 0) < 0)
{
printf("Send FIle Failed,total length is%d,failed offset is%d\n",
length,
offset);
break;
}
break;
}
offset += BUFFER_SIZE;
}
代码输出显示:发送文件失败,总长度为251035,失败偏移量为182272.
我非常感谢您的帮助。提前谢谢!
答案 0 :(得分:2)
在这里拉出水晶球。这可能是OP的问题,但如果不是,这肯定是一个需要解决的问题。
Mat decodeImg = imdecode(Mat(bufferFrame), 1);
uchar *transferImg = decodeImg.data;
获取数据。如果那是你需要发送的东西,那不是一个坏主意。
char* charImg = (char*) transferImg;
从上面获取字节数组并将其视为一个字符数组。
int length = strlen(charImg);
和Boom。矩阵数据不是ascii格式化数据,而是字符串,因此不应将其视为字符串。
strlen
计算数据,直到它到达一个空字符,一个数字值为0的字符,这在正常的字母数字世界中不存在,因此可以用作金丝雀值来表示一个结束串。 count是字符串中第一个空字符前的字符数。
在这种情况下,我们没有字符串。我们有一个二进制数字blob,其中任何一个都可能为0.在任何地方都可能有一个空值。可能在一开始就是对的。可能是一百个字节。在读取所有有效图像数据之后很长时间内可能没有空值。
无论如何,strlen
几乎肯定会返回错误的值。字节太少而接收器无法获取所有图像数据,我不知道它的作用。该代码不适用于我们。它可能会感到不安并丢弃结果。也许它崩溃了。没有办法知道。如果信息太多,我们也不知道会发生什么。也许它会愉快地处理文件并忽略发送的额外垃圾。也许它会崩溃。
但是,当它有足够的字节时它会关闭TCP / IP连接怎么办?这使得发送者试图将一些未发送和不需要的字节写入封闭的套接字。 send
将失败并将错误代码设置为套接字关闭。
解决方案:
获取正确的数据大小。
我从openCV文档中读取的内容是Mat::elemSize
,它会为您提供矩阵中每个项目的大小,而Mat::size
会返回Size
包含行和列的对象。乘以rows * columns * elemSize
,您应该有要发送的字节数。