Java 需要一个建议:从相机处理彩色图像;安卓OpenCV;NDK;C++;

Java 需要一个建议:从相机处理彩色图像;安卓OpenCV;NDK;C++;,java,android,c++,opencv,android-ndk,Java,Android,C++,Opencv,Android Ndk,我想对安卓设备摄像头拍摄的图像预览进行一些预处理 我可以用以下方式描述我的申请: 1.)Java部分 // Getting preview from camera. public void onPreviewFrame(byte[] arg0, Camera arg1) { if (imageFormat == ImageFormat.NV21) { frameData = arg0; // private byte[] frameData = n

我想对安卓设备摄像头拍摄的图像预览进行一些预处理

我可以用以下方式描述我的申请:

1.)Java部分

    // Getting preview from camera.
    public void onPreviewFrame(byte[] arg0, Camera arg1) {
    if (imageFormat == ImageFormat.NV21) {
            frameData = arg0; // private byte[] frameData = null;
        }
    }
    // ...
    // After some code - call native function.
    ImageProcessing(width, height, frameData, output); // private int[] output= null;
    // Setting output to bitmap, etc...
    MyCameraPreview.setImageBitmap(bitmap); // Dislplay, etc...

2)C++部分。图像处理

extern "C"
jboolean huge_prefix_ImageProcessing(
            JNIEnv* env,
            jobject thiz,
            jint width, 
            jint height,
            jbyteArray frameData,
            jintArray output)
    {
        jbyte* pFrameData = env->GetByteArrayElements(frameData, 0);
        jint* pOutput = env->GetIntArrayElements(output, 0);

        Mat gray(height, width, CV_8UC1, (unsigned char *)pFrameData);
        // Some processing and writing gray to result.
        // ...
        return true;
    }
对于灰度图像,一切都很完美。但是现在我需要对RGB图像进行处理。有人能给我一个正确的建议吗?我做了​​几次尝试:

  • ImageProcessing函数内部将pFrameData转换为rgb格式(从nv21)
  • 在函数onPreviewFrame中将nv21更改为RGB_565,并在图像容器中进行其他更改

    • 你试过这样的东西吗?(从JNI包装器调用)

      void convertYUV(int-width,int-height,jbyteArray-yuvArray){
      //从JEnv那里得到数据。
      签名字符*data=JNIEnvInfo::getInstance()->getJNIEnv()->GetByteArrayElements(yuvArray,0);
      //转换为Mat对象。
      Mat imgbuf(尺寸(宽度、高度)、CV_8UC4(无符号字符*)数据);
      Mat img=imdecode(imgbuf、CV\u LOAD\u IMAGE\u COLOR);
      //
      //释放JNI数据指针。
      JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseByteArrayElements(yuvArray,(jbyte*)yuvArray,0);
      //…用垫子做东西。。
      }
      Mat convertRGB(内部宽度,内部高度,金塔瑞rgb8888)
      {
      //
      int*rgb;
      int i;
      //
      //从JEnv那里得到数据。
      int*data=JNIEnvInfo::getInstance()->getJNIEnv()->GetIntArrayElements(rgb8888,0);
      //
      //复制数据。
      对于(i=0;igetJNIEnv()->ReleaseIntArrayElements(rgb888,(jint*)rgb888,0);
      返回img;
      }
      
      您没有使用CvCameraViewFrame和onCameraFrame吗?不,反正我也没用过。但我现在会试试。因为当我玩它的时候,灰色和rgb的使用非常简单,所以我建议使用它们。我试过这种方法,程序在imdecode后终止。
      void convertYUV( int width, int height, jbyteArray yuvArray ) {
      
           // Get the data from JEnv. 
          signed char *data = JNIEnvInfo::getInstance()->getJNIEnv()->GetByteArrayElements(yuvArray, 0);
      
           // Convert to Mat object.
           Mat imgbuf(Size(width,height), CV_8UC4, (unsigned char*) data);
           Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
      
          //
          // Release the JNI data pointer.
          JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseByteArrayElements(yuvArray, (jbyte*) yuvArray, 0);
      
          // ... do stuff with the Mat ..
      
      }
      
      
      
      Mat convertRGB(int width , int height , jintArray rgb8888)
      {
      
          //
          int *rgb;
          int i;
      
          //
          // Get the data from JEnv. 
          int *data = JNIEnvInfo::getInstance()->getJNIEnv()->GetIntArrayElements(rgb8888, 0);
      
         //
         // Copy the data.
          for(i = 0; i < width * height; i++ ) {
              rgb[i] = data[i];
         }
      
         //
         // Convert to mat object.
         Mat imgbuf(Size(width,height), CV_8UC3, rgb);
         Mat img = imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
      
         //
         // Release the JNI data pointer.
         JNIEnvInfo::getInstance()->getJNIEnv()->ReleaseIntArrayElements(rgb8888, (jint*) rgb8888, 0);
      
         return img;
      }