【问题标题】:How to render OpenCV Mat using OpenGL ES 2.0 on Android NDK?如何在 Android NDK 上使用 OpenGL ES 2.0 渲染 OpenCV Mat?
【发布时间】:2017-09-27 05:54:36
【问题描述】:

我已经在 Android NDK 中有一个 cv::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);
   }
   ....
}

为什么:我在 NDK 中使用 OpenCV 进行一些图像处理。现在,我正在使用将结果保存到 .jpg 并在 ImageView 上显示的方法。但下一步我将使用相机预览进行一些处理。我不想保存每一帧来查看结果。

目标:在 Android 上显示 cv::Mat

问题:如何在 NDK 中使用 OpenGL ES 2.0 显示 cv::Mat??

【问题讨论】:

    标签: android opencv opengl-es android-ndk textureview


    【解决方案1】:

    如果要在 Android 中显示 Mat,可以将 Mat 转换为像素,然后将像素传递给 Android。在 Android 中,您可以将像素转换为位图显示。

    这是获取 Mat 中像素的代码。

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

    【讨论】:

    • 今天早上发现可以使用EGL和SurfaceView解决问题。并开始学习EGL。你的方法不是我需要的,我不想用Bitmap。我需要更快的方式,更接近实时。不过谢谢你的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多