最近搞一个opencv笑脸识别的项目,由于是新手不太懂就慢慢的从最基本的开始,所以调用opencv的摄像头成为关键。好吧,那就开始简单的弄一个调用摄像头demo。(这也是我写的第一个博客,写的不好希望大家见谅)
1.首先,开发环境是必须的,我想搞Android开发的,环境搭配应该是不是问题吧(本demo不需要NDK)。
2.准备好Opencv_android_sdk ,可以到https://opencv.org/这里下载,使用时需要安装manage akp(我使用的是Opencv 3.3.0的)。
3.接下来就是正式开始建立工程了。
首先建立一个工程:
导入opencv_lib项目 :
选择sdk确定,把opencv_lib库导入,导入后也许你的opencv_lib工程会报错,那么你可以点击该工程,选择properties修改Android版本,其原因是opencv中android.hardware.camera2库低版本的不支持,因此调高其Android版本。
接下来就可以把opencv_lib添加到我们的自己的工程里去了。点我们的工程选择properties->Android->Add->Open CV Library,添加进来就ok了。
接下来我的layout布局:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:opencv="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<org.opencv.android.JavaCameraView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:visibility="gone"
android:id="@+id/tutorial1_activity_java_surface_view"/>
</FrameLayout>
再是MainActivity的代码
public class MainActivity extends Activity implements CvCameraViewListener2 {
private static final String TAG = "OC::Activity";
private CameraBridgeViewBase mOpenCvCameraView;
//回调
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
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() {
// TODO Auto-generated constructor stub
Log.i(TAG, "Instantiated new " + this.getClass());
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}
//弹出对话 dialog
public void ponPause() {
super.onPause();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
//恢复 回调
public void onResume() {
super.onResume();
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
} else {
Log.d(TAG, "OpenCV library found inside package. Using it!");
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null)
mOpenCvCameraView.disableView();
}
@Override
public void onCameraViewStarted(int width, int height) {
// TODO Auto-generated method stub
}
@Override
public void onCameraViewStopped() {
// TODO Auto-generated method stub
}
/*
* (non-Javadoc)
* 图像处理,ndk开发也可以在这里进行图像处理
* @see org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2#onCameraFrame(org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame)
*/
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
// TODO Auto-generated method stub
return inputFrame.rgba();
}
}
到这里就差不多基本大功告成了。
嗯还有xml文件没有写,最后在AndroidMakefile中添加
android:configChanges="keyboardHidden|orientation"
android:screenOrientation="landscape" //屏幕的控制
<uses-permission android:name="android.permission.CAMERA" /> //开启摄像头权限
这就大功告成了,在运行demo之前应该安装opencv提供的manage ,那么一个简单的opencv调用摄像头功能就完成了。
看看成果吧0.0
最后,希望我的写的对你们有用,也希望大家在进入新的事物中时还是仔细学习官方提供的资料!!!