Android和Java通性之OpenCV(角点检测综合)

12 篇文章 0 订阅

Android和Java通性之OpenCV(角点检测综合)

OpenCV大部分代码是用C写的,包括算法,只有部分是用Java写的,也是一个跨平台的计算机视觉库。

在这篇博客主要是看Java实现的那部分,如果要实现比较特殊的,或者自己实现算法,就得用JNI Java调用C来实现。

当然大部分Java实现的算法也是通过调用C实现的,但是大部分C没有做Java封装。

Android OpenCV项目结构:

 

以下是代码:

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;

import org.opencv.android.Utils;
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.Scalar;
import org.opencv.imgproc.Imgproc;

public class BaseFeatrue2DActivity extends AppCompatActivity {

    private ImageView baseprocessView=null;

    private ImageView processView1=null;
    private ImageView processView2=null;

    Bitmap baseBitmap=null;
    Mat baseMat=null;

    Bitmap processBitmap =null;
    Mat processMat =null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.base_feature2d);

        baseprocessView=(ImageView)findViewById(R.id.baseprocessView);

        processView1=(ImageView)findViewById(R.id.processView1);
        processView2=(ImageView)findViewById(R.id.processView2);




        /**
         * 原图
         */
        baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
        baseprocessView.setImageBitmap(baseBitmap);

        /**
         * Harris 角点检测子
         */
        baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
        baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC4);

        processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
        processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC4);

        Mat cornerHarris=new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC4);

        Utils.bitmapToMat(baseBitmap,baseMat,true);

        Imgproc.cvtColor(baseMat, processMat,Imgproc.COLOR_BGR2GRAY);

        Imgproc.cornerHarris(processMat,cornerHarris,2,3,0.04, 1);

        Core.normalize(cornerHarris,cornerHarris,0,225,Core.NORM_MINMAX,CvType.CV_32FC1,new Mat());

        Core.convertScaleAbs(cornerHarris,cornerHarris);

        Mat resultMat=baseMat.clone();
        for( int j = 0; j < resultMat.rows() ; j++ ) {
            for( int i = 0; i < resultMat.cols(); i++ ) {
                  if((cornerHarris.get(j,i).clone()[0]>200)){
                      Imgproc.circle(resultMat, new Point(i,j), 1, new Scalar(0,0,255),Imgproc.FILLED);
                  }
            }
        }

        Utils.matToBitmap(resultMat, processBitmap,true);
        processView1.setImageBitmap(processBitmap);
        baseMat.release();
        processMat.release();
        baseBitmap.recycle();

        /**
         * Shi-Tomasi 角点检测子
         */
        baseBitmap= BitmapFactory.decodeResource(this.getResources(),R.mipmap.test);
        baseMat=new Mat(baseBitmap.getWidth(),baseBitmap.getHeight(), CvType.CV_8UC4);

        processBitmap = Bitmap.createBitmap(baseBitmap.getWidth(), baseBitmap.getHeight(), Bitmap.Config.RGB_565);
        processMat =new Mat(processBitmap.getWidth(), processBitmap.getHeight(), CvType.CV_8UC4);

        Utils.bitmapToMat(baseBitmap,baseMat,true);

        Imgproc.cvtColor(baseMat, processMat,Imgproc.COLOR_BGR2GRAY,4);

        MatOfPoint corners=new MatOfPoint();
        Imgproc.goodFeaturesToTrack(processMat, corners, 200, 0.01, 10, new Mat(), 3, 5, false, 0.04);

        int[] cornersData = new int[(int) (corners.total() * corners.channels())];
        corners.get(0, 0, cornersData);
        for (int i = 0; i < corners.rows(); i++) {
            Imgproc.circle(baseMat, new Point(cornersData[i * 2], cornersData[i * 2 + 1]), 3, new Scalar(0, 0,255), Imgproc.FILLED);
        }

        Utils.matToBitmap(baseMat, processBitmap,true);
        processView2.setImageBitmap(processBitmap);
        baseMat.release();
        processMat.release();
        baseBitmap.recycle();
    }
}

结果图:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Frank浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值