【发布时间】:2016-07-19 19:47:39
【问题描述】:
我想构建一个像this 这样的应用程序。我想从这里绘制的矩形中绘制关键点。我怎样才能做到这一点?我想检测进入那个红色圆圈的物体,请帮助我实现这一目标。 这是我的代码`。
公共类 MainActivity 扩展 Activity 实现 CvCameraViewListener2 {
private MatOfPoint features;
private Mat mIntermediateMat;
private Mat mRgba;
private Mat mGray;
private org.opencv.core.Size wsize;
Mat descriptors ;
FeatureDetector featureDetector;
MatOfKeyPoint keyPoints;
DescriptorExtractor descriptorExtractor;
DescriptorMatcher descriptorMatcher;
protected static final String TAG = null;
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);
}
}
}
};
private JavaCameraView mOpenCvCameraView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mOpenCvCameraView = (JavaCameraView) findViewById(R.id.main_activity_surface_view);
mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
mOpenCvCameraView.setCvCameraViewListener(this);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public void onResume(){
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this, mLoaderCallBack);
}
public void onDestroy() {
super.onDestroy();
if (mOpenCvCameraView != null) {
mOpenCvCameraView.disableView();
}
}
@Override
public void onCameraViewStarted(int width, int height) {
mRgba = new Mat(height, width, CvType.CV_8UC4);
mIntermediateMat = new Mat(height, width, CvType.CV_8UC4);
mGray = new Mat(height, width, CvType.CV_8UC1);
featureDetector=FeatureDetector.create(FeatureDetector.DYNAMIC_ORB);
descriptorExtractor=DescriptorExtractor.create(DescriptorExtractor.ORB);
descriptorMatcher= DescriptorMatcher.create(6);
keyPoints = new MatOfKeyPoint();
descriptors = new Mat();
mIntermediateMat = new Mat();
features = new MatOfPoint();
}
@Override
public void onCameraViewStopped() {
}
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
mRgba = inputFrame.rgba();
//mGray = inputFrame.gray();
Mat mZoomWindow = mRgba.submat(140,320,100,380);
Imgproc.resize(mZoomWindow, mRgba, mRgba.size());
wsize = mZoomWindow.size();
Scalar color = new Scalar(255);
Imgproc.rectangle(mZoomWindow, new Point(1, 1), new Point(wsize.width - 2, wsize.height - 2), color, 2);
//Mat mask = new Mat(mZoomWindow.size(), CvType.CV_8U);
Mat mask = Mat.zeros(mRgba.size(), CvType.CV_8UC1);
/*boolean use_harris = true;
Imgproc.cvtColor(mRgba, mRgba, Imgproc.COLOR_RGBA2GRAY, 4);
Imgproc.goodFeaturesToTrack(mRgba, features ,100, 0.01, 10, mask , 8, use_harris , 0.06);
List<Point> drawFeature = features.toList();
for (int i = 0; i < drawFeature.size(); i++){
Point p = drawFeature.get(i);
Imgproc.circle(mRgba, p, 5, new Scalar(0,255,0));
}
//Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2RGBA, 4);
//mIntermediateMat.convertTo(mRgba, CvType.CV_8UC4, 1); */
Imgproc.cvtColor(mRgba, mRgba , Imgproc.COLOR_RGBA2RGB, 4);
featureDetector.detect(mRgba, keyPoints);
Features2d.drawKeypoints(mRgba, keyPoints, mask);
return mRgba;
}
} `
【问题讨论】:
-
您能否更具体地说明您想要实现的目标以及出了什么问题?您是否正在尝试绘制圆形和矩形,从相机源中识别特征等等...?
-
首先感谢您来到此页面并发表评论。我很感激你给了我时间来回答我的问题。我的问题是我想检测矩形区域中的特征,并且我想检测位于该矩形区域中的那些点的光流。基本上我正在为盲人建立室内运动应用程序。我认为我做错的是我必须为此使用 Surface Holder。你能帮我解决我的问题并指导我吗?因为我是软件工程的最后一年学生
-
这个问题在这一点上听起来有点宽泛。 Stackoverflow 不是家庭作业的帮助台。您将不得不在自己身上付出一些努力,并找出您遇到问题的关键领域。
-
我只想知道如何从视频流中的特定区域获取特征点?这可能吗?
标签: android image-processing opencv3.0 opencv4android opticalflow