勇敢地追 2016-11-17 11:16 采纳率: 66.7%
浏览 1030
已采纳

jni多次将一张图片二值化却获得相同的效果

通过seekbar获得二值化的阈值

 bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.road);
        w = bitmap.getWidth();
        h = bitmap.getHeight();
        pix = new int[w * h];
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);

        imageView = (ImageView) findViewById(R.id.imageView1);
        seekBar = (SeekBar) findViewById(R.id.seekBar1);
        seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                Toast.makeText(MainActivity.this, thresHold + "",
                        Toast.LENGTH_SHORT).show();
                int[] result_pix = Binary.binaryImage(pix, w, h, thresHold);
                Bitmap result = Bitmap.createBitmap(w, h, Config.ARGB_8888);
                result.setPixels(result_pix, 0, w, 0, 0, w, h);
                imageView.setImageBitmap(result);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
            }

            @Override
            public void onProgressChanged(SeekBar seekBar, int progress,
                    boolean fromUser) {
                thresHold = progress;
            }
        });

jni里面是这么写的

 JNIEXPORT jintArray JNICALL Java_com_example_binaryimage_Binary_binaryImage(
        JNIEnv *env, jclass clz, jintArray buffer, jint width, jint height,
        jint threshold) {
    jint *cbuf = env->GetIntArrayElements(buffer, JNI_FALSE);
    if (cbuf == NULL) {
        return 0; /* exception occurred */
    }
    jint alpha = 0xFF << 24;
    for (jint i = 0; i < height; i++) {
        for (jint j = 0; j < width; j++) {
            // 获得像素的颜色
            jint color = cbuf[width * i + j];
            jint red = ((color & 0x00FF0000) >> 16);
            jint green = ((color & 0x0000FF00) >> 8);
            jint blue = color & 0x000000FF;
            color = (red + green + blue) / 3;
            __android_log_print(ANDROID_LOG_ERROR, "TAG", "pix=%d", color);
            if (color <= threshold) {
                color = 0;
            } else {
                color = 255;
            }
            color = alpha | (color << 16) | (color << 8) | color;
            cbuf[width * i + j] = color;
        }
    }
    jint size = width * height;
    jintArray result = env->NewIntArray(size);
    env->SetIntArrayRegion(result, 0, size, cbuf);
    env->ReleaseIntArrayElements(buffer, cbuf, 0);
    return result;
}

在onStopTrackingTouch函数中每次获得的result_pix 都不一样,但是不知道为什么setImageBitmap以后图像没变化。
如果是第一次运行该程序可以获得正确效果,但如果不退出继续多次滑动seekbar效果不变。不知道为什么?求大神解答

  • 写回答

1条回答 默认 最新

  • 勇敢地追 2016-11-18 02:57
    关注

    我自己解决啦。我发现

     int[] result_pix = Binary.binaryImage(pix, w, h, thresHold);
    

    这代码不仅会改变result_pix,pix也会变,所以只要这样

     @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    textView.setText("阈值是:" + thresHold);
                    bitmap.getPixels(pix, 0, w, 0, 0, w, h);
                    // binaryImage会把pix替换掉
                    int[] result_pix = Binary.binaryImage(pix, w, h, thresHold);
                    result.setPixels(result_pix, 0, w, 0, 0, w, h);
                    imageView.setImageBitmap(result);
                }
    

    至于为啥这么做我不知道了。求大神说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog