Android jpeg pictureCallback to grayscale Opencv Mat

uel*_*rdi 5 android opencv image-processing android-ndk

我正在尝试将android pictureCallback解码为灰度垫:

首先我尝试使用rawPicture回调但总是得到空指针.

 mCamera.takePicture(null, mPicture, null);
Run Code Online (Sandbox Code Playgroud)

JpegCalback给我不是null byte []数组,但cvtColor转换不起作用.

mCamera.takePicture(null, null, mPicture);
Run Code Online (Sandbox Code Playgroud)

我的预览回调就是这个

Camera.PictureCallback mPicture = new Camera.PictureCallback() {
    @Override
        public void onPictureTaken(byte[] data, Camera camera) {

        Toast.makeText(getApplicationContext(),"picture taken",Toast.LENGTH_SHORT);
        int res=JniManager.setImage(data,m_width,m_height);
        mCamera.stopPreview();
        mCamera.startPreview();
    }
};
Run Code Online (Sandbox Code Playgroud)

c ++ JNI函数:

    Java_pidaas_vicomtech_org_facerec_viulib_JniManager_setImage(JNIEnv *env,
                                                    jobject instance,
                                                    jbyteArray image,
                                                    jint width,
                                                    jint height)
     jbyte* _yuv  = env->GetByteArrayElements(image, 0);
     int len = env->GetArrayLength (image);
     unsigned char* buf = new unsigned char[len];
     env->GetByteArrayRegion (image, 0, len, reinterpret_cast<jbyte*>(buf));
     Mat rawData (cv::Size(width,height), CV_8UC3, buf );
            cv::Mat test =imdecode(rawData,CV_LOAD_IMAGE_COLOR);
            cv::Mat grey;
            cv::cvtColor(test, grey, cv::COLOR_BGR2GRAY);
            bool flag = imwrite("/sdcard/graypg.jpg", grey);
    env->ReleaseByteArrayElements(image, _yuv, 0);
}
Run Code Online (Sandbox Code Playgroud)

我找到了一些答案,但没有一个有效.

我因为测试而在sdcard上写图像,但是它写了一个0字节的空图像.

所以,任何人都知道如何将jpeg像素作为灰色格式?

vgo*_*anz 1

也许 getarraylenght 无法正常工作并返回 0。我通常使用长度作为宽度 x 高度,提供的参数用于计算数组大小。这会将数据从相机缓冲区正确复制到内存。

警告:如果尺寸有问题,您将收到 Signal 11 异常!