Android Jni OpenCV图片灰度处理
2017-11-22 10:47
459 查看
一,java代码,收集Bitmap 信息
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
}
二,jni实现
using namespace std;
using namespace cv;
void printMAtMessage(Mat &mat);
extern “C”
JNIEXPORT jintArray JNICALL
Java_com_example_dgxq008_opencv_1readpixel_MainActivity_grayProc(JNIEnv *env, jclass type
, jintArray pixels_
, jint w
, jint h) {
}
void printMAtMessage(Mat &mat) {
LOGD(“[b]***************************Mat信息开始************************[/b]”);
LOGD(“mat.rows %d”,mat.rows);
LOGD(“mat.cols %d”,mat.cols);
LOGD(“mat.total %d”,mat.total());
LOGD(“mat.channels %d”,mat.channels());
LOGD(“mat.depth %d”,mat.depth());
LOGD(“mat.type %d”,mat.type());
LOGD(“mat.flags %d”,mat.flags);
LOGD(“mat.elemSize %d”,mat.elemSize());
LOGD(“mat.elemSize1 %d”,mat.elemSize1());
LOGD(“[b]***************************Mat信息结束************************[/b]”);
}
重要的事情说三遍:在调用opencv图像处理函数时,一定要好好考虑一下图片的尺寸和通道.否则可能出现各种问题.
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnProc; private ImageView imageView; private Bitmap bmp; // 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); // Example of a call to a native method btnProc = (Button) findViewById(R.id.btn_gray_process); imageView = (ImageView) findViewById(R.id.image_view); bmp = BitmapFactory.decodeResource(getResources(), R.drawable.test7); imageView.setImageBitmap(bmp); btnProc.setOnClickListener(this); } /** * A native method that is implemented by the 'native-lib' native library, * which is packaged with this application. */ public static native int[] grayProc(int[] pixels, int w, int h); @Override public void onClick(View view) { int w = bmp.getWidth(); int h = bmp.getHeight(); int[] pixels = new int[w*h]; bmp.getPixels(pixels, 0, w, 0, 0, w, h); long startTime = System.currentTimeMillis(); int[] resultInt = grayProc(pixels, w, h); long endTime = System.currentTimeMillis(); Log.e("JNITime",""+(endTime-startTime)); Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); //(@ColorInt int[] pixels, int offset, int stride,int x, int y, int width, int height) resultImg.setPixels(resultInt, 0, w, 0, 0, w, h); imageView.setImageBitmap(resultImg); }
}
二,jni实现
using namespace std;
using namespace cv;
void printMAtMessage(Mat &mat);
extern “C”
JNIEXPORT jintArray JNICALL
Java_com_example_dgxq008_opencv_1readpixel_MainActivity_grayProc(JNIEnv *env, jclass type
, jintArray pixels_
, jint w
, jint h) {
jint* pixels = env->GetIntArrayElements(pixels_, NULL); if (pixels==NULL){ return 0; } //图片一进来时是ARGB 通过mat转换BGRA Mat img(h,w,CV_8UC4,(uchar *)pixels); //pixels 操作的是同一份数据 printMAtMessage(img); Mat temp; //转化为单通道灰度图,并打印信息 cvtColor(img,temp,COLOR_RGBA2GRAY); printMAtMessage(temp); //转化为四通道。特别注意:在调用ov图像处理函数时,一定要好好考虑一下图片的位数和通道.否则可能出现各种问题. cvtColor(temp,temp,COLOR_GR 4000 AY2BGRA); printMAtMessage(temp); uchar* tempData = temp.data; //对应数据指针 int size = w*h; jintArray result = env->NewIntArray(size); //env->SetIntArrayRegion(result,0,size,pixels); env->SetIntArrayRegion(result, 0, size, (const jint *) tempData); env->ReleaseIntArrayElements(pixels_, pixels, 0); return result;
}
void printMAtMessage(Mat &mat) {
LOGD(“[b]***************************Mat信息开始************************[/b]”);
LOGD(“mat.rows %d”,mat.rows);
LOGD(“mat.cols %d”,mat.cols);
LOGD(“mat.total %d”,mat.total());
LOGD(“mat.channels %d”,mat.channels());
LOGD(“mat.depth %d”,mat.depth());
LOGD(“mat.type %d”,mat.type());
LOGD(“mat.flags %d”,mat.flags);
LOGD(“mat.elemSize %d”,mat.elemSize());
LOGD(“mat.elemSize1 %d”,mat.elemSize1());
LOGD(“[b]***************************Mat信息结束************************[/b]”);
}
重要的事情说三遍:在调用opencv图像处理函数时,一定要好好考虑一下图片的尺寸和通道.否则可能出现各种问题.
相关文章推荐
- android中opencv操作图片像素----之图像灰度处理
- 在Android平台上利用opencv进行图像处理之边缘检测、灰度变换、缩小
- android中通过JNI读取Bitmap文件,并调用opencv进行处理
- android JNI处理图片的例子
- 在Android中使用OpenCv 来处理图片
- android JNI处理图片的例子
- Android Studio + NDK JNI调用openCV图像处理
- Android opencv 图片处理
- Android OpenCV简单图片处理,不需要安装Manager,不需要ndk,简单实用
- Android关于图片处理,更改图片灰度
- Android JNI处理图片实现黑白滤镜的方法
- android开发在jni中使用Opencv进行图像处理,环境搭建篇
- android JNI处理图片的例子
- 通过jni调用OpenCv跟直接调用android版openCv对图片进行简单的变换
- Qt creator5.7 OpenCV249之图片灰度处理(含源码下载)
- Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码
- OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
- android 圆角图片 处理
- opencv读取彩色/灰度图片像素值并存储在本地文件中c++代码实例及运行结果
- android处理图片工具类,图片压缩,把图片互换转换成base64和bitmap