作为我项目的一部分,我想使用从嵌入式计算机到客户端应用程序的websockets发送图像流,并将它们显示在img
标记中以实现流式传输。
首先我尝试发送原始RGB数据(752 * 480 * 3 - 大约1MB),但最后我遇到了一些基于我的RGB图像将图像编码到png中的问题所以我想尝试编码我的首先将数据发送到PNG,然后使用websockets发送它。
问题是,我在使用已在项目中使用的OpenCV
库将数据编码为PNG时遇到了一些问题。
首先,一些代码:
websocketBrokerStructure.matrix = cvEncodeImage(0, websocketBrokerStructure.bgrImageToSend, 0);
websocketBrokerStructure.imageDataLeft = websocketBrokerStructure.matrix->rows * websocketBrokerStructure.matrix->cols * websocketBrokerStructure.matrix->step;
websocketBrokerStructure.imageDataSent = 0;
但在执行第二行时我遇到了奇怪的错误:
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
我有点困惑,为什么我从我的代码中收到此错误。
另外我想知道我是否理解正确:在调用cvEncodeImage(其中bgrImage
为IplImage*
有3个频道 - BGR之后)我只需要遍历data
我的CvMat
成员{1}}获取所有png编码数据?
答案 0 :(得分:1)
cvEncodeImage
函数将第一个参数作为要编码的图像的扩展名。您正在传递0
,这与NULL
相同。这就是您收到消息NULL not valid
。
你应该使用这个:
websocketBrokerStructure.matrix = cvEncodeImage(".png", websocketBrokerStructure.bgrImageToSend, 0);
您可以查看cvEncodeImage
here。
您可以在此处查看cvEncodeImage
或其C ++兄弟imencode
的一些示例:encode_decode_test.cpp。它们还会显示一些您可以传递给cvEncodeImage
的参数,以防您想要调整它们。