opencv4android编译静态库,Android Studio链接OpenCV静态库

目前我正在开发一个使用OpenCV3进行实时视频处理(应用一组彩色滤镜)的项目,我设法让它与Java一起使用而没有任何问题.

我接下来要做的是通过NDK将所有Java逻辑实现到C(以提高性能).这样我就不需要将MAT对象转换回字节缓冲区和堡垒,从而节省了几个周期.但我真的很难尝试使用gradle链接.so,.a静态库和头文件,以便在我的.CPP文件上使用.

这是我正在使用的gradle文件:

apply plugin: 'com.android.model.application'

def opencvandroid_sdk_path = file(project(':opencvandroid').projectDir).absolutePath + "/src/main"

model {

repositories {

libs(PrebuiltLibraries) {

opencv {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_calib3d.a")

}

}

opencv1 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_core.a")

}

}

opencv2 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_features2d.a")

}

}

opencv3 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_flann.a")

}

}

opencv4 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_highgui.a")

}

}

opencv5 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgcodecs.a")

}

}

opencv6 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_imgproc.a")

}

}

opencv7 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_ml.a")

}

}

opencv8 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_objdetect.a")

}

}

opencv9 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_photo.a")

}

}

opencv10 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_shape.a")

}

}

opencv11 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_stitching.a")

}

}

opencv12 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_superres.a")

}

}

opencv13 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_video.a")

}

}

opencv14 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videoio.a")

}

}

opencv15 {

headers.srcDir "${opencvandroid_sdk_path}/jni/include/opencv2"

binaries.withType(StaticLibraryBinary) {

staticLibraryFile = file("${opencvandroid_sdk_path}/jniLibs/${targetPlatform.getName()}/libopencv_videostab.a")

}

}

}

}

android {

compileSdkVersion = 23

buildToolsVersion = "23.0.2"

defaultConfig.with {

applicationId = "com.example"

minSdkVersion.apiLevel = 16

targetSdkVersion.apiLevel = 23

versionCode = 1

versionName = "1.0"

}

}

/*

* native build settings

*/

android.ndk {

moduleName = "hello-jni"

/*

* Other ndk flags configurable here are

* cppFlags += "-fno-rtti"

* cppFlags += "-fno-exceptions"

* ldLibs = ["android", "log"]

* stl = "system"

*/

platformVersion = 16 //same as minSdkVersion.apiLevel for better compatibility

/*def jniPath = opencvandroid_sdk_path + "jniLibs"

cppFlags += "-I${file(jniPath)}".toString()

file(jniPath).eachDirRecurse { dir ->

cppFlags += "-I${file(dir)}".toString()

}*/

stl = "c++_static"

ldLibs.addAll(["atomic", "log", "android"])

}

android.sources {

main {

jni {

dependencies {

library "opencv1" linkage "static"

library "opencv2" linkage "static"

library "opencv3" linkage "static"

library "opencv4" linkage "static"

library "opencv5" linkage "static"

library "opencv6" linkage "static"

library "opencv7" linkage "static"

library "opencv8" linkage "static"

library "opencv9" linkage "static"

library "opencv10" linkage "static"

library "opencv11" linkage "static"

library "opencv12" linkage "static"

library "opencv13" linkage "static"

library "opencv14" linkage "static"

library "opencv15" linkage "static"

}

}

}

}

android.buildTypes {

release {

minifyEnabled = false

}

}

}

dependencies {

compile fileTree(dir: 'libs', include: ['*.jar'])

testCompile 'junit:junit:4.12'

compile 'com.android.support:appcompat-v7:23.1.1'

compile 'com.android.support:design:23.1.1'

compile project(':opencvandroid')

}

我将我的gradle文件基于我在github上找到的this示例.

现在,我发现尝试这样做的一个问题是OPENCV有几个静态库文件,所以正如post所说,我必须在gradle上的不同lib上添加每个文件以便链接它们,所以这就是为什么我的gradle文件充满了重复的库定义.

现在,当我试图在我的.CPP代码中包含头文件时,Android Studio找不到它们(甚至不能使用命名空间).这是我的CPP代码:

#include

#include "opencv2/core/core.hpp"

#include "opencv2/imgproc/imgproc.hpp"

#include "opencv2/features2d/features2d.hpp"

#include

using namespace std;

using namespace cv;

extern "C" {

JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba);

JNIEXPORT void JNICALL Java_com_example_Tutorial2Activity_FindFeatures(JNIEnv*, jobject, jlong addrGray, jlong addrRgba)

{

Mat& mGr = *(Mat*)addrGray;

Mat& mRgb = *(Mat*)addrRgba;

vector v;

Ptr detector = FastFeatureDetector::create(50);

detector->detect(mGr, v);

for( unsigned int i = 0; i < v.size(); i++ )

{

const KeyPoint& kp = v[i];

circle(mRgb, Point(kp.pt.x, kp.pt.y), 10, Scalar(255,0,0,255));

}

}

}

我错过了一些东西,以便正确地链接它们吗?

解决方法:

OpenCV静态库之间存在依赖关系.所以你需要以正确的顺序包含它们. .a和.o包含依赖于GCC的顺序,具有依赖关系的文件必须包含在它们所依赖的文件之前:

CV_LIBS = \

$(CV_LIB_FOLDER)/libopencv_calib3d.a \

$(CV_LIB_FOLDER)/libopencv_highgui.a \

$(CV_LIB_FOLDER)/libopencv_video.a \

$(CV_LIB_FOLDER)/libopencv_objdetect.a \

$(CV_LIB_FOLDER)/libopencv_imgproc.a \

$(CV_LIB_FOLDER)/libopencv_imgcodecs.a \

$(CV_LIB_FOLDER)/libopencv_core.a \

$(CV_LIB_FOLDER)/libopencv_hal.a

标签:c-2,android,opencv,android-studio,android-ndk

来源: https://codeday.me/bug/20190628/1313323.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了在Visual Studio中安装OpenCV静态库,可以按照以下步骤进行操作: 1. 首先,在OpenCV官网下载所需版本的OpenCV库文件。本例以OpenCV 4.0.0的Release版本为例。 2. 下载完成后,使用CMake来编译OpenCV静态链接库。CMake是一个跨平台的开源工具,可以根据项目的需要生成所需的构建脚本。具体的编译步骤可以参考OpenCV官方文档或相关教程。 3. 编译完成后,会生成一个名为staticlib的文件夹,其中包含了所需的静态库文件。将这些库文件复制到合适的位置,以便在Visual Studio中使用。 4. 打开Visual Studio,创建一个新的项目或打开现有项目。 5. 在Visual Studio中,右击项目,在弹出的菜单中选择“属性”选项。 6. 在项目属性窗口中,选择“VC++目录”选项卡。在“包含目录”字段中添加OpenCV头文件的路径,通常是OpenCV的安装路径下的include文件夹。 7. 在“库目录”字段中添加OpenCV静态库文件的路径,通常是staticlib文件夹的路径。 8. 在“链接器”选项卡下的“输入”字段中,添加所需的OpenCV库文件的名称。比如对于OpenCV的核心模块,可以添加opencv_core400.lib。 9. 点击“应用”按钮,然后点击“确定”按钮,保存更改。 10. 现在,可以在项目中使用OpenCV库函数了。在代码中引入OpenCV库的头文件,并使用相应的函数。 需要注意的是,具体的步骤可能会因OpenCV版本或Visual Studio版本的不同而有所差异。建议参考OpenCV官方文档或相关教程以获得最新的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值