Android studio3.6.1+ opencv3.4.1进行摄像头颜色识别的调试过程
本文过程建立在成功导入opencv3.4.1library并且成功运行打开摄像头的基础上的。在完成了验证并且使用opencv打开摄像头程序之后,剩下的就是java文件中代码的具体编写了,本人刚刚上手android学习,现在将一些简单的理解与在调试中遇到的困难记录如下,如有不足和错误之处欢迎大家留言交流。
一.一些调试长错误
1.在.xml文件中添加注释,删除注释快捷键
添加注释:选中你要注释的代码->ctrl+shift+/
去掉注释:选中你要去掉注释的代码->ctrl+shift+
2.activity名字的修改,以Main2Activity为例,
如果要修改名字,1.文件名要改2.manifest中注册的名字要改3.Main2Activity中对应的类名也要改–>
3.在进一步 activity_main.xml的名字不必与MainActivity对应,但是一般对应最好,方便查阅,但是调用是在MainActivity中声明的
4.在AndroidManifest.xml里面可以设置横竖屏的方式
5.一个activity对应一个xml,但是在这个activity中可以调用别的activity
二.在进行颜色识别时的过程
1.在官方的示例代码color-blob-detection中的两个java文件复制粘贴在你的相应位置中,其中我们可以将ColorBlobDetectionActivity.java改名成自己的MainActivity.java,但要注意在上方提到的几个位置进行修改,并于显示界面的文件xml对应上,否则就会报错。ColorBlobDetection.java个人理解就相当于是写好的一个类,我们调用其中的一些功能。
2.,官方的代码呢,是打开APP之后,先选中一个色块,然后去找到对应颜色的轮廓,并默认用红色的细线进行框出。
而我想实现的功能是:预先设置好颜色的阈值范围,然后识别出自己颜色的轮廓,并使用在其中心位置画出小矩形,而不是官网的一些opencv的教程提到的画出外接矩形,下面将自己的代码贴在下面,上面有自己在学习的工程中记录的一些注释,可能有些地方不太准确,欢迎交流
MainActivity.java
在这里插入代码片
package com.example.testopencvad;
import java.util.List;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.MatOfPoint;
import org.opencv.core.Point;
import org.opencv.core.Rect;
import org.opencv.core.Scalar;
import org.opencv.core.Size;
import org.opencv.android.CameraBridgeViewBase;
import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
import org.opencv.imgproc.Imgproc;
import org.opencv.imgproc.Moments;
import android.app.Activity;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnTouchListener;
import android.view.SurfaceView;
import static org.opencv.imgproc.Imgproc.CONTOURS_MATCH_I1;
import static org.opencv.imgproc.Imgproc.boundingRect;
public class MainActivity extends Activity implements OnTouchListener, CvCameraViewListener2 {
private static final String TAG = "colordetect";
private boolean mIsColorSelected = false;
private Mat mRgba;//两个mat对象
private Scalar mBlobColorRgba;
private Scalar mBlobColorHsv;
private ColorBlobDetector mDetector;
private Mat mSpectrum;
private Size SPECTRUM_SIZE;
private Scalar CONTOUR_COLOR;
private CameraBridgeViewBase mOpenCvCameraView;//opencv中的抽象类,类似于Android中的SurfaceView该类实现了两个接口:
// CvCameraViewListener CvCameraViewListener2这两个接口提供了回调处理,,开始和停止摄像机,,处理每一帧的拍摄
//要实现CameraBridgeViewBase有两个view,JavaCameraView NativeCameraView:是C++类,相较而言可以得到较高的帧速率
//为了画矩形框
private Mat mMat;
private int x;
private int y;
private int w;
private int h;
private Point mpoint;
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();
mOpenCvCameraView.setOnTouchListener(MainActivity.this);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
public MainActivity() {
Log.i(TAG, "Instantiated new " + this.getClass());
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "called onCreate")