我正在尝试编写客户端-服务器类型的应用程序。安装在谷歌眼镜中的客户端应用程序使用摄像头进行视频捕获。图像帧被发送到安装在安卓智能手机中的服务器应用程序。我目前正在通过蓝牙执行此操作,这似乎很慢。我目前的图像设置为 320x240,4 个通道。发送的每个帧大约是 307200 字节,这对于蓝牙来说可能太大而无法处理,但我不太确定。将每个帧写入输出流大约需要 2 秒。我正在使用OpenCV,并且我正在通过蓝牙以public Mat onCameraFrame(CvCameraViewFrame inputFrame)
方法发送帧。
适用于谷歌眼镜的MyGlass应用程序具有ScreenCast功能,其中眼镜中显示的UI将发送到配对的Android手机。这是通过蓝牙完成的,比我的实现快得多。
我不需要高帧率的流。 5-10 fps 应该是可以忍受的。安卓手机将在这个流中进行计算机视觉技术。
谁能提出一个好的方法?
您可以尝试在 Base64 中对图像进行编码,以便使用 XML、JSON 或 protobuf 等协议通过蓝牙发送它们。可能这不是最有效的方法,但目前对您来说可能是最简单的方法.
但是如果你想访问任何cv::Mat
的data
成员,如果frame.isContinuous()
返回true,那么它可以用作字节数组,否则它不是。
或者,最好在服务器端将帧编码为 JPEG,然后在客户端对其进行解码。它将显着减少应通过网络流式传输的数据的大小,并且由于蓝牙的带宽有限,它可能很有用。
OpenCV的imencode()
和imdecode()
将执行压缩的两侧。有关支持的格式和标志说明的列表,请参阅imwrite()
。