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()图像:
阅读全文
0 0
- opencv android java端开发demo
- Android Studio 通过 Java api开发opencv
- Android ndk 开发demo
- Android开发效果Demo
- webrtc android demo开发
- webrtc android demo开发
- android开发---8.framework层的java应用接口demo
- Android NDK开发之 java,Android,NDK,opencv 环境配置
- OpenCV+ADT 第一个基于Android的OpenCV Demo
- OpenCV+Android开发配置
- Opencv开发android应用
- OpenCV的Android开发
- opencv for android开发
- Android opencv开发 opencvmanager
- android开发MediaPlayer用法demo
- Android 指纹识别App开发demo
- Android Studio-—使用OpenCV的配置方法和demo以及开发过程中遇到的问题解决
- android NDK开发demo(基于android )
- Android 常用权限
- 笨叔叔,你给我虚拟内存,哄小孩啊?
- Bug Check 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION
- Nginx的配置使用,启动、重启、关闭,以及路径配置
- error : Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in
- opencv android java端开发demo
- Windows下cmd黑窗口命令及用法
- [笔记]: 线段树
- Integer to Roman
- 调试内存泄漏
- 中兴4g模块me3620拨号
- 前端ajax请求添加rsa签名,nodejs请求添加签名,nodejs api添加验签
- ubuntu下jdk安装
- Gear VR推出移动冒险InMind 2