c++ - NDK - 图像阈值

标签 c++ image-processing android-ndk java-native-interface threshold

我想执行双滞后阈值。 我将位图作为参数传递,然后我对其进行阈值处理以将其返回给 android。 我的 native 代码是:

#include <jni.h>
#include <android/log.h>
#include <android/bitmap.h>
#include <stdint.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <inttypes.h>


#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)

typedef struct {

    uint8_t red;
    uint8_t green;
    uint8_t blue;
    uint8_t alpha;
} argb;

JNIEXPORT void JNICALL Java_com_mypakage_MainActivity_Hysterisis
  (JNIEnv *env, jobject obj, jobject bmp){

        AndroidBitmapInfo  infocolor;
        void*              pixelscolor;
        int                ret;
        int             y;
        int             x;
        uint32_t *pixel;


        if ((ret = AndroidBitmap_getInfo(env, bmp, &infocolor)) < 0) {
            return;
        }

        if ((ret = AndroidBitmap_lockPixels(env, bmp, &pixelscolor)) < 0) {
        }


        pixel = (uint32_t *) pixelscolor;

            uint32_t p,ac,bc,cc,dc,ec,fc,gc,hc;
            bool again = true;
            while (again) {
                again=false;
                for (y=1;y<=infocolor.height - 1;y++) {
                    for (x=1;x<infocolor.width -1;x++) {
                        p = (uint32_t) ( (*(pixel + x + (y ) * infocolor.stride)));


                        if (p == 0xFF888888) {
                            ac = (uint32_t) ( (*(pixel + x -1 + (y -1 ) * infocolor.stride)));
                            bc = (uint32_t) ( (*(pixel + x + (y -1 ) * infocolor.stride)));
                            cc = (uint32_t) ( (*(pixel + x +1 + (y -1 ) * infocolor.stride)));
                            dc = (uint32_t) ( (*(pixel + x +1 + (y ) * infocolor.stride)));
                            ec = (uint32_t) ( (*(pixel + x +1 + (y+1 ) * infocolor.stride)));
                            fc = (uint32_t) ( (*(pixel + x + (y +1 ) * infocolor.stride)));
                            fc = (uint32_t) ( (*(pixel + x -1 + (y +1 ) * infocolor.stride)));
                            fc = (uint32_t) ( (*(pixel + x -1 + (y ) * infocolor.stride)));
                            if (ac ==0xFFFFFFFF || bc ==0xFFFFFFFF || cc ==0xFFFFFFFF || dc ==0xFFFFFFFF
                                    || ec ==0xFFFFFFFF || fc ==0xFFFFFFFF || gc ==0xFFFFFFFF || hc ==0xFFFFFFFF) {
                                ( (*(pixel + x + (y ) * infocolor.stride)))= 0xFFFFFFFF;
                                again=true;
                            }
                        }

                    }

                }
            }

      for (y=1;y<=infocolor.height - 1;y++) {
            for (x=1;x<infocolor.width -1;x++) {
                p = (uint32_t) ( (*(pixel + x + (y ) * infocolor.stride)));
                if (p == 0xFF888888) {
                    ( (*(pixel + x + (y ) * infocolor.stride)))= 0xFF000000;
                }

            }
        }


        AndroidBitmap_unlockPixels(env, bmp);
}

我的问题是应用程序崩溃并出现以下错误:

A/libc(29191): Fatal signal 11 (SIGSEGV) at ...

有什么帮助吗?

最佳答案

x 和 y 的循环终止条件不同。对于 y,您应该迭代 while < infocolor.height - 1 , 因此最后的 y 值等于 infocolor.height - 2 ,这意味着当您将 1 添加到 y 时,您将寻址 infocolor.height - 1 ,这是超出范围之前的最大 y 值。

将其更改为:

for (y=1;y<infocolor.height - 1;y++)

此外,步幅是每行的字节数,而不是像素数,因此您需要除以 4:

int pixelsPerRow = infocolor.stride / 4;

ac = (uint32_t) ( (*(pixel + x -1 + (y -1 ) * pixelsPerRow)));

等等

关于c++ - NDK - 图像阈值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37955695/

相关文章:

c++ - 安卓 C++ NDK

c++ - 有条件地构造参数包的默认可构造类

C++11数学库变了?

android - 用于 linux 平台的中间件 android 开发的模拟器

python - OpenCV python,如何以python方式将操作应用于单个 channel ?

python - 提高 getpixel 和 putpixel 的速度

c++ - 播放wav文件后,是否需要删除缓冲区?

javascript - 什么是正确的 Oculus Rift 桶形畸变半径函数?

android - 使用通过 CMAKE 构建的 Android NDK 时如何获取构建类型?

android - 如何从 Cocos2dx 的 HelloWorld 示例创建 .apk?