opencv android java端开发demo

来源:互联网 发布:淘宝物流评价怎么修改 编辑:程序博客网 时间:2024/05/16 12:07

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()图像:
这里写图片描述