使用Java api 和 jni混合方式调用OpenCV
int a =b;
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
export ProjectPath=$(cd "../$(dirname "$1")"; pwd)
javah -d ${TargetPath} -classpath "${SourceFile}" "${TargetClassName}"
echo -d ${TargetPath} -classpath "${SourceFile}" "${TargetClassName}"
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](/assets/blank.gif)
![](https://code.csdn.net/assets/CODE_ico.png)
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
- import org.opencv.android.OpenCVLoader;
- import org.opencv.core.Core;
- import org.opencv.core.Mat;
- import org.opencv.core.MatOfRect;
- import org.opencv.core.Rect;
- import org.opencv.core.Scalar;
- import org.opencv.core.Size;
- import org.opencv.android.CameraBridgeViewBase;
- import org.opencv.android.CameraBridgeViewBase.CvCameraViewListener2;
- import org.opencv.objdetect.CascadeClassifier;
- import android.content.Context;
- import android.os.Bundle;
- import android.support.v7.app.AppCompatActivity;
- import android.util.Log;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.WindowManager;
- import com.lingyun.facedetection.R;
- public class MainActivity extends AppCompatActivity implements CvCameraViewListener2{
- private static final String TAG = "OCVSample::Activity";
- private static final Scalar FACE_RECT_COLOR = new Scalar(0, 255, 0, 255);
- public static final int JAVA_DETECTOR = 0;
- public static final int NATIVE_DETECTOR = 1;
- private MenuItem mItemFace50;
- private MenuItem mItemFace40;
- private MenuItem mItemFace30;
- private MenuItem mItemFace20;
- private MenuItem mItemType;
- private Mat mRgba;
- private Mat mGray;
- private File mCascadeFile;
- private CascadeClassifier mJavaDetector;
- private DetectionBasedTracker mNativeDetector;
- private int mDetectorType = JAVA_DETECTOR;
- private String[] mDetectorName;
- private float mRelativeFaceSize = 0.2f;
- private int mAbsoluteFaceSize = 0;
- private CameraBridgeViewBase mOpenCvCameraView;
- static {
- if(!OpenCVLoader.initDebug()){
- Log.d("MyDebug","Falied");
- }else{
- Log.d("MyDebug","success");
- System.loadLibrary("opencv_java");
- }
- }
- public void doDetect(){
- // Load native library after(!) OpenCV initialization
- System.loadLibrary("detection_based_tracker");//
- try {
- // load cascade file from application resources
- InputStream is = getResources().openRawResource(R.raw.lbpcascade_frontalface);
- File cascadeDir = getDir("cascade", Context.MODE_PRIVATE);
- mCascadeFile = new File(cascadeDir, "lbpcascade_frontalface.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();
- mJavaDetector = new CascadeClassifier(mCascadeFile.getAbsolutePath());
- if (mJavaDetector.empty()) {
- Log.e(TAG, "Failed to load cascade classifier");
- mJavaDetector = null;
- } else
- Log.i(TAG, "Loaded cascade classifier from " + mCascadeFile.getAbsolutePath());
- mNativeDetector = new DetectionBasedTracker(mCascadeFile.getAbsolutePath(), 0);
- cascadeDir.delete();
- } catch (IOException e) {
- e.printStackTrace();
- Log.e(TAG, "Failed to load cascade. Exception thrown: " + e);
- }
- mOpenCvCameraView.enableView();
- }
- public MainActivity() {
- mDetectorName = new String[2];
- mDetectorName[JAVA_DETECTOR] = "Java";
- mDetectorName[NATIVE_DETECTOR] = "Native (tracking)";
- Log.i(TAG, "Instantiated new " + this.getClass());
- }
- /** Called when the activity is first created. */
- @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.face_detect_surface_view);
- mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.fd_activity_surface_view);
- mOpenCvCameraView.setCvCameraViewListener(this);
- doDetect();
- }
- @Override
- public void onPause()
- {
- super.onPause();
- if (mOpenCvCameraView != null)
- mOpenCvCameraView.disableView();
- }
- @Override
- public void onResume()
- {
- super.onResume();
- // OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mLoaderCallback);
- }
- public void onDestroy() {
- super.onDestroy();
- mOpenCvCameraView.disableView();
- }
- public void onCameraViewStarted(int width, int height) {
- mGray = new Mat();
- mRgba = new Mat();
- }
- public void onCameraViewStopped() {
- mGray.release();
- mRgba.release();
- }
- public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
- mRgba = inputFrame.rgba();
- mGray = inputFrame.gray();
- if (mAbsoluteFaceSize == 0) {
- int height = mGray.rows();
- if (Math.round(height * mRelativeFaceSize) > 0) {
- mAbsoluteFaceSize = Math.round(height * mRelativeFaceSize);
- }
- mNativeDetector.setMinFaceSize(mAbsoluteFaceSize);
- }
- MatOfRect faces = new MatOfRect();
- if (mDetectorType == JAVA_DETECTOR) {
- if (mJavaDetector != null)
- mJavaDetector.detectMultiScale(mGray, faces, 1.1, 2, 2, // TODO: objdetect.CV_HAAR_SCALE_IMAGE
- new Size(mAbsoluteFaceSize, mAbsoluteFaceSize), new Size());
- }
- else if (mDetectorType == NATIVE_DETECTOR) {
- if (mNativeDetector != null)
- mNativeDetector.detect(mGray, faces);
- }
- else {
- Log.e(TAG, "Detection method is not selected!");
- }
- Rect[] facesArray = faces.toArray();
- for (int i = 0; i < facesArray.length; i++)
- Core.rectangle(mRgba, facesArray[i].tl(), facesArray[i].br(), FACE_RECT_COLOR, 3);
- return mRgba;
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- Log.i(TAG, "called onCreateOptionsMenu");
- mItemFace50 = menu.add("Face size 50%");
- mItemFace40 = menu.add("Face size 40%");
- mItemFace30 = menu.add("Face size 30%");
- mItemFace20 = menu.add("Face size 20%");
- mItemType = menu.add(mDetectorName[mDetectorType]);
- return true;
- }
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- Log.i(TAG, "called onOptionsItemSelected; selected item: " + item);
- if (item == mItemFace50)
- setMinFaceSize(0.5f);
- else if (item == mItemFace40)
- setMinFaceSize(0.4f);
- else if (item == mItemFace30)
- setMinFaceSize(0.3f);
- else if (item == mItemFace20)
- setMinFaceSize(0.2f);
- else if (item == mItemType) {
- int tmpDetectorType = (mDetectorType + 1) % mDetectorName.length;
- item.setTitle(mDetectorName[tmpDetectorType]);
- setDetectorType(tmpDetectorType);
- }
- return true;
- }
- private void setMinFaceSize(float faceSize) {
- mRelativeFaceSize = faceSize;
- mAbsoluteFaceSize = 0;
- }
- private void setDetectorType(int type) {
- if (mDetectorType != type) {
- mDetectorType = type;
- if (type == NATIVE_DETECTOR) {
- Log.i(TAG, "Detection Based Tracker enabled");
- mNativeDetector.start();
- } else {
- Log.i(TAG, "Cascade detector enabled");
- mNativeDetector.stop();
- }
- }
- }
- }
![](https://code.csdn.net/assets/CODE_ico.png)
- <?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.lingyun.facedetection" >
- <application
- android:allowBackup="true"
- android:icon="@mipmap/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name=".MainActivity"
- android:label="@string/app_name" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- </application>
- <supports-screens android:resizeable="true"
- android:smallScreens="true"
- android:normalScreens="true"
- android:largeScreens="true"
- android:anyDensity="true" />
- <uses-sdk android:minSdkVersion="8" />
- <uses-permission android:name="android.permission.CAMERA"/>
- <uses-feature android:name="android.hardware.camera" android:required="false"/>
- <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
- <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
- <uses-feature android:name="android.hardware.camera.front.autofocus" android:required="false"/>
- </manifest>
运行项目
![](/assets/blank.gif)
使用Java api 和 jni混合方式调用OpenCV相关推荐
- java swing 人脸签到系统 ----- 调用 opencv 多线程
文章目录 java 源代码地址 code aliyun 软件功能展示 项目 设计的 技术问题总结 工作 进程 以及 渲染 进程 如何分离 人脸识别 sdk 的集成与调用 java 调用 opencv ...
- java gdal_Java通过jni方式调用gdal踩过的坑
目录 背景 编译gdaljni ant proj & geos gdaljni 配置eclipse环境 部署运行 java.lang.UnsatisfiedLinkError: no gdal ...
- java调用jni接口,Java 中通过jni接口调用native code
[ Java语言本身是通过Java的虚拟机解释执行的,因此对于Java中调用本地动态链接库的问题便提上了日程,为何会存在这样的需求呢?因为Java本身的机制导致一些要求高效率 在上上篇中已经介绍 ...
- python调用opencv的速度_OpenCV-Python系列之OpenCV性能衡量与优化方法
本次教程我们谈及OpenCV的性能衡量与优化,众所周知,算法的不断的革新其最重要的一点就是不断的优化再优化,比如我们的后面要讲到的边缘检测的算法,又或者是图像分割的算法,他们都是随着时间的一步一步的推 ...
- JNI和NKD入门系列一,纯java工程下JNI的开发流程(mac系统)
Java JNI 的本意是Java Native Interface (Java 本地接口),它是为了方便Java 调用C和 C++等本地代码所封装的一层接口. 我们都知道,Java 的优点是跨平台, ...
- 本地方法(JNI)——调用 java 方法
[0]README 1) 本文部分文字描述 转自 core java volume 2 , 旨在理解 本地方法(JNI)--调用 java 方法 的基础知识 : 2) C语言调用java 方法,包括: ...
- Java JVM、JNI、Native Function Interface、Create New Process Native Function API Analysis
目录 1. JAVA JVM 2. Java JNI: Java Native Interface 3. Java Create New Process Native Function API Ana ...
- jni调用java类_JNI之C++调用Java类 —— java.lang.String
JNI之C++调用Java类 -- java.lang.String 为什么要用C++调用Java类?很难回答,写着文章只是觉得JNI很有意思.于是开始编写一段使用VC++在Windows系统里调用j ...
- java api 获取jvm实例_JVMTI那些事——和Java相互调用
前面几篇文章介绍了JVMTI接口的一些基本概念,以及如何编写一个基于JVMTI的agent. 那些简单的例子只是JVMTI agent自己实现一些简单的功能,如果能够将JVMTI提供的接口经过包装之后 ...
最新文章
- 上传图片时 , 返回 nginx 出现413 Request Entity Too Large 问题
- vscode python环境_在vscode中配置python环境
- vue监听字符串长度_Vue 的 computed 和 watch 的区别
- python与材料计算快速入门线上训练营_Python18天训练营第二课基础1
- springboot项目启动rabbitmq报错org.springframework.amqp.AmqpIOException: java.io.IOException
- Scrapy入门程序点评
- Linux fstab文件详解
- 打造平台化保险产业生态圈的四种模式
- None of the configured nodes are available
- QC DCP PD SCP FCP等充电协议
- it运维工程师的工作是做什么的?累吗?
- 带通滤波器幅频特性曲线图_滤波器知识,你所要的,都在这里
- 方阵主对角线元素之和
- 基线提升至96.45%:2022 司法杯犯罪事实实体识别+数据蒸馏+主动学习
- 无约束优化问题(一)
- GBase 8a的产品简介
- 基于AVR单片机: 两轮自平衡智能车
- 关于讯飞语音SDK开发学习
- bootstrap-select 插件示例
- 中国石油大学浏览器 服务器系统,中国石油大学信息中心
热门文章
- Scott Mitchell的ASP.NET2.0数据指南中文版索引
- php mysql 随机字符串函数是,mysql生成随机字符串函数分享
- leetcode算法题--石子游戏 II★★
- java 热替换_class卸载、热替换和Tomcat的热部署的分析
- Linux就业技术指导(七):游戏类运维重点流程解析
- Windows 8.1 explorer.exe总是崩溃的解决办法
- 替换index和show中select_tag的方法
- Asp.Net 之 通过调用 WScript.Shell 启动本地 exe 程序时产生“ automation服务器不能创建对象 ”的错误...
- Ubuntu系统环境变量配置文件(转)
- 滑动窗口与拥塞窗口_流云哭翠-ChinaUnix博客