Reputation: 651
I am trying to develop an augmented reality app for android using OpenCv4android. I need to process the camera frame buffers. To see what is the content of the frame buffer matrix, I converted the Mat object to Bitmap and wrote a png image. What I got is just a big chunk of green pixel. Camera buffer should be ok cause opencv is rendering it ok. My code is given below.
public class OpenGLSurfaceWithCameraTest extends Activity implements CvCameraViewListener2{
private static final String TAG = "OpenGLSurfaceWithCamera";
Mat mRgba;
boolean flag = true;
private CameraBridgeViewBase cameraPreview;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
cameraPreview.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_with_opengl);
cameraPreview = (CameraBridgeViewBase)findViewById(R.id.camera_view_opengl);
cameraPreview.setCvCameraViewListener(this);
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
if(cameraPreview != null){
cameraPreview.disableView();
}
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
}
@Override
public void onCameraViewStarted(int width, int height) {
// TODO Auto-generated method stub
mRgba = new Mat(height, width, CvType.CV_8UC4);
}
@Override
public void onCameraViewStopped() {
// TODO Auto-generated method stub
mRgba.release();
}
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
// TODO Auto-generated method stub
mRgba = inputFrame.rgba();
Mat tmp = new Mat(mRgba.rows(), mRgba.cols(), CvType.CV_8UC1, new Scalar(4));
Imgproc.pyrDown(mRgba, tmp);
Imgproc.pyrDown(tmp, tmp);
Bitmap bitmap = Bitmap.createBitmap(tmp.cols(), tmp.rows(), Config.ARGB_8888);
Utils.matToBitmap(tmp, bitmap);
if(flag){
try {
File root = null;
String state = Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
root = new File(Environment.getExternalStorageDirectory(), "aqib");
if(root == null){
Log.e(TAG, "root is null");
}
if(!root.exists()){
root.mkdirs();
}
}
if(root.exists()){
Log.e(TAG, "root exists");
}
File file = new File(root, "test.png");
OutputStream stream = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
stream.close();
flag = false;
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Log.e(TAG, e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
bitmap.recycle();
return mRgba;
}
}
Can anyone suggest me how to get correct output of the camera frame buffer so that I can use it for processing in opengl?
Upvotes: 0
Views: 877
Reputation: 651
Apparently the first frame is always a green frame in my case. Tried writing the frames from later like 10th or something like that, and it worked.
Upvotes: 0