文章目录

  • opencv
  • Android搭建OpenCV开发环境
  • 自己写C/C++调用OpenCV实现
  • 小编已经在gayhub开源了一个轮子,可直接使用:一个最简单、免搭建的Android OpenCV开源库[]()
  • Windows C/C++搭建OpenCV开发环境
  • Python搭建Windows OpenCV开发环境
  • 欢迎联系、指正、批评


opencv

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 [1] 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。

OpenCV 拥有包括 500 多个C函数的跨平台的中、高层 API。

Android搭建OpenCV开发环境

打开OpenCV官网

https://opencv.org/

点击Releases

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板

选择对应平台

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_02

下载结果

opencv推荐使用什么开发板 opencv用什么语言开发_OpenCV_03

导入demo工程结果如下

opencv推荐使用什么开发板 opencv用什么语言开发_OpenCV_04

sdk包含如下目录:

so库、静态库、编译配置脚本

opencv推荐使用什么开发板 opencv用什么语言开发_OpenCV_05

运行demo

有很多个application属性的模块,

我们随便选择一个模块比如:color-blob-detection运行到手机上

opencv推荐使用什么开发板 opencv用什么语言开发_OpenCV_06

获取编译好的so库

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板_07


注意:不容版本死丢丢,apk生成目录不一样**

获取java代码

opencv推荐使用什么开发板 opencv用什么语言开发_开发环境_08

官方已经给我们写好了java代码,我们实在没必要再去自己写一遍,
但是当你不知道某些功能实现,如何调用JAVA代码时,或者不好调用时,
还是得自己动手写JNI代码,自己去调用C/C++代码

开始集成

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板_09


建立一个工程,或者模块,配置好so库、放置好java代码

注意aidl文件要放到aidl目录下,sdk里面是直接放在java代码包下的,会编译不通过

初始化OpenCV

在Application中初始化,或者在使用OpenCV之前初始化即可

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        OpenCVLoader.initDebug();
    }
}

举例图像边缘检测

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_10

Mat mat_src = new Mat();
 Mat mat_blur = new Mat();
 Mat mat_dst = new Mat();
 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.man_ls);
 iv_normal.setImageBitmap(bitmap);

 Utils.bitmapToMat(bitmap, mat_src);

 Bitmap bitmap_deal = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
 Imgproc.blur(mat_src, mat_blur, new Size(3, 3));
 Imgproc.Canny(mat_blur, mat_dst, 30, 30 * 3, 3);
 Utils.matToBitmap(mat_dst, bitmap_deal);
 iv_deal.setImageBitmap(bitmap_deal);

如果实现功能的时候不知道用什么API,往往需要去看OpenCV JAVA函数的注释
但是如果实在不知道用什么函数的时候,或者函数不灵的时候,
但是又知道C/C++函数怎么用的时候,我们可以通过JNI

自己写C/C++调用OpenCV实现

引入OpenCV C/C++的头文件

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板_11


配置CmakeLists.txt:

关联libc++_shared.so和libopencv_java4.so

cmake_minimum_required(VERSION 3.4.1)

#配置路径
set(path_so E:\\Github_\\OpenCVAndroidNiubility\\opencvandroidniubility\\src\\main\\jniLibs\\arm64-v8a)
# 设置cpp目录路径
include_directories(include)
add_library( # Sets the name of the library.
        native-lib
        # Sets the library as a shared library.
        SHARED
        native-lib.cpp)
find_library( # Sets the name of the path variable.
        log-lib
        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)
target_link_libraries( # Specifies the target library.
                       native-lib

                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )

add_library(c++_shared
        SHARED
        IMPORTED)
set_target_properties(c++_shared
        PROPERTIES
        IMPORTED_LOCATION
        ${path_so}/libc++_shared.so)

add_library(opencv_java4
        SHARED
        IMPORTED)
set_target_properties(opencv_java4
        PROPERTIES
        IMPORTED_LOCATION
        ${path_so}/libopencv_java4.so)


target_link_libraries( # Specifies the target library.
        native-lib
        c++_shared
        opencv_java4
        # Links the target library to the log library
        # included in the NDK.
        ${log-lib}
        #操作bitmap需要
#        -ljnigraphics
        )

如果你需要用JNI操作bitmap相关,可以关联-ljnigraphics

定义Native方法

public class JniUtils {
    static {
        System.loadLibrary("native-lib");
    }
    public static  native  void gray(long mat_addr_src,long mat_addr_dst);
}

CPP实现JNI方法

