Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ NDK-图像阈值化_C++_Image Processing_Android Ndk_Java Native Interface_Threshold - Fatal编程技术网

C++ NDK-图像阈值化

C++ NDK-图像阈值化,c++,image-processing,android-ndk,java-native-interface,threshold,C++,Image Processing,Android Ndk,Java Native Interface,Threshold,我想做一个双重歇斯底里阈值。 我将位图作为参数传递,然后设置阈值将其返回给android。 我的本机代码是: #include <jni.h> #include <android/log.h> #include <android/bitmap.h> #include <stdint.h> #include <stdlib.h> #include <math.h> #include <stdio.h> #inclu

我想做一个双重歇斯底里阈值。 我将位图作为参数传递,然后设置阈值将其返回给android。 我的本机代码是:

#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);
}

有什么帮助吗?

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

将其更改为:

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

etc

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

将其更改为:

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

etc

改变了它,同样的问题我编辑了我的答案,步幅计算也需要改变应用程序不再崩溃。但该算法并没有达到预期的效果。也就是说,我仍然有灰色像素。我在
中放置了一些日志,如果(p==0xFF888888)
,则未打印。请检查
infocolor.format
是否为
ANDROID\u BITMAP\u format\u RGBA\u 8888
。并检查灰色像素是否实际为0xff888888,而不是0xf808080或其他值。此外,代码中还有一个潜在的bug,即在读取位图时写入位图。因此,将一个像素设置为0xFFFFFF,然后在下一次迭代中将其作为fc读取,然后将白色传播到整行。尝试写入第二个位图,而不是正在读取的位图。我如何与您联系?我目前正在将边缘检测算法转换为ndk,该算法已经在android/java中实现。但是速度很慢。现在,歇斯底里是工作在本地与伟大的性能提升!我想翻译其他部分,如非最大值抑制。更改了它,同样的问题我编辑了我的答案,步幅计算也需要更改应用程序不再崩溃。但该算法并没有达到预期的效果。也就是说,我仍然有灰色像素。我在
中放置了一些日志,如果(p==0xFF888888)
,则未打印。请检查
infocolor.format
是否为
ANDROID\u BITMAP\u format\u RGBA\u 8888
。并检查灰色像素是否实际为0xff888888,而不是0xf808080或其他值。此外,代码中还有一个潜在的bug,即在读取位图时写入位图。因此,将一个像素设置为0xFFFFFF,然后在下一次迭代中将其作为fc读取,然后将白色传播到整行。尝试写入第二个位图,而不是正在读取的位图。我如何与您联系?我目前正在将边缘检测算法转换为ndk,该算法已经在android/java中实现。但是速度很慢。现在,歇斯底里是工作在本地与伟大的性能提升!我想翻译其他部分,比如非最大值抑制。
int pixelsPerRow = infocolor.stride / 4;

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