2016-06-20 3 views
5

をグレースケールに私は、グレースケールマットにアンドロイドpictureCallbackを解読しようとしている:AndroidのJPEG pictureCallbackは、OpenCVのマット

まず私はrawPictureコールバックを使用しようとしたが、いつも私はNULLポインタを取得します。

mCamera.takePicture(null, mPicture, null); 

JpegCalbackはnullではないbyte []配列を返しますが、cvtColor変換は機能しません。私はいくつかの答えを発見したが、それらのどれも働かない

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

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関数です。

ため、私はテストのSDカードに画像を書き、それが0バイトの空のイメージを書き込みます。

だから、どうすればjpegピクセルをグレーのフォーマットにするべきですか?

+1

lenにはどのような値が入りますか? getarraylenghtは時々0を返すので、私は過去に同様の問題を抱えていると思います。正しいlenはwidth x heightのint乗算を計算することができます – vgonisanz

+0

あなたは正しいです、lenは0です、画像は壊れています、私はSIGSEVエラーを見ることができませんでした。ありがとう。 – uelordi

答えて

1

おそらく、getarraylenghtは機能しておらず、0を返しています。私は通常、配列のサイズを計算するために提供される幅x高さとしてlenghtを使用します。それはカメラのバッファからメモリにデータをコピーします。

警告:サイズに問題がある場合は、Signal 11例外が発生します。

関連する問題