刚开始学习Android,由于之前比较熟悉OpenCV,于是就想先在Android上运行OpenCV试试
===================================================================================
1.环境配置
- JDK
- Eclipse
- ADT
- CDT
- Android SDK
- Android NDK
- cygwin
- OpenCV for Android 2.4.9
这部分网上很多,我就不再赘述了,可以参考:http://blog.csdn.net/pwh0996/article/details/8957764
2.开发准备
两点注意
- 新版安装SDK文件一开始有两个XML文件,activity_main.xml和fragment_main.xml:不习惯的可以这样处理:
- 删除fragment_main.xml整个文件
- 对activity_main.xml,删除里面的内容。然后切换到Graphy Layout,放入一个LinearLayout就可以
- 对MainActivity.java,可以删除部分的内容,再把MainActivity extends ActionBarActivity 改为MainActivity extends Activity
- (关于activity_main.xml与fragment_main.xml的问题参看:http://bbs.csdn.net/topics/390740123)
-
引入OpenCV库Package Explorer中选择项目,单击右键在弹出菜单中选择Properties,然后在弹出的Properties窗口中左侧选择Android,然后点击右下方的Add按钮,选择OpenCV Library 2.4.9并点击OK,操作完成后,会将OpenCV类库添加到GrayProcess的Android Dependencies中
3.编写程序
目的是实现通过OpenCV for Android实现摄像头采集图像的处理,并通过SurfaceView显示在手机屏幕上
OpenCV的Android库将Android自身的相机相关的库进行了封装,用起来十分方便
Java文件:
- CameraBridgeViewBase .enableView()
- SurfaceView is available
- CameraBridgeViewBase .setVisibility(SurfaceView.Visiable)
- CameraBridgeViewBase .setCvCameraViewListener(this)
就可以使用回调函数
- onCameraViewStarted
- onCameraViewStopped
图像处理写在
- public Mat onCameraFrame(CvCameraViewFrame inputFrame)
public class MainActivity extends Activity implements CvCameraViewListener2 {
private static final String TAG = "OCVSample::Activity";
private CameraBridgeViewBase mOpenCvCameraView;
private boolean mIsJavaCamera = true;
private MenuItem mItemSwitchCamera = null;
private Mat mRgba;
private Button mBtn = null;
private boolean isProcess = false;
//建立连接
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();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
//构造函数
public MainActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
/** Called when the activity is first created. */
//onCreate函数
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate");
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutP