【Android】JavaCV and OpenCV
来源:互联网 发布:ubuntu安装deb软件命令 编辑:程序博客网 时间:2024/05/16 07:54
package com.d.takephoto;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.os.Environment;import android.provider.MediaStore;import android.support.v7.app.ActionBar;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.RelativeLayout;import com.googlecode.javacv.cpp.opencv_core;import com.googlecode.javacv.cpp.opencv_imgproc;import org.opencv.android.BaseLoaderCallback;import org.opencv.android.LoaderCallbackInterface;import org.opencv.android.OpenCVLoader;import org.opencv.android.Utils;import org.opencv.core.Core;import org.opencv.core.CvType;import org.opencv.core.Mat;import org.opencv.core.MatOfFloat;import org.opencv.core.MatOfInt;import org.opencv.core.MatOfRect;import org.opencv.core.Point;import org.opencv.core.Rect;import org.opencv.core.Scalar;import org.opencv.core.Size;import org.opencv.imgproc.Imgproc;import org.opencv.objdetect.CascadeClassifier;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.ArrayList;import java.util.Random;//public class MainActivity extends AppCompatActivity {public class MainActivity extends Activity { public static final int TAKE_PHOTO = 1; //public static final int CROP_PHOTO = 2; private CascadeClassifier cascadeClassifier; private Button takephoto; private ImageView picture; private ImageView picture2; private ImageView picture3; private Uri imageUri; Mat imageMat; private static final String TAG = "OCVSample::Activity"; private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) { @Override public void onManagerConnected(int status) { switch (status) { case LoaderCallbackInterface.SUCCESS: { Log.i(TAG, "OpenCV loaded successfully"); imageMat=new Mat(); //加载人脸检测xml try { // Copy the resource into a temp file so OpenCV can load it InputStream is = getResources().openRawResource(R.raw.haarcascade_frontalface_alt); File cascadeDir = getDir("cascade", Context.MODE_PRIVATE); File mCascadeFile = new File(cascadeDir, "haarcascade_frontalface_alt.xml"); FileOutputStream os = new FileOutputStream(mCascadeFile); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = is.read(buffer)) != -1) { os.write(buffer, 0, bytesRead); } is.close(); os.close(); // Load the cascade classifier cascadeClassifier = new CascadeClassifier(mCascadeFile.getAbsolutePath()); } catch (Exception e) { Log.e("OpenCVActivity", "Error loading cascade", e); } } break; default: { super.onManagerConnected(status); } break; } } }; @Override public void onResume() { super.onResume(); if (!OpenCVLoader.initDebug()) { Log.d("OpenCV", "Internal OpenCV library not found. Using OpenCV Manager for initialization"); OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, this, mLoaderCallback); } else { Log.d("OpenCV", "OpenCV library found inside package. Using it!"); mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); takephoto = (Button)findViewById(R.id.take_photo); picture = (ImageView)findViewById(R.id.imageView); picture2 = (ImageView)findViewById(R.id.imageView2); RelativeLayout.LayoutParams param0 = new RelativeLayout.LayoutParams(500, 650); picture.setLayoutParams(param0); //RelativeLayout.LayoutParams param1 = new RelativeLayout.LayoutParams(500, 650); //picture2.setLayoutParams(param1); takephoto.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { File outputImage = new File(Environment.getExternalStorageDirectory(), "output_image.jpg"); try { if (outputImage.exists()) { outputImage.delete(); } outputImage.createNewFile(); }catch (IOException e){ e.printStackTrace(); } imageUri = Uri.fromFile(outputImage); Intent intent = new Intent("android.media.action.IMAGE_CAPTURE"); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); startActivityForResult(intent, TAKE_PHOTO); } }); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data){ switch (requestCode){ case TAKE_PHOTO: //if (resultCode == RESULT_OK){ //Intent intent = new Intent("com.android.camera.action.CROP"); //intent.setDataAndType(imageUri, "image/*"); // intent.putExtra("scale", true); //intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); //startActivityForResult(intent, CROP_PHOTO); //} //break; //case CROP_PHOTO: //if (resultCode == RESULT_OK){ try{ //获取原图 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri)); Mat mat_src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4); Utils.bitmapToMat(bitmap, mat_src); int nnHeight = bitmap.getHeight()/10; int nnWidth = bitmap.getWidth()/10; Mat mat_bits = new Mat(nnHeight, nnWidth, CvType.CV_8UC4); Imgproc.resize(mat_src, mat_bits, new Size(nnWidth, nnHeight)); Bitmap bmp_gray0 = Bitmap.createBitmap(mat_bits.cols(), mat_bits.rows(), Bitmap.Config.ARGB_8888 ); Utils.matToBitmap(mat_bits, bmp_gray0); picture.setImageBitmap(bitmap); Mat mGray = new Mat(nnHeight, nnWidth, CvType.CV_8UC1); Imgproc.cvtColor(mat_src, mGray, Imgproc.COLOR_BGRA2GRAY, 1); //检测并显示 MatOfRect faces = new MatOfRect(); if (cascadeClassifier != null) { cascadeClassifier.detectMultiScale(mGray, faces, 1.1, 2, 2, new Size(mGray.height()/5, mGray.height()/5), new Size()); } Rect[] facesArray = faces.toArray(); //--------------------- int nHeight = 100; int nWidth = 100; //--------------------- //opencv_contrib.FaceRecognizer faceRec = new opencv_contrib.FaceRecognizer(); //opencv_contrib.FaceRecognizer faceRec = com.googlecode.javacv.cpp.opencv_contrib.createEigenFaceRecognizer();// opencv_contrib.FaceRecognizer eigenRecog = com.googlecode.javacv.cpp.opencv_contrib.createEigenFaceRecognizer();// opencv_contrib.FaceRecognizer faceRec = com.googlecode.javacv.cpp.opencv_contrib.createFisherFaceRecognizer();//// opencv_contrib.FaceRecognizer lbphRecog = com.googlecode.javacv.cpp.opencv_contrib.createLBPHFaceRecognizer();// opencv_core.MatVector var1 = new opencv_core.MatVector(2); Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.img_01); opencv_core.IplImage imgTemp1 = bitmapToIplImage(bitmap1); Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.img_02); opencv_core.IplImage imgTemp2 = bitmapToIplImage(bitmap2);// int[] var2 = {1,1};// var1.put(0, imgTemp1);// var1.put(1, imgTemp2);// faceRec.train(var1, var2); for (int i = 0; i <facesArray.length; i++) { Core.rectangle(mat_src, facesArray[i].tl(), facesArray[i].br(), new Scalar(0, 255, 0, 255), 3); Point pt = new Point(); pt.x = facesArray[i].br().x; pt.y = facesArray[i].br().y; String str_x = Double.toString(pt.x); String str_y = Double.toString(pt.y); Mat copyMat = mGray.submat(facesArray[i]); Mat mat_source = new Mat(nHeight, nWidth, CvType.CV_8UC1); Imgproc.resize(copyMat, mat_source, new Size(nWidth, nHeight)); //int[] predicted_label = {-1}; //double[] predicted_confidence = {0.0}; opencv_core.IplImage sourceImg = bitmapToIplImage(bitmap); //faceRec.predict(sourceImg, predicted_label, predicted_confidence); double c1 = CmpPic(sourceImg, imgTemp1); double c2 = CmpPic(sourceImg, imgTemp2); String str = str_x + ", " + str_y + " S1:" + c1 + " S2:"+ c2; Core.putText(mat_src,str, pt, Core.FONT_HERSHEY_SIMPLEX, 1, new Scalar(255,23,0),2); Bitmap bmp_dst = Bitmap.createBitmap(copyMat.cols(), copyMat.rows(), Bitmap.Config.ARGB_8888 ); Utils.matToBitmap(copyMat, bmp_dst); String str2 = getRandomString(8)+".png"; saveBitmap(bmp_dst, str2); } //图像显示 Bitmap bmp_gray = Bitmap.createBitmap(mat_src.cols(), mat_src.rows(), Bitmap.Config.ARGB_8888 ); Utils.matToBitmap(mat_src, bmp_gray); picture2.setImageBitmap(bmp_gray);// int nHeight = bitmap.getHeight()/10;// int nWidth = bitmap.getWidth()/10;// Mat mat_small = new Mat(nHeight, nWidth, CvType.CV_8UC4);// Imgproc.resize(mat_src, mat_small, new Size(nWidth, nHeight)); //图像处理 //Mat mat_src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CvType.CV_8UC4); //Utils.bitmapToMat(bitmap, mat_src);// int nHeight = bitmap.getHeight()/10;// int nWidth = bitmap.getWidth()/10;// Mat mat_small = new Mat(nHeight, nWidth, CvType.CV_8UC4);// Imgproc.resize(mat_src, mat_small, new Size(nWidth, nHeight));// Mat mat_gray = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC1);// Imgproc.cvtColor(mat_small, mat_gray, Imgproc.COLOR_BGRA2GRAY, 1);//// //-------------------------------------------------------------------// Mat frame = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC4);// mat_small.copyTo(frame);//// Mat frameHSV = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC3);; // hsv空间// Mat mask = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC1);// Mat dst = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC3); // 输出图像// //dst.copyTo(frame);// // 中值滤波,去除椒盐噪声// Imgproc.medianBlur(frame, frame, 5);// Imgproc.cvtColor(frame, frameHSV, Imgproc.COLOR_RGB2HSV, 3);// Mat dstTemp1 = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC1);// Mat dstTemp2 = new Mat(mat_small.cols(), mat_small.rows(), CvType.CV_8UC1);// // 对HSV空间进行量化,得到二值图像,亮的部分为手的形状// Core.inRange(frameHSV, new Scalar(0, 30, 30), new Scalar(40, 170, 256), dstTemp1);// Core.inRange(frameHSV, new Scalar(156, 30, 30), new Scalar(180, 170, 256), dstTemp2);// Core.bitwise_or(dstTemp1, dstTemp2, mask);// //dstTemp1.copyTo(mask);// // 形态学操作,去除噪声,并使手的边界更加清晰// Mat element = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3));// Imgproc.erode(mask, mask, element);// Imgproc.morphologyEx(mask, mask, Imgproc.MORPH_OPEN, element);// Imgproc.dilate(mask, mask, element);// Imgproc.morphologyEx(mask, mask, Imgproc.MORPH_CLOSE, element);//// frame.copyTo(dst, mask); //------------------------------------------------------------------- }catch (FileNotFoundException e){ e.printStackTrace(); } //} break; default: break; } } //length用户要求产生字符串的长度 public static String getRandomString(int length){ String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random=new Random(); StringBuffer sb=new StringBuffer(); for(int i=0;i<length;i++){ int number=random.nextInt(62); sb.append(str.charAt(number)); } return sb.toString(); } //保存图片 public static void saveBitmap(Bitmap bm, String picName) { File f = new File("/storage/emulated/0/Pictures/", picName); if (f.exists()) { f.delete(); } try { FileOutputStream out = new FileOutputStream(f); bm.compress(Bitmap.CompressFormat.PNG, 90, out); out.flush(); out.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * 特征对比 * * @param file1 人脸特征 * @param file2 人脸特征 * @return 相似度 */ public double CmpPic(Mat img11, Mat img22) { try {// int l_bins = 256;// int hist_size[] = {l_bins};// float v_ranges[] = {0, 255};// float ranges[][] = {v_ranges}; Mat hist = new Mat(256, 1, CvType.CV_8U, new Scalar(0)); ArrayList histsSource = new ArrayList(); histsSource.add(img11); Imgproc.calcHist(histsSource, new MatOfInt(0), new Mat(), hist, new MatOfInt(256), new MatOfFloat(0f, 256f)); Mat hist2 = new Mat(256, 1, CvType.CV_8U, new Scalar(0)); ArrayList histsSource2 = new ArrayList(); histsSource2.add(img22); Imgproc.calcHist(histsSource2, new MatOfInt(0), new Mat(), hist, new MatOfInt(256), new MatOfFloat(0f, 256f)); Core.normalize(hist,hist); Core.normalize(hist2,hist2); double c1 = Imgproc.compareHist(hist, hist2, 1); double c2 = Imgproc.compareHist(hist, hist2, 2); return (c1 + c2) / 2; } catch (Exception e) { e.printStackTrace(); return -1; } } public Bitmap MatToBitmap(Mat src) { Bitmap bitmap = Bitmap.createBitmap(src.width(), src.height(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(src, bitmap); return bitmap; } public Mat bitmapToMat(Bitmap bitmap) { Mat rgbMat = new Mat(); Utils.bitmapToMat(bitmap, rgbMat); return rgbMat; } public Bitmap IplImageToBitmap(opencv_core.IplImage iplImage) { Bitmap bitmap = null; bitmap = Bitmap.createBitmap(iplImage.width(), iplImage.height(), Bitmap.Config.ARGB_8888); bitmap.copyPixelsFromBuffer(iplImage.getByteBuffer()); return bitmap; } public opencv_core.IplImage bitmapToIplImage(Bitmap bitmap) { opencv_core.IplImage iplImage; iplImage = opencv_core.IplImage.create(bitmap.getWidth(), bitmap.getHeight(), opencv_core.IPL_DEPTH_8U, 4); bitmap.copyPixelsToBuffer(iplImage.getByteBuffer()); return iplImage; } public double CmpPic(opencv_core.IplImage Image1, opencv_core.IplImage Image2) { int l_bins = 20; int hist_size[] = {l_bins}; float v_ranges[] = {0, 100}; float ranges[][] = {v_ranges}; opencv_core.IplImage imageArr1[] = {Image1}; opencv_core.IplImage imageArr2[] = {Image2}; opencv_imgproc.CvHistogram Histogram1 = opencv_imgproc.CvHistogram.create(1, hist_size, CV_HIST_ARRAY, ranges, 1); opencv_imgproc.CvHistogram Histogram2 = opencv_imgproc.CvHistogram.create(1, hist_size, CV_HIST_ARRAY, ranges, 1); cvCalcHist(imageArr1, Histogram1, 0, null); cvCalcHist(imageArr2, Histogram2, 0, null); cvNormalizeHist(Histogram1, 100.0); cvNormalizeHist(Histogram2, 100.0); return cvCompareHist(Histogram1, Histogram2, CV_COMP_CORREL); }}
0 0
- 【Android】JavaCV and OpenCV
- 【Android】Test JavaCV & OpenCV
- Differences between OpenCV JavaCV and OpenCV4Android
- Differences between OpenCV JavaCV and OpenCV4Android
- Differences between OpenCV JavaCV and OpenCV4Android
- 请问一下Android Studio如何配置JAVACV 0.8Javacv+2.4.9Opencv 万分感谢
- Android 人脸识别+人脸匹配(OpenCV+JavaCV)
- Android 人脸识别+人脸匹配(OpenCV+JavaCV)
- 【Android】Android使用OpenCV实现人脸识别(OpenCV+JavaCV)
- OpenCV+VS2010+JavaCV+Eclipse+Win7
- OpenCV+VS2010+JavaCV+Eclipse+Win7
- android+javaCV环境配置
- Android使用OpenCV和FFMpeg的简单方法-开源项目javacv的使用
- javacv
- javacv
- JavaCV
- OpenCV-2.4.4 + javacv-0.4 +eclipse
- OpenCV-2.4.4 + javacv-0.4 +eclipse
- 【AJAX】基本原理
- 程序计时
- TextView的DrawableRight图片
- 浏览器中实现3D全景浏览
- 使用Filter为请求方法添加跨域支持
- 【Android】JavaCV and OpenCV
- 引用类型String
- java
- 性能测试工具---Traceview
- 挺进
- 使用RecyclerView notifyItemChanged()出现图片闪烁问题解决
- java性能优化笔记(三)java程序优化
- 查询当前网段的所有在用IP
- xUtils===xUtils3.0基本使用规则