Android jpeg pictureCallback to grayscale Opencv Mat

时间:2016-06-20 11:40:02

标签: android opencv image-processing android-ndk

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

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

 mCamera.takePicture(null, mPicture, null);

JpegCalback给出的不是null byte []数组,但是cvtColor转换不起作用。

mCamera.takePicture(null, null, mPicture);

我的预览回调就是这个

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

也许getarraylenght不能正常工作并返回0.我通常使用lenght作为宽度x高度,提供参数来计算数组大小。这会将数据从相机缓冲区复制到内存中。

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