如何解决如何使用OpenCV将视频从Android流式传输到Java中的服务器
我正在尝试使用Java中的OpenCV将android摄像机视频流式传输到服务器。以下是在Android上运行以发送单个视频帧的代码段。参数mat是视频帧。
private void sendFrame(Mat mat) {
Socket socketTCP = new Socket(gatewayIP,gatewayPort);
DataOutputStream out = new DataOutputStream(new BufferedOutputStream(socketTCP.getOutputStream()));
int cols = mat.cols();
int rows = mat.rows();
int elemSize = (int) mat.elemSize();
int type = mat.type();
byte[] bytePrimitiveArray = new byte[cols * rows * elemSize];
mat.get(0,bytePrimitiveArray);
try {
out.write(ByteBuffer.allocate(4).putInt(cols).array());
out.write(ByteBuffer.allocate(4).putInt(rows).array());
out.write(ByteBuffer.allocate(4).putInt(elemSize).array());
out.write(ByteBuffer.allocate(4).putInt(type).array());
out.write(ByteBuffer.allocate(4).putInt(bytePrimitiveArray.length).array());
out.write(bytePrimitiveArray);
out.close();
socketTCP.close();
} catch (Exception e) {
e.printStackTrace();
}
}
我正在尝试使用以下代码片段来接收框架并将其显示在服务器端(台式计算机):
public void run() {
int cols;
int rows;
int elemSize;
int type;
int readParcial;
int readTotal;
try {
in = new DataInputStream(new BufferedInputStream(clientSocket.getInputStream()));
cols = in.readInt();
rows = in.readInt();
elemSize = in.readInt();
type = in.readInt();
int totalToRead = in.readInt();
List<Byte> byteList = new ArrayList<Byte>();
byte[] temp = new byte[totalToRead];
readTotal = 0;
while(((readParcial = in.read(temp)) >= 0)) {
byteList.addAll((Collection<Byte>) Arrays.asList(ArrayUtils.toObject(temp)));
readTotal += readParcial;
}
frame = matFromByte(byteList,rows,cols,type);
onNewFrame(frame);
}
catch (Exception e) {
e.printStackTrace();
}
}
private Mat matFromByte(List<Byte> dataList,int rows,int cols,int type){
Mat mat = new Mat(rows,type);
Byte[] data = new Byte[dataList.size()];
data = dataList.toArray(data);
mat.put(0,ArrayUtils.toPrimitive(data));
return mat;
}
public void onNewFrame(Mat frame) {
MatOfByte mob = new MatOfByte();
Imgcodecs.imencode(".bmp",frame,mob);
byte[] byteArray = mob.toArray();
BufferedImage bufImage = null;
InputStream in = new ByteArrayInputStream(byteArray);
try {
bufImage = ImageIO.read(in);
}
catch (Exception e) {
e.printStackTrace();
}
Graphics g = jPanel.getGraphics();
g.drawImage(bufImage,jPanel.getSize().width,jPanel.getSize().height,bufImage.getWidth(),bufImage.getHeight(),null);
}
但是我所得到的只是一张黑色图片,顶部有一些正确的线条。你能帮我吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。