使用opencv4android,如何在打开相机时自动切出视频帧
Using opencv4android,how to cut out video frame automatically when the camera is opened
官方SDK中有一个可以截取视频帧的示例。
主要代码如下:
@SuppressLint("SimpleDateFormat")
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG,"onTouch event");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String currentDateandTime = sdf.format(new Date());
String fileName = Environment.getExternalStorageDirectory().getPath() +
"/sample_picture_" + currentDateandTime + ".jpg";
mOpenCvCameraView.takePicture(fileName);
Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
return false;
}
现在想改成自动剪出视频帧的样例。我评论了上面的代码并更改了名为
onManagerConnected.The变化如下:
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
String filename = Environment.getExternalStorageDirectory().getPath()+"test"+".jpg";
mOpenCvCameraView.takePicture(filename);
Log.i(TAG, filename);
// mOpenCvCameraView.setOnTouchListener(Tutorial3Activity.this);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
然后抛出 nullpointException 显示 var "mPictureFileName" 和 "mCamera" 为空。
public void takePicture(final String fileName) {
Log.i(TAG, "Taking picture");
mPictureFileName = fileName;
// Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture.
// Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue
mCamera.setPreviewCallback(null);
// PictureCallback is implemented by the current class
mCamera.takePicture(null, null, this);
}
无论如何!
感谢解答!
视图打开时,摄像头不在initating.So您无法在方法"initating"中剪切视频。
我将这些代码移至方法 "onCameraFrame".Done!
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
String filename = null;
filename = Environment.getExternalStorageDirectory().getPath()+"/test"+i+".jpg";
mOpenCvCameraView.takePicture(filename);
Log.d("camera", filename);
return inputFrame.rgba();
}
官方SDK中有一个可以截取视频帧的示例。 主要代码如下:
@SuppressLint("SimpleDateFormat")
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i(TAG,"onTouch event");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss");
String currentDateandTime = sdf.format(new Date());
String fileName = Environment.getExternalStorageDirectory().getPath() +
"/sample_picture_" + currentDateandTime + ".jpg";
mOpenCvCameraView.takePicture(fileName);
Toast.makeText(this, fileName + " saved", Toast.LENGTH_SHORT).show();
return false;
}
现在想改成自动剪出视频帧的样例。我评论了上面的代码并更改了名为 onManagerConnected.The变化如下:
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
String filename = Environment.getExternalStorageDirectory().getPath()+"test"+".jpg";
mOpenCvCameraView.takePicture(filename);
Log.i(TAG, filename);
// mOpenCvCameraView.setOnTouchListener(Tutorial3Activity.this);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
然后抛出 nullpointException 显示 var "mPictureFileName" 和 "mCamera" 为空。
public void takePicture(final String fileName) {
Log.i(TAG, "Taking picture");
mPictureFileName = fileName;
// Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture.
// Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue
mCamera.setPreviewCallback(null);
// PictureCallback is implemented by the current class
mCamera.takePicture(null, null, this);
}
无论如何!
感谢解答!
视图打开时,摄像头不在initating.So您无法在方法"initating"中剪切视频。 我将这些代码移至方法 "onCameraFrame".Done!
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
String filename = null;
filename = Environment.getExternalStorageDirectory().getPath()+"/test"+i+".jpg";
mOpenCvCameraView.takePicture(filename);
Log.d("camera", filename);
return inputFrame.rgba();
}