2016-06-21 2 views
1

이중 히스테리 시스 thresholding을 수행하려고합니다. 비트 맵을 매개 변수로 전달한 다음 임계 값으로 되돌려서 Android로 다시 반환합니다. 내 네이티브 코드는 다음과 같습니다NDK - 이미지 thresholding

#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 ... 

어떤 도움?

답변

0

루프 종료 조건은 x와 y에 따라 다릅니다. y의 경우 < infocolor.height - 1 동안 반복해야하므로 마지막 y 값은 infocolor.height - 2과 같아야합니다. 즉, y에 1을 더하면 infocolor.height - 1이되며 범위를 벗어나는 최대 y 값입니다.

변경 그것에 :

int pixelsPerRow = infocolor.stride/4; 

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

등 : 당신이 4 분할해야 있도록

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

또한, 보폭은 행 당 바이트, 픽셀 수가 아닌의 수이며,

+0

변경했습니다. 동일한 문제 – yanisk

+0

내 대답을 편집했습니다. 보폭 계산도 변경해야합니다. – samgak

+0

앱이 더 이상 충돌하지 않습니다. 그러나 알고리즘은 의도 된 것을 수행하지 않습니다. 나는 여전히 회색 픽셀을 가지고있다. 'if (p == 0xFF888888)'안에 일부 LOG를 두었습니다. 인쇄되지 않습니다. – yanisk