文章目录
- 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官网
点击Releases
选择对应平台
下载结果
导入demo工程结果如下
sdk包含如下目录:
so库、静态库、编译配置脚本
等
运行demo
有很多个application
属性的模块,
我们随便选择一个模块比如:color-blob-detection
运行到手机上
获取编译好的so库
注意
:不容版本死丢丢,apk生成目录不一样**
获取java代码
官方已经给我们写好了java
代码,我们实在没必要再去自己写一遍,
但是当你不知道某些功能实现,如何调用JAVA
代码时,或者不好调用时,
还是得自己动手写JNI
代码,自己去调用C/C++
代码
开始集成
建立一个工程,或者模块,配置好so
库、放置好java
代码
注意
:aidl
文件要放到aidl
目录下,sdk
里面是直接放在java
代码包下的,会编译不通过
初始化OpenCV
在Application中初始化,或者在使用OpenCV之前初始化即可
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
OpenCVLoader.initDebug();
}
}
举例图像边缘检测
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++的头文件
配置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);
}
举例图像变灰
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官网
点击Releases
选择对应平台
下载结果
下载的.exe
文件是个自解压程序,可以选择解压到自定义目录,结果如下:
配置环境变量 path
;F:\IT\opencv\opencv_4_5_1\opencv\build\x64\vc15\bin;
记得要前后加分号
到时候如果不灵,就把bin目录里的dll文件放到C盘system32和system64目录下
VS新建工程,引入头文件,库文件
注意
:include、include\opencv2都填进去,不填会找不到头文件,小编也是一脸懵逼
debug填xxxxd.lib release填xxxx.lib
举例
#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;
}
效果如下:
注意
:如果各种报错,可以尝试从高版本一个个到低版本,小编用的版本是4.0.0,高版本死活不灵
Python搭建Windows OpenCV开发环境
首先安装Pycharm
intelij
系列软件超鸡儿强大,小编用的一系列开发软件除了VS,都是JB全家桶
Windows 搭建Python开发环境:
然后PyCharm安装OpenCV:
选择file->setting->Project:->Python Interpreter
如图:搜索opencv
,可以选择版本->Install Package
举例边缘检测
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()