您的位置:首页 > 移动开发 > Android开发

Android平台下使用OpenCV设置ROI

2016-07-10 17:01 387 查看
本次博文我们简单讲解下怎么在Android平台下通过OpenCV设置ROI(Region of interest),通过设置感兴趣的区域实现复制原图的一小块区域。

Java层代码,就是读入了一张图片放到了Bitmap中,然后将像素数组传递到native层:

private void roiTest(){
Bitmap bitmap = ((BitmapDrawable) getResources().getDrawable(
R.drawable.food)).getBitmap();
int w = bitmap.getWidth(), h = bitmap.getHeight();

int[] pix = new int[w * h];
bitmap.getPixels(pix, 0, w, 0, 0, w, h);

int[] resultPixes = OpenCVHelper.ROI(pix, w, h);

Bitmap result = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
result.setPixels(resultPixes, 0, w, 0, 0, w, h);
imageView.setImageBitmap(result);
}

native层代码,大致意思就是在图的左上角圈了100x100的区域并且复制到partImage中,然后以 (80, 120) 为起点圈出100x100的区域为目标区域,最后加在灰度掩模合并即可:
JNIEXPORT jintArray JNICALL Java_yu_myself_opencv_jni_OpenCVHelper_ROI(
JNIEnv *env, jclass obj, jintArray buf, int w, int h){

jint *cbuf;
cbuf = env->GetIntArrayElements(buf, JNI_FALSE);
if (cbuf == NULL) {
return 0;
}

Mat srcImage(h, w, CV_8UC4, (unsigned char *) cbuf);

//拷贝需要复制的图像区域
Mat partImage;
srcImage(Rect(0, 0, 100, 100)).copyTo(partImage);

//得到圈出ROI的Mat
Mat ROIImage = srcImage(Rect(80, 120, 100, 100));

//加载掩模,必须是灰度图
Mat mark;
cvtColor(partImage, mark, COLOR_BGRA2GRAY);

//合并
partImage.copyTo(ROIImage, mark);

jint* ptr = srcImage.ptr<jint>(0);

int size = w * h;

jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result, 0, size, ptr);
env->ReleaseIntArrayElements(buf, cbuf, 0);
return result;
}

最后按照惯例上一张效果图给大家增加安全感:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android opencv native