Android平台下使用OpenCV设置ROI

本次博文我们简单讲解下怎么在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;
}

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值