opencv android java端开发demo

opencv android java端开发demo

demo: http://download.csdn.net/detail/keen_zuxwang/9847391

Canny Sobel Hist Camera的java端简单应用
使用的OpenCV4Android库:OpenCV-2.4.9-android-sdk

AndroidManifest.xml(添加camera权限):

Tutorial1Activity.java:

public class Tutorial1Activity extends Activity implements CvCameraViewListener2 {
    ...

    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();
                    } 
                    break;
               default:{
                       super.onManagerConnected(status);
                    } 
                    break;
           }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.i(TAG, "called onCreate");
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

        setContentView(R.layout.tutorial1_surface_view);

        mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.tutorial1_activity_java_surface_view);
        //mOpenCvCameraView.setVisibility(SurfaceView.VISIBLE);
        mOpenCvCameraView.setCvCameraViewListener(this);


        Button doBtnf = (Button)findViewById(R.id.doBtnf);
        doBtnf.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 初始化数据
                if(mOpenCvCameraView.isShown()){
                    mOpenCvCameraView.setVisibility(View.GONE);
                    layout_img.setVisibility(View.VISIBLE);
                }
                mat1 = new Mat();
                mat2 = new Mat();
                Mat mat3 = new Mat();
                Mat mat1Sub = new Mat();

                // 加载图片
                Bitmap bt1 = BitmapFactory.decodeResource(getResources(),R.drawable.avastar);
                Bitmap bt2 = BitmapFactory.decodeResource(getResources(),R.drawable.default_load_img);
                Bitmap bt3 = null;

                // 转换数据
                Utils.bitmapToMat(bt1, mat1);
                Utils.bitmapToMat(bt2, mat2);

                //兴趣区域裁剪 
                // public Rect(int x, int y, int width, int height);
                Rect rec = new Rect((mat1.cols()-mat2.cols())/2, (mat1.rows()-mat2.rows())/2, mat2.cols(), mat2.rows());
                // submat(y坐标, 图片2的高, x坐标,图片2的宽);

                //mat1Sub = mat1.submat(rec); // public Mat submat(Rect roi);
                //mat2.copyTo(mat1Sub);       // public void copyTo(Mat m);

                //Imgproc.cvtColor(mat1, mat1, Imgproc.COLOR_RGBA2GRAY, 1); 

                //public static void Canny(Mat image, Mat edges, double threshold1, double threshold2);
                Imgproc.Canny(mat1, mat3, 80, 125); // 不经过灰度图转换,直接使用Canny边缘检测,mat3输出是二值图,白色即为边缘区域   

                bt3 = Bitmap.createBitmap(mat3.cols(), mat3.rows(), Config.RGB_565); //Config.RGB_565
                Utils.matToBitmap(mat3, bt3); //转化为android识别的图像数据,bt3的宽高要和mat1一至
                iv1.setImageBitmap(bt1);
                iv2.setImageBitmap(bt3);
            }
        });

        Button doBtns = (Button)findViewById(R.id.doBtns);
        doBtns.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 初始化数据
                if(mOpenCvCameraView.isShown()){
                    mOpenCvCameraView.setVisibility(View.GONE);
                    layout_img.setVisibility(View.VISIBLE);
                }
                mat1 = new Mat();
                mat2 = new Mat();
                Mat grayMat = new Mat();
                Mat mIntermediateMat = new Mat();
                Mat mat1Sub = new Mat();

                // 加载图片
                Bitmap bt1 = BitmapFactory.decodeResource(getResources(),R.drawable.avastar);
                Bitmap bt2 = BitmapFactory.decodeResource(getResources(),R.drawable.default_load_img);
                Bitmap bt3 = null;

                // 转换数据
                Utils.bitmapToMat(bt1, mat1);
                Utils.bitmapToMat(bt2, mat2);

                //加权, 可实现水印效果
                Rect rec = new Rect((mat1.cols()-mat2.cols())/2, (mat1.rows()-mat2.rows())/2, mat2.cols(), mat2.rows());
                mat1Sub=mat1.submat(rec);
                //public static void addWeighted(Mat src1, double alpha, Mat src2, double beta, double gamma, Mat dst);
                //dst = src1*alpha + src2*beta + gamma;
                Core.addWeighted(mat1Sub, 1, mat2, 0.7, 0.5, mat1Sub);

                //public static void cvtColor(Mat src, Mat dst, int code);
                //public static void cvtColor(Mat src, Mat dst, int code, int dstCn);
                //code(color space conversion such as):
                //COLOR_BGR2GRAY = 6,
                //COLOR_RGB2GRAY = 7,
                //COLOR_GRAY2BGR = 8,
                //COLOR_GRAY2RGB = COLOR_GRAY2BGR,
                //COLOR_GRAY2BGRA = 9,
                //COLOR_GRAY2RGBA = COLOR_GRAY2BGRA,
                //COLOR_BGRA2GRAY = 10,
                //COLOR_RGBA2GRAY = 11,
                Imgproc.cvtColor(mat1, grayMat, Imgproc.COLOR_RGBA2GRAY, 1); // RGBA GRAY 灰度图

                //public static void Sobel(Mat src, Mat dst, int ddepth, int dx, int dy);
                // ddepth: type depth constants
                //CV_8U = 0, CV_8S = 1,
                //CV_16U = 2, CV_16S = 3,
                //CV_32F = 5,
                //CV_64F = 6, 
                //CV_USRTYPE1 = 7;
                Imgproc.Sobel(grayMat, mIntermediateMat, grayMat.depth(), 1, 1); // 边缘检测 CvType.CV_8U   
                Core.convertScaleAbs(mIntermediateMat, mIntermediateMat, 10, 0); //梯度绝对值,凸出边缘
                Imgproc.cvtColor(mIntermediateMat, mat1, Imgproc.COLOR_GRAY2BGRA, 4);
                grayMat.release();
                mIntermediateMat.release();

                bt3 = Bitmap.createBitmap(mat1.cols(), mat1.rows(), Config.RGB_565);
                Utils.matToBitmap(mat1, bt3); //转化为android识别的图像数据,注意bt3的宽高要和mat1一至
                iv1.setImageBitmap(bt1);
                iv2.setImageBitmap(bt3);
            }
        });

        Button doBtnt = (Button)findViewById(R.id.doBtnt);
        doBtnt.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                // 初始化数据
                if(mOpenCvCameraView.isShown()){
                    mOpenCvCameraView.setVisibility(View.GONE);
                    layout_img.setVisibility(View.VISIBLE);
                }
                mat1 = new Mat();
                mat2 = new Mat();
                Mat mat3 = new Mat();
                Mat mat1Sub = new Mat();

                mChannels = new MatOfInt[] { new MatOfInt(0), new MatOfInt(1), new MatOfInt(2) };
                mBuff     = new float[mHistSizeNum];
                mHistSize = new MatOfInt(mHistSizeNum);
                mRanges = new MatOfFloat(0f, 256f);
                mMat0   = new Mat();
                mP1     = new Point();
                mP2     = new Point();
                mWhilte = Scalar.all(255);
                mColorsRGB = new Scalar[] { new Scalar(200, 0, 0, 255), new Scalar(0, 200, 0, 255), new Scalar(0, 0, 200, 255) };
                mColorsHue = new Scalar[] {
                     new Scalar(255, 0, 0, 255),   new Scalar(255, 60, 0, 255),  new Scalar(255, 120, 0, 255), new Scalar(255, 180, 0, 255), new Scalar(255, 240, 0, 255),
                     new Scalar(215, 213, 0, 255), new Scalar(150, 255, 0, 255), new Scalar(85, 255, 0, 255),  new Scalar(20, 255, 0, 255),  new Scalar(0, 255, 30, 255),
                     new Scalar(0, 255, 85, 255),  new Scalar(0, 255, 150, 255), new Scalar(0, 255, 215, 255), new Scalar(0, 234, 255, 255), new Scalar(0, 170, 255, 255),
                     new Scalar(0, 120, 255, 255), new Scalar(0, 60, 255, 255),  new Scalar(0, 0, 255, 255),   new Scalar(64, 0, 255, 255),  new Scalar(120, 0, 255, 255),
                     new Scalar(180, 0, 255, 255), new Scalar(255, 0, 255, 255), new Scalar(255, 0, 215, 255), new Scalar(255, 0, 85, 255),  new Scalar(255, 0, 0, 255)
                };

                // 加载图片
                Bitmap bt1 = BitmapFactory.decodeResource(getResources(),R.drawable.item_one);
                Bitmap bt3 = null;

                // 转换数据
                Utils.bitmapToMat(bt1, mat2);
                Imgproc.cvtColor(mat2, mat1, Imgproc.COLOR_RGB2GRAY, 4);

                bt3 = Bitmap.createBitmap(mat2.cols(), mat2.rows(), Config.RGB_565);
                //Utils.matToBitmap(mat1, bt3);

                Size sizeRgba = mat1.size();

                Log.w("output size", "sizeRgba = "+sizeRgba.width+", "+sizeRgba.height);

                Mat hist = new Mat();
                int thikness = (int) (sizeRgba.width / (mHistSizeNum + 10) / 5);
                if(thikness > 5) 
                    thikness = 5;
                int offset = (int) ((sizeRgba.width - (5*mHistSizeNum + 4*10)*thikness)/2);

                // RGB
                for(int c=0; c<1; c++) {
                    Imgproc.calcHist(Arrays.asList(mat1), mChannels[c], mMat0, hist, mHistSize, mRanges);
                    Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
                    hist.get(0, 0, mBuff);
                    for(int h=0; h<mHistSizeNum; h++) 
                    {
                        mP1.x = mP2.x = offset + (c * (mHistSizeNum + 10) + h) * thikness;
                        mP1.y = sizeRgba.height-1;
                        mP2.y = mP1.y - 2 - (int)mBuff[h];
                        Core.line(mat1, mP1, mP2, mColorsRGB[c], thikness);
                    }
                }

                // Value and Hue
                Imgproc.cvtColor(mat2, mat3, Imgproc.COLOR_RGB2HSV_FULL);

                //public static void calcHist(List<Mat> images, MatOfInt channels, Mat mask, 
                //                            Mat hist, MatOfInt histSize, MatOfFloat ranges)
                //功能:计算直方图(直方图是图像中像素强度分布的图形表达方式,它统计了每一个强度值所具有的像素个数)
                Imgproc.calcHist(Arrays.asList(mat3), mChannels[2], mMat0, hist, mHistSize, mRanges);

                //public static void normalize(Mat src, Mat dst, double alpha, double beta, int norm_type)
                //功能: 把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内
                //norm_type: 
                //NORM_INF = 1,
                //NORM_L1 = 2,
                //NORM_L2 = 4,
                //NORM_L2SQR = 5,
                //NORM_HAMMING = 6,
                //NORM_HAMMING2 = 7,
                //NORM_TYPE_MASK = 7,
                //NORM_RELATIVE = 8,
                //NORM_MINMAX = 32,
                Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
                hist.get(0, 0, mBuff);
                for(int h=0; h<mHistSizeNum; h++) {
                    mP1.x = mP2.x = offset + (3 * (mHistSizeNum + 10) + h) * thikness;
                    mP1.y = sizeRgba.height-1;
                    mP2.y = mP1.y - 2 - (int)mBuff[h];
                    Core.line(mat1, mP1, mP2, mWhilte, thikness);
                }

                // Hue
                Imgproc.calcHist(Arrays.asList(mat3), mChannels[0], mMat0, hist, mHistSize, mRanges);
                Core.normalize(hist, hist, sizeRgba.height/2, 0, Core.NORM_INF);
                hist.get(0, 0, mBuff);
                for(int h=0; h<mHistSizeNum; h++) {
                    mP1.x = mP2.x = offset + (4 * (mHistSizeNum + 10) + h) * thikness;
                    mP1.y = sizeRgba.height-1;
                    mP2.y = mP1.y - 2 - (int)mBuff[h];
                    Core.line(mat1, mP1, mP2, mColorsHue[h], thikness);
                }

                Utils.matToBitmap(mat1, bt3);
                iv1.setImageBitmap(bt1);
                iv2.setImageBitmap(bt3);
            }
        });

        layout_img=(LinearLayout)findViewById(R.id.layout_img);

        Button doCamera = (Button)findViewById(R.id.doCamera);
        doCamera.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                 layout_img.setVisibility(View.GONE);
                 mOpenCvCameraView.setVisibility(View.VISIBLE);

                 mOpenCvCameraView.enableView();
            }
        });
        iv1=(ImageView)findViewById(R.id.image0);
        //iv1.setImageResource(R.drawable.avastar);
        iv2=(ImageView)findViewById(R.id.image1);
        iv3=(ImageView)findViewById(R.id.image2);
    }

    @Override
    public void onPause()
    {
        super.onPause();
        if(mOpenCvCameraView != null){
           mOpenCvCameraView.disableView();
        }
    }

    @Override
    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_2_4_3, 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();
        }
    }

    public void onCameraViewStarted(int width, int height) {}

    public void onCameraViewStopped() {}

    public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
        return inputFrame.rgba();  // camera显示rgba数据
    }
}

摄像头调用:
这里写图片描述

Imgproc.Canny()图像:
这里写图片描述

Imgproc.Sobel()图像:
这里写图片描述

Imgproc.calcHist()+ Core.normalize()图像:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值