要实现Android OpenCV识别建筑物的部分,可以按照以下步骤进行:
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.MatOfRect;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.core.CvType;
import org.opencv.objdetect.CascadeClassifier;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.CameraBridgeViewBase;
private CascadeClassifier cascadeClassifier;
private Mat grayscaleImage;
private int absoluteFaceSize;
private CameraBridgeViewBase mOpenCvCameraView;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
initializeOpenCVDependencies();
break;
}
default: {
super.onManagerConnected(status);
break;
}
}
}
};
@Override
protected void onResume() {
super.onResume();
OpenCVLoader.initDebug();
if (!OpenCVLoader.initDebug()) {
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION, this, mLoaderCallback);
} else {
mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
}
}
private void initializeOpenCVDependencies() {
try {
// 加载分类器
InputStream is = getResources().openRawResource(R.raw.cascade_classifier);
File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
File cascadeFile = new File(cascadeDir, "cascade.xml");
FileOutputStream fos = new FileOutputStream(cascadeFile);
byte[] buffer = new byte[4096];
int bytesRead;
while ((bytesRead = is.read(buffer)) != -1) {
fos.write(buffer, 0, bytesRead);
}
is.close();
fos.close();
cascadeClassifier = new CascadeClassifier(cascadeFile.getAbsolutePath());
cascadeClassifier.load(cascadeFile.getAbsolutePath());
// 初始化相机视图
mOpenCvCameraView.enableView();
} catch (Exception e) {
e.printStackTrace();
}
}
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
initializeOpenCVDependencies();
break;
}
default: {
super.onManagerConnected(status);
break;
}
}
}
};
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
initializeOpenCVDependencies();
break;
}
default: {
super.onManagerConnected(status);
break;
}
}
}
};
private CvCameraViewListener2 mCameraViewListener = new CvCameraViewListener2() {
@Override
public void onCameraViewStarted(int width, int height) {
grayscaleImage = new Mat(height, width, CvType.CV_8UC4);
absoluteFaceSize = (int) (height * 0.2);
}
@Override
public void onCameraViewStopped() {
grayscaleImage.release();
}
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat frame = inputFrame.rgba();
Imgproc.cvtColor(frame, grayscaleImage, Imgproc.COLOR_RGBA2GRAY);
MatOfRect buildings = new MatOfRect();
上一篇:Android NotificationListenerService#onNotificationRemoved(..., int reason)未被系统调用。
下一篇:Android OREO - java.lang.SecurityException: 找不到用户0的提供程序;预期为此授权找到有效的ContentProvider。