围绕获取原生opencv for android构建有很多问题和答案.有些使用gradle,有些则使用外部工具.对于原生OpenCV构建,这些众多,复杂且经常相互矛盾的描述可能会以一致的起点进行简化; 在创建Android Studio 2.2 Beta项目时,有一种方法可以包含C++支持:


此功能是在2016年6月左右添加的.有关详细信息,请参阅Android工具技术文档.
将Android Studio 2.2或更高版本与Gradle 2.2.0或更高版本的Android插件一起使用,您可以将C和C++代码编译到Gradle可以与您的APK打包的本机库中,从而为您的应用添加C和C++代码.然后,您的Java代码可以通过Java Native Interface(JNI)调用本机库中的函数.如果您想了解有关使用JNI框架的更多信息,请阅读适用于Android的JNI技巧.
检查Include C++ Support生成一个名为的外部构建文件CMakeLists.txt.
# Sets the minimum version of CMake required to build the native
# library. You should either keep the default value or only pass a
# value of 3.4.0 or lower.
cmake_minimum_required(VERSION 3.4.1)
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# …Run Code Online (Sandbox Code Playgroud) windows java-native-interface cmake android-studio opencv4android
我正在尝试将OpenCV模块添加到项目中,但我无法解决一些问题.这是我的app.gradle档案:
apply plugin: 'com.android.application'
android {
compileSdkVersion 17
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.sveder.cardboardpassthrough"
minSdkVersion 8
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.android.support:support-v4:18.0.0'
compile files('libs/cardboard.jar')
compile project(':openCVLibrary')
}
Run Code Online (Sandbox Code Playgroud)
这是build.gradleOpenCV(3.0)模块的文件:
apply plugin: 'com.android.library'
android {
compileSdkVersion 17
buildToolsVersion "23.0.2"
defaultConfig {
minSdkVersion 8
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,我的应用程序和OpenCV gradle文件匹配,但每当我尝试构建项目时,我都没有错误error: package android.hardware.camera2.我究竟做错了什么?
提前致谢.
我正在使用OpenCV4Android版本2.4.10,我在三星Galayx GT-I9300上测试我的代码.我的问题是,我必须从Play商店下载Opencv Manager,以便我的opencv代码运行,否则App将无法启动.我提到了一些postes"如此处所示如何在Android应用程序中集成OpenCV管理器 ",以了解如何在Android上运行opncv代码而无需下载OpenCV管理器,但遗憾的是,只要未安装OpenCV Manager,App就无法启动.
我尝试了以下
static {
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
}
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 onResume() {
super.onResume();
Log.w(TAG, "onResume");
if (!OpenCVLoader.initDebug()) {
Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_10, …Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序,我想OpenCV在Android Camera2API的实时图像上运行一些图像处理.目前,如果我不进行任何处理,我能够以OnImageAvailble30 fps的速度接收常规1280x720帧的图像.
现在作为一个肮脏的黑客,我正在以JPEG格式从ImageReader请求图像,然后传递Bitmap,jni从而大大降低了性能.
什么是对YUV帧传送到最有效的方式jni在cv Mat对象.此外,我想将此帧转换RGB为进一步处理.我应该更改Java端的格式,还是应该将Mat对象传递给jni那里的颜色空间并进行转换.
我正在为使用OpenCV的学士学位文凭构建此应用程序.一切都很顺利,直到我将手机的Android更新到5.0.
更新后,我的项目停止工作,因为:
java.lang.IllegalArgumentException:Service Intent必须是显式的:Intent {act = org.opencv.engine.BIND}
我已阅读并告知自己有关Android 5.0中隐式意图的新限制,但我如何解决这个问题以使OpenCV工作?
我可以修改OpenCV SDK中的 AsyncServiceHelper.java文件以尝试修复此问题,但是为了使用显式意图,我怎样才能获得需要运行的OpenCV服务的Class对象?
或者这种方法可能是死路一条,但有没有其他方法,或者我唯一的选择是更新OpenCV SDK,还是降级我的设备上的Android版本?
虽然早期版本的OpenCV(即2.4)允许Android项目利用SIFT功能,但将该功能分离opencv_contrib使得任务更加困难; 将OpenCV-3.x.x-android-sdk模块集成到项目中会使您无法使用该SIFT功能.
FeatureDetector.create(FeatureDetector.DYNAMIC_SIFT); // Fails
//OpenCV Error: Bad argument (Specified feature detector type is not supported.)
Run Code Online (Sandbox Code Playgroud)
尽管像Gouhui Wang这样的技术描述了如何将OpenCV的非自由部分构建到Android项目中,但该过程需要外部工具.这个问题是关于如何获得相同的结果,而是利用Android Studio/InteliJ的强大功能和便利性.
现代Android Studio版本具有有用的功能:
使用Android Studio 2.2及更高版本,您可以使用NDK将C和C++代码编译到本机库中,并使用IDE的集成构建系统Gradle将其打包到您的APK中.然后,您的Java代码可以通过Java Native Interface(JNI)调用本机库中的函数
正如这个有关使用C++支持构建OpenCV的stackoverflow问题和答案所示,可以将opencv4android的OpenCV 3.1(我怀疑其他版本)快速集成到新应用程序向导中生成的C++构建结构中.
为了让OpenCV的非自由部分完全在原生Android Studio构建过程中构建,需要采取哪些具体步骤?
我正在使用Android4OpenCV进行一些实时图像处理,我想使用相机可以提供的最小分辨率.默认分辨率是相机可以提供的最大分辨率.
我正在看第三个例子,它允许用户通过菜单更改分辨率.我想修改该示例以在启动时更改分辨率,而不是要求用户通过菜单.为此,我只需在其他空onCameraViewStarted()函数中添加两行:
public void onCameraViewStarted(int width, int height) {
android.hardware.Camera.Size res = mOpenCvCameraView.getResolutionList().get(mOpenCvCameraView.getResolutionList().size()-1);
mOpenCvCameraView.setResolution(res);
}
Run Code Online (Sandbox Code Playgroud)
问题是,这在我的Galaxy Nexus上完全运行,运行Android 4.2.2.应用程序启动,分辨率设置正确.
但是,当我在Nexus 7平板电脑上运行完全相同的应用程序,运行Android 5.1时,该应用程序会挂起电话setResolution().实际上它可以正常工作,但是第二次尝试运行它时会挂起 - 即使您完全退出应用程序,将其从正在运行的应用程序中删除,或重新启动设备.其他用户也报告了相同的错误,因此它不仅仅是Nexus 7设备 - 事实上,我的Galaxy Nexus似乎是唯一可用的设备.
具体来说,应用程序进入setResolution()函数,然后调用org.opencv.android.JavaCameraView.disconnectCamera(),如下所示:
(注意:此代码是OpenCV4Android库的内部,这不是我的代码)
protected void disconnectCamera() {
/* 1. We need to stop thread which updating the frames
* 2. Stop camera and release it
*/
Log.d(TAG, "Disconnecting from camera");
try {
mStopThread = true;
Log.d(TAG, "Notify thread");
synchronized (this) {
this.notify(); …Run Code Online (Sandbox Code Playgroud) 我已经为此工作了好几天了.我有一个基于OpenCV/JavaCameraView的项目我试图与android.hardware.camera2.CaptureRequest我用来控制相机对光的敏感度的Android 对象集成.
该CameraBridgeViewBase.CvCameraViewListener2/JavaCameraView项目工程(我可以在屏幕上看到的图像),并在CaptureRequest项目工程(看到这一点,太),但是这两种技术在一个单一的项目组合已证明是一个很大的问题.
有没有人让这两种技术一起工作?我的目标是让摄像头处于CaptureRequest(有限的SENSOR_SENSITIVITY + SENSOR_EXPOSURE_TIME)的控制之下,但屏幕显示通过我写的OpenCV共享库过滤的流图像.
要控制相机,我可以使用这样的东西:
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()),
new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {
// The camera is already closed
if (null == mCameraDevice) {
return;
}
long exposureTime = 66259688,frameDuration = 1000;
int sensitivity = 1512;
mCaptureSession = cameraCaptureSession;
try {
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
setAutoFlash(mPreviewRequestBuilder);
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, Long.valueOf(exposureTime));
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, Integer.valueOf(sensitivity));
mPreviewRequestBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, Long.valueOf(frameDuration));
mPreviewRequest = mPreviewRequestBuilder.build();
mCaptureSession.setRepeatingRequest(mPreviewRequest,
mCaptureCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
}catch (Exception e) { …Run Code Online (Sandbox Code Playgroud) 我在使用Android Studio 1.3+的原生OpenCv 2.4.11(3.0.0也没问题)时遇到了麻烦,并且支持新的ndk.关于.mk文件的所有教程,但我想将它与新的实验gradle一起使用.
使用Kiran 在Android Studio中回答OpenCV
我在java中工作得很好.我也改变了
gradle-wrapper.properties:build.gradle(application
distributionUrl=https\://services.gradle.org/distributions/gradle-2.5-all.zip
):
classpath 'com.android.tools.build:gradle-experimental:0.2.0'
Run Code Online (Sandbox Code Playgroud)
的build.gradle(模块):
apply plugin: 'com.android.model.application'
model {
android {
compileSdkVersion = 23
buildToolsVersion = "23.0.0"
defaultConfig.with {
applicationId = "android.overloaded.nativetestv4"
minSdkVersion.apiLevel = 18
targetSdkVersion.apiLevel = 23
versionCode = 1
versionName = "1.0"
}
}
android.ndk{
moduleName = "mymodule"
ldLibs += ['log']
cppFlags += "-std=c++11"
cppFlags += "-fexceptions"
cppFlags += "-I${file("C:/DevAndroid/OpenCV-android-sdk/sdk/native/jni/include")}".toString()
cppFlags += "-I${file("C:/DevAndroid/OpenCV-android-sdk/sdk/native/jni/include/opencv")}".toString()
ldLibs += ["android", "EGL", "GLESv2", "dl", "log", "z"] //added z
stl = "stlport_static"//"gnustl_shared" …Run Code Online (Sandbox Code Playgroud) opencv android-ndk android-studio android-gradle-plugin opencv4android
我无法在互联网上的某个地方找到好的解释.有太多的东西,而不是找到做什么,我变得更加困惑.
我的目标:创建一个Android应用程序,使用相机实时检测对象(我的对象是方向盘和汽车轮胎.)
到现在为止我尝试了haar分类器,但很难训练,花了很多时间而且无法正确训练所以我决定寻找另一种方法来实现我的目标.
现在我发现了特征检测器和SVM培训.我的问题是:
1:我应该使用哪种算法(SURF,ORB,FREAK等)?
2:你怎么看待HOG + Bag-Of-Words?
3:如果有的话,您会告诉我如何训练SVM或提供链接吗? - 我没有找到任何关于此的教程.我一直在寻找,但我的时间有限,我决定问.
4:哪种算法会得到最好的结果?
5:我应该使用Android NDK在本机中实现它还是与Java实现没有太大的区别?
如果您有任何教程或参考资料,请将其添加到您的答案或评论中.很抱歉这个问题很长,因为我说我的时间有限(这是一个学校项目.)而且我认为如果人们能够在一个地方找到这些答案会很好.我会很感激每一个答案,即使它不是一个完整的答案.先感谢您!
android opencv object-detection feature-detection opencv4android