Javacv:Mat数据在使用方法后变为null
我正在开发一个用于物体检测和计数的android应用程序。对于图像处理,我使用JavaCV(OpenCV和FFmpeg的Java包装器)。导入库之后,我能够成功地使用FFmpegFrameGrabber获取视频帧 我的问题:将帧转换为Mat对象并对该Mat对象执行某些操作后,数据变为空 代码: main活动Javacv:Mat数据在使用方法后变为null,java,android,opencv,ffmpeg,javacv,Java,Android,Opencv,Ffmpeg,Javacv,我正在开发一个用于物体检测和计数的android应用程序。对于图像处理,我使用JavaCV(OpenCV和FFmpeg的Java包装器)。导入库之后,我能够成功地使用FFmpegFrameGrabber获取视频帧 我的问题:将帧转换为Mat对象并对该Mat对象执行某些操作后,数据变为空 代码: main活动 public类MainActivity扩展了AppCompatActivity{ OpenCVFrameConverter.ToMat converterToMat=新的OpenCVFra
public类MainActivity扩展了AppCompatActivity{
OpenCVFrameConverter.ToMat converterToMat=新的OpenCVFrameConverter.ToMat();
私有计数模块;
FFmpegFrameGrabber检索器;
阵列列表框架;
boolean frameloaded=false;
File folder=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY\u);
文件视频=新文件(文件夹“test.mp4”);
AndroidFrameConverter converterToBitmap=新的AndroidFrameConverter();
私有静态WebStreamer WebStreamer;
静止的{
加载库(“本机库”);
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终按钮按钮=(按钮)findViewById(R.id.btnLdFrames);
最终ImageView img=(ImageView)findViewById(R.id.ImageView);
setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
((文本视图)按钮).setText(“加载”);
新线程(newrunnable()){
公开募捐{
试一试{
按钮。可点击设置(错误);
按钮。setAlpha((浮动)0.3);
装载框架();
按钮。setAlpha((浮动)1);
}catch(FrameGrabber.e异常){
e、 printStackTrace();
}
}
}).start();
}
});
}
私有void LoadFrames()抛出FrameGrabber.Exception{
如果(!frameloaded){
frameloaded=true;
检索器=新的FFmpegFrameGrabber(视频);
frames=newarraylist();
Log.d(“帧”,“循环开始”);
retriever.start();
最终ImageView img=(ImageView)findViewById(R.id.ImageView);
对于(int i=0;我为什么不使用?一开始我使用OpenCV4Android sdk,但后来我需要FFmpeg,所以我切换到JavaCV。好的,我没有用JavaCV编码,但我在GitHub上看了一个例子,另外,看看为什么不使用?一开始我使用OpenCV4Android sdk,但后来我需要FFmpeg,所以我切换到JavaCV。好的,我没有用Ja编码但是我在GitHub上看了一个例子,看看
public class MainActivity extends AppCompatActivity {
OpenCVFrameConverter.ToMat converterToMat = new OpenCVFrameConverter.ToMat();
private CountModule countModule;
FFmpegFrameGrabber retriever;
ArrayList<opencv_core.Mat> frames;
boolean frameloaded = false;
File folder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);
File video = new File(folder, "test.mp4");
AndroidFrameConverter converterToBitmap = new AndroidFrameConverter();
private static WebStreamer webStreamer;
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button = (Button) findViewById(R.id.btnLdFrames);
final ImageView img = (ImageView) findViewById(R.id.imageView);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
((TextView) button).setText("Loading");
new Thread(new Runnable() {
public void run() {
try {
button.setClickable(false);
button.setAlpha((float) 0.3);
LoadFrames();
button.setAlpha((float) 1);
} catch (FrameGrabber.Exception e) {
e.printStackTrace();
}
}
}).start();
}
});
}
private void LoadFrames() throws FrameGrabber.Exception {
if (!frameloaded){
frameloaded = true;
retriever = new FFmpegFrameGrabber(video);
frames = new ArrayList<>();
Log.d("Frame",": Start of loop");
retriever.start();
final ImageView img = (ImageView) findViewById(R.id.imageView);
for (int i=0;i<50;i++){//155430
retriever.setFrameNumber(i*100);
Frame temp = new Frame();
temp = retriever.grab();
frames.add(converterToMat.convert(temp));
Log.d("Frame",": " + i*100);
}
retriever.stop();
countModule = new CountModule(frames);
Log.d("Frame","CountModule instantiated");
}
}
}
public CountModule(ArrayList<Mat> frames){
fgGBG = new Mat(frames.get(0).rows(),frames.get(0).cols(),frames.get(0).type());
gbg = createBackgroundSubtractorMOG2();
Mat maTemp = new Mat(frames.get(0).rows(),frames.get(0).cols(),frames.get(0).type());
median = new Mat(frames.get(0).rows(),frames.get(0).cols(),frames.get(0).type());
frames.get(0).copyTo(median);
;
median = getMedian(frames);
kernel2 = Mat.ones(11,11,CV_8U).asMat();
kernel = Mat.ones(3,1,CV_8U).asMat();
gbg.apply(median,fgGBG,0.001);
}