2017-09-27 22 views
0

는 이미 안드로이드 NDKAndroid NDK에서 OpenGL ES 2.0을 사용하여 OpenCV Mat를 렌더링하는 방법은 무엇입니까?

cv::Mat grayMat; 
grayMat.create(480, 720, CV_8UC1); 

와 JAVA의 TextureView에 이력서 :: 매트가있다.

public class MainActivity extends Activity implements TextureView.SurfaceTextureListener{ 
    private TextureView mTextureView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mTextureView = new TextureView(this); 
     mTextureView.setSurfaceTextureListener(this); 
    } 
    .... 
} 

이유 : NDC에서 OpenCV를 사용하여 일부 이미지 처리를하고 있습니다. 이제 결과를 .jpg로 저장하고 ImageView에 표시하는 방법을 사용하고 있습니다. 하지만 다음 단계에서는 카메라 미리보기를 사용하여 일부 처리를 수행합니다. 결과를보기 위해 각 프레임을 저장하고 싶지 않습니다.

목표 : 안드로이드에

질문 이력서 :: 매트보기 : 어떻게 NDK에서의 OpenGL ES 2.0을 사용하여 이력서 :: 매트를 보여주는를?

답변

0

안드로이드에 매트를 표시하려면 매트를 픽셀로 변환 한 다음 픽셀을 Android로 전달할 수 있습니다. Android에서는 픽셀을 비트 맵으로 변환하여 표시 할 수 있습니다.

여기에 매트의 픽셀을 가져 오는 코드가 있습니다.

int* getPixel(Mat src){ 
    int w = src.cols; 
    int h = src.rows; 
    int* result = new int[w*h]; 

    int channel = src.channels(); 
    if(channel == 1){ 
     for (int i = 0; i < w; i++) { 
      for (int j = 0; j < h; j++) { 
       int value = (int)(*(src.data + src.step[0] * j + src.step[1] * i)); 
       result[j*w+i] = rgb(value, value, value); 
      } 
     } 
    }else if(channel == 3 || channel == 4){ 
     for (int i = 0; i < w; i++){ 
      for (int j = 0; j < h; j++){ 
       int r = (int)(*(src.data + src.step[0] * j + src.step[1] * i + src.elemSize1() * 2)); 
       int g = (int)(*(src.data + src.step[0] * j + src.step[1] * i + src.elemSize1())); 
       int b = (int)(*(src.data + src.step[0] * j + src.step[1] * i)); 
       result[j*w+i] = rgb(r, g, b); 
      } 
     } 
    } 
    return result; 
} 

int rgb(int red, int green, int blue) { 
    return (0xFF << 24) | (red << 16) | (green << 8) | blue; 
} 

비트 맵을 가져오고 (너비와 높이도 필요함).

Bitmap bmpReturn = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565); 
bmpReturn.setPixels(matPixels, 0, width, 0, 0, width, height); 
+0

나는이 문제를 해결하기 위해 EGL과 SurfaceView를 사용할 수 있음을 발견했다. 그리고 EGL을 공부하십시오. 당신의 방법이 내가 원하는 것이 아니며, 나는 비트 맵을 사용하고 싶지 않습니다. 나는 더 빠른 방법과 실시간에 가깝다. 그러나이 제안에 감사드립니다. –