I'm develloping an application for image process. To start I get an Image that i give to an AsyncTask :
@Override
public void onImageAvailable(ImageReader reader) {
int jump = 5; //Le nombre d'image à sauter avant d'en traiter une, pour liberer de la mémoire
Image readImage = reader.acquireNextImage();
ImageCopy tmpImage = new ImageCopy(readImage.getPlanes()[0].getBuffer(),readImage.getWidth(),readImage.getHeight());
readImage.close();
if(count == jump){
//Image Process here
new ImageProcess().execute(tmpImage);
count = 0;
realCount++;
}
else count++;
totalCount++;
}
ImageCopy is a class I made because the Image Class give me trouble with AsyncTask. Then this is what it is in ImageProcess class :
@Override
protected IplImage doInBackground(ImageCopy... images) {
ByteBuffer buffer = images[0].getBuffer();
int width = images[0].getWidth();
int height = images[0].getHeight();
//Conversion de l'Image passé en paramêtre en une IplImage
IplImage iplImage = bufferToIpl(buffer,width,height);
//Egalisation de l'histogramme en niveau de gris
opencv_imgproc.cvEqualizeHist(iplImage,iplImage);
//Seuillage de l'image
opencv_imgproc.cvThreshold(iplImage,iplImage,96.0,255.0,opencv_imgproc.CV_THRESH_BINARY);
//TEST : Enregistrement image
//opencv_highgui.cvSaveImage("test.jpg",iplImage);
return iplImage;
}
But the problem come from the method bufferToIple :
protected IplImage bufferToIpl(ByteBuffer buffer, int width, int height) {
int f = 1;// SUBSAMPLING_FACTOR;
//Conversion du ByteBuffer en un byte array
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
// First, downsample our image and convert it into a grayscale IplImage
IplImage grayImage = IplImage.create(width / f, height / f, opencv_core.IPL_DEPTH_8U, 1);
int imageWidth = grayImage.width();
int imageHeight = grayImage.height();
int dataStride = f * width;
int imageStride = grayImage.widthStep();
ByteBuffer imageBuffer = grayImage.getByteBuffer();
for (int y = 0; y < imageHeight; y++) {
int dataLine = y * dataStride;
int imageLine = y * imageStride;
for (int x = 0; x < imageWidth; x++) {
imageBuffer.put(imageLine + x, data[dataLine + f * x]);
}
}
return grayImage;
}
Most precisly from those lines :
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
When i add buffer.get(data) to my code i have those bugs at execution :
- 06-20 15:25:05.524 4015-4028/ca.uqtr.camera2videobasic W/art﹕ Suspending all threads took: 5.253ms
- 06-20 15:25:10.020 4015-4100/ca.uqtr.camera2videobasic A/libc﹕ Fatal signal 11 (SIGSEGV), code 1, fault addr 0xe1a3c000 in tid 4100 (AsyncTask #1)
It seem to come from AsyncTask and i Have no idea why...