這里省去ndk開(kāi)發(fā)環(huán)境的配置 直接進(jìn)入opencv集成到Android studio中
我們?cè)趏pencv官網(wǎng)下載到的https://opencv.org android開(kāi)發(fā)包 解壓壓縮包結(jié)構(gòu)
U$MD9(`)]]TK6WHT8H`O470.png
在項(xiàng)目的main文件下新建jniLibs目錄 將opencv的.so文件拷貝到該目錄下
ss.png
將opencv的include文件夾拷貝到cpp文件夾下
includ.png
配置cmake文件
# 設(shè)置include文件夾的地址
include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)
# 設(shè)置opencv的動(dòng)態(tài)庫(kù)
add_library(libopencv_java3
SHARED
IMPORTED)
set_target_properties(libopencv_java3
PROPERTIES
IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}/libopencv_java3.so)
target_link_libraries( # Specifies the target library.
native-lib libopencv_java3 jnigraphics
# Links the target library to the log library
# included in the NDK.
${log-lib})
build.gradle文件 android 節(jié)點(diǎn)下配置
android {
.......
sourceSets {
main {
jniLibs.srcDirs = ['src/main/jniLibs']
}
}
.......
到此我們opencv 已經(jīng)配置完成 下面我們來(lái)寫(xiě)一個(gè)小demo驗(yàn)證是否配置成功
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView iv_show = findViewById(R.id.iv_show);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.zyz);
BitmapUtils.counterWorld(bitmap);
iv_show.setImageBitmap(bitmap);
}
}
下面是利用opencv 實(shí)現(xiàn)的一個(gè)逆世界效果
#include <jni.h>
#include <string>
#include<opencv2/opencv.hpp>
#include "bitmap/com_youyangbo_opencv_BitmapUtils.h"
#include "bitmap/opencvHelp.h"
using namespace cv;
extern "C" void JNICALL Java_com_youyangbo_opencv_BitmapUtils_counterWorld
(JNIEnv *env, jclass jclazz, jobject bitmap) {
Mat src;
bitmap2Mat(env, src, bitmap);
int middleRows = src.rows >> 1;
int quarterRows = middleRows >> 1;
Mat conword_imag(src.size(), src.type());
for (int row = 0; row < middleRows; ++row) {
for (int col = 0; col < src.cols; ++col) {
conword_imag.at<float>(middleRows + row, col) = src.at<float>(
quarterRows + row, col);
}
}
for (int row = 0; row < middleRows; ++row) {
for (int col = 0; col < src.cols; ++col) {
conword_imag.at<float>(middleRows - row, col) = src.at<float>(quarterRows + row, col);
}
}
mat2Bitmap(env, conword_imag, bitmap);
}
opencv 是c/c++的庫(kù)瞬欧,處理圖片數(shù)據(jù)是Mat(矩陣)徐矩,Android 圖片表現(xiàn)形式是Bitmap,所以Android中的圖片交給opencv處理必須先將Bitmap轉(zhuǎn)化成Mat吁脱,
#include "bitmap/opencvHelp.h"
#include <android/log.h>
/**
* bitmap 轉(zhuǎn)化為矩陣(Mat)
* @param pEnv
* @param mat
* @param bitmap
*/
void bitmap2Mat(JNIEnv *env, cv::Mat &mat, jobject bitmap) {
AndroidBitmapInfo bitmap_info;
void *pPixel = NULL;
AndroidBitmap_getInfo(env, bitmap, &bitmap_info);
AndroidBitmap_lockPixels(env, bitmap, &pPixel);
//判斷傳入的圖片是什么類(lèi)型
if (bitmap_info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {//32
//對(duì)應(yīng)opncv Mat 類(lèi)型 CV_8UC4
cv::Mat temp(bitmap_info.height, bitmap_info.width, CV_8UC4, pPixel);
temp.copyTo(mat);
} else if (bitmap_info.format == ANDROID_BITMAP_FORMAT_RGB_565) {//16
//對(duì)應(yīng)opncv Mat 類(lèi)型 CV_8UC2
cv::Mat temp(bitmap_info.height, bitmap_info.width, CV_8UC2, pPixel);
cv::cvtColor(temp, mat, CV_BGRA2BGR565);
}
AndroidBitmap_unlockPixels(env, bitmap);
}
/**
* Mat轉(zhuǎn)化為Bitmap
* @param pEnv
* @param mat
* @param bitmap
*/
void mat2Bitmap(JNIEnv *env, cv::Mat &mat, jobject bitmap) {
AndroidBitmapInfo bitmap_info;
void *pPixel = NULL;
AndroidBitmap_lockPixels(env, bitmap, &pPixel);
AndroidBitmap_getInfo(env, bitmap, &bitmap_info);
//判斷傳入的圖片是什么類(lèi)型
if (bitmap_info.format == ANDROID_BITMAP_FORMAT_RGBA_8888) {//32
cv::Mat tmp(bitmap_info.height, bitmap_info.width, CV_8UC4, pPixel);
//對(duì)應(yīng)opncv Mat 類(lèi)型 CV_8UC4
if (mat.type() == CV_8UC4) {
//對(duì)應(yīng)bitmap RGBA_8888
mat.copyTo(tmp);
} else if (mat.type() == CV_8UC2) {
//對(duì)應(yīng)bitmap RGB_565
cv::cvtColor(mat, tmp, CV_BGR5652BGRA);
} else if (mat.type() == CV_8UC1) {
//單通道 0-255 的灰度圖
cv::cvtColor(mat, tmp, CV_GRAY2BGRA);
}
} else if (bitmap_info.format == ANDROID_BITMAP_FORMAT_RGB_565) {//16
cv::Mat tmp(bitmap_info.height, bitmap_info.width, CV_8UC2, pPixel);
//對(duì)應(yīng)opncv Mat 類(lèi)型 CV_8UC2
if (mat.type() == CV_8UC4) {
//對(duì)應(yīng)bitmap RGBA_8888
cv::cvtColor(mat, tmp, CV_BGRA2BGR565);
} else if (mat.type() == CV_8UC2) {
//對(duì)應(yīng)bitmap RGB_565
mat.copyTo(tmp);
} else if (mat.type() == CV_8UC1) {
//單通道 0-255 的灰度圖
cv::cvtColor(mat, tmp, CV_GRAY2BGR565);
}
}
AndroidBitmap_unlockPixels(env, bitmap);
}
代碼運(yùn)行效果:
2.jpg
經(jīng)過(guò)opencv處理過(guò)的
demo.png