#include <jni.h>
#include <opencv2/opencv.hpp>
using namespace cv;

extern "C"
JNIEXPORT void JNICALL
Java_com_cy_opencvandroidniubility_JniUtils_gray(JNIEnv *env, jclass clazz, jlong mat_addr_src,
                                                 jlong mat_addr_dst) {
    Mat *mat_src = (Mat *) mat_addr_src;
    Mat *mat_dst = (Mat *) mat_addr_dst;
    cvtColor(*mat_src, *mat_dst, COLOR_BGR2GRAY);

//    Mat &mat_src = *(Mat *) mat_addr_src;
//    Mat &mat_dst = *(Mat *) mat_addr_dst;
//    cvtColor(mat_src, mat_dst, COLOR_BGR2GRAY);
}

举例图像变灰

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板_12

Mat mat_src = new Mat();
Mat mat_dst = new Mat();
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.gou_1);
iv_normal.setImageBitmap(bitmap);

Utils.bitmapToMat(bitmap, mat_src);

Bitmap bitmap_deal = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.RGB_565);
//Imgproc.cvtColor(mat_src, mat_dst, Imgproc.COLOR_BGR2GRAY);
//自定义JNI方法调用
JniUtils.gray(mat_src.nativeObj, mat_dst.nativeObj);
Utils.matToBitmap(mat_dst, bitmap_deal);
iv_deal.setImageBitmap(bitmap_deal);

因为JAVA中的Mat类,提供了nativeObj,也就是对象的地址,这样,我们就可以很方便地从JAVA传递Mat对象给C/C++

小编已经在gayhub开源了一个轮子,可直接使用:一个最简单、免搭建的Android OpenCV开源库

Windows C/C++搭建OpenCV开发环境

打开OpenCV官网

https://opencv.org/

点击Releases

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板

选择对应平台

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_02

下载结果

下载的.exe文件是个自解压程序,可以选择解压到自定义目录,结果如下:

opencv推荐使用什么开发板 opencv用什么语言开发_开发环境_15

配置环境变量 path

;F:\IT\opencv\opencv_4_5_1\opencv\build\x64\vc15\bin;

记得要前后加分号
到时候如果不灵,就把bin目录里的dll文件放到C盘system32和system64目录下

VS新建工程,引入头文件,库文件

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_16

注意:include、include\opencv2都填进去,不填会找不到头文件,小编也是一脸懵逼

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_17


opencv推荐使用什么开发板 opencv用什么语言开发_Windows_18

debug填xxxxd.lib release填xxxx.lib

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_19

举例

#include <iostream>
#include <opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat mat_src = imread("../resources/bizhi.jpg");
	imshow("原始图", mat_src);

	Mat mat_dst;
	mat_dst.create(mat_src.size(), mat_src.type());

	//双边滤波
	bilateralFilter(mat_src, mat_dst, 25, 25 * 2, 25 / 2);
	imshow("双边滤波", mat_dst);

	cvtColor(mat_dst, mat_dst, COLOR_BGR2GRAY);
	blur(mat_dst, mat_dst, Size(3, 3));
	//边缘检测
	Canny(mat_dst, mat_dst, 3, 9, 3);
	imshow("边缘检测", mat_dst);
	waitKey(100000);
	return 0;
}

效果如下:

opencv推荐使用什么开发板 opencv用什么语言开发_OpenCV_20

opencv推荐使用什么开发板 opencv用什么语言开发_opencv推荐使用什么开发板_21


opencv推荐使用什么开发板 opencv用什么语言开发_开发环境_22

注意:如果各种报错,可以尝试从高版本一个个到低版本,小编用的版本是4.0.0,高版本死活不灵

Python搭建Windows OpenCV开发环境

首先安装Pycharm

intelij系列软件超鸡儿强大,小编用的一系列开发软件除了VS,都是JB全家桶

Windows 搭建Python开发环境:

然后PyCharm安装OpenCV:

选择file->setting->Project:->Python Interpreter

如图:搜索opencv,可以选择版本->Install Package

opencv推荐使用什么开发板 opencv用什么语言开发_开发环境_23


举例边缘检测

import cv2
mat_src = cv2.imread("resources/bizhi.jpg")
mat_edges = cv2.Canny(mat_src, 3, 9,3)
cv2.imshow("原图", mat_src)
cv2.imshow("边缘检测", mat_edges)
cv2.waitKey()
cv2.destroyAllWindows()

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_24

opencv推荐使用什么开发板 opencv用什么语言开发_Windows_25