How can I work with my quickcam sphere AF on opencv ?
Hi, I am a french student and I actually work on a project that consists in use a quickcam sphere AF video flow to make some image treatment for a system of automatisation of a robot. The treatment have to be done on a dell streak 7 tablet under android 3.2 and the camera is mobile because it is on the robot that we make move (wifibot). Unfortunately my code give me some bitmap pictures but opencv only use Mat format...I guess...So I tried to convert that with bitmapToMat function but that makes crashing the application, or do nothing when I catch the exception.
Can we convert directly the flow received with http into Mat format? Or can we resolve the crashing problem?
Here is the original code to catch the video flow via http protocol:
package com.formation.wfbt_ctrl;
import android.graphics.Paint;
import android.graphics.Canvas;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.util.Properties;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import org.opencv.core.Mat;
public class MjpegInputStream extends DataInputStream {
private final byte[] SOI_MARKER = { (byte) 0xFF, (byte) 0xD8 };
private final byte[] EOF_MARKER = { (byte) 0xFF, (byte) 0xD9 };
private final String CONTENT_LENGTH = "Content-Length";
private final static int HEADER_MAX_LENGTH = 100;
private final static int FRAME_MAX_LENGTH = 40000 + HEADER_MAX_LENGTH;
private int mContentLength = -1;
public static MjpegInputStream read(String url) {
HttpResponse res;
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
res = httpclient.execute(new HttpGet(URI.create(url)));
return new MjpegInputStream(res.getEntity().getContent());
} catch (ClientProtocolException e) {
} catch (IOException e) {}
return null;
}
public MjpegInputStream(InputStream in) { super(new BufferedInputStream(in, FRAME_MAX_LENGTH)); }
private int getEndOfSequence(DataInputStream in, byte[] sequence) throws IOException {
int seqIndex = 0;
byte c;
for(int i=0; i < FRAME_MAX_LENGTH; i++) {
c = (byte) in.readUnsignedByte();
if(c == sequence[seqIndex]) {
seqIndex++;
if(seqIndex == sequence.length) return i + 1;
} else seqIndex = 0;
}
return -1;
}
private int getStartOfSequence(DataInputStream in, byte[] sequence) throws IOException {
int end = getEndOfSequence(in, sequence);
return (end < 0) ? (-1) : (end - sequence.length);
}
private int parseContentLength(byte[] headerBytes) throws IOException, NumberFormatException {
ByteArrayInputStream headerIn = new ByteArrayInputStream(headerBytes);
Properties props = new Properties();
props.load(headerIn);
return Integer.parseInt(props.getProperty(CONTENT_LENGTH));
}
public Bitmap readMjpegFrame() throws IOException {
mark(FRAME_MAX_LENGTH);
int headerLen = getStartOfSequence(this, SOI_MARKER);
reset();
byte[] header = new byte[headerLen];
readFully(header);
try {
mContentLength = parseContentLength(header);
} catch (NumberFormatException nfe) {
mContentLength = getEndOfSequence(this, EOF_MARKER);
}
reset();
byte[] frameData = new byte[mContentLength];
skipBytes(headerLen);
readFully(frameData);
/* BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inPreferredConfig = Bitmap.Config.ARGB_8888;
Mat res = new Mat();
res.put(640, 480, frameData);*/
Bitmap res = BitmapFactory.decodeStream(new ByteArrayInputStream(frameData)/*,null,opts*/);
/*Bitmap convertedBitmap = Bitmap.createBitmap(res.getWidth(), res.getHeight(), Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(convertedBitmap);
Paint paint = new Paint();
canvas.drawBitmap(res, 0, 0, paint);
return convertedBitmap;//*/return res;
}
}
And there is the view which shows ...