我已经实现了camerax并通过将其成功转换为位图而将“图像代理”输出转为jni函数,并且我有2个从opencv github获得的函数,它们将位图转换为mat然后mat转换为位图
这些是jni中的函数
1-BitmapToMat(我猜效果很好)
void bitmapToMat(JNIEnv * env, jobject bitmap, Mat& dst , jboolean needUnPremultiplyAlpha){
AndroidBitmapInfo info;
void* pixels = 0;
try {
CV_Assert( AndroidBitmap_getInfo(env, bitmap, &info) >= 0 );
CV_Assert( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
info.format == ANDROID_BITMAP_FORMAT_RGB_565 );
CV_Assert( AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 );
CV_Assert( pixels );
dst.create(info.height, info.width, CV_8UC4);
if( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 )
{
Mat tmp(info.height, info.width, CV_8UC4, pixels);
if(needUnPremultiplyAlpha) cvtColor(tmp, dst, COLOR_mRGBA2RGBA);
else tmp.copyTo(dst);
} else {
// info.format == ANDROID_BITMAP_FORMAT_RGB_565
Mat tmp(info.height, info.width, CV_8UC2, pixels);
cvtColor(tmp, dst, COLOR_BGR5652RGBA);
}
AndroidBitmap_unlockPixels(env, bitmap);
return;
} catch(const cv::Exception& e) {
AndroidBitmap_unlockPixels(env, bitmap);
jclass je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, e.what());
return;
} catch (...) {
AndroidBitmap_unlockPixels(env, bitmap);
jclass je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, "Unknown exception in JNI code {nBitmapToMat}");
return;
}
}
2- Mat to Bitmap(我用这个函数出错)
void MattoBitmap(JNIEnv * env,Mat src , jobject bitmap, jboolean needPremultiplyAlpha)
{
AndroidBitmapInfo info;
void* pixels = 0;
try {
CV_Assert( AndroidBitmap_getInfo(env, bitmap, &info) >= 0 ); **//basically it gives me error in this line**
CV_Assert( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 ||
info.format == ANDROID_BITMAP_FORMAT_RGB_565 );
CV_Assert( src.dims == 2 && info.height == (uint32_t)src.rows && info.width == (uint32_t)src.cols );
CV_Assert( src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4 );
CV_Assert( AndroidBitmap_lockPixels(env, bitmap, &pixels) >= 0 );
CV_Assert( pixels );
if( info.format == ANDROID_BITMAP_FORMAT_RGBA_8888 )
{
Mat tmp(info.height, info.width, CV_8UC4, pixels);
if(src.type() == CV_8UC1)
{
cvtColor(src, tmp, COLOR_GRAY2RGBA);
} else if(src.type() == CV_8UC3){
cvtColor(src, tmp, COLOR_RGB2RGBA);
} else if(src.type() == CV_8UC4){
if(needPremultiplyAlpha) cvtColor(src, tmp, COLOR_RGBA2mRGBA);
else src.copyTo(tmp);
}
} else {
// info.format == ANDROID_BITMAP_FORMAT_RGB_565
Mat tmp(info.height, info.width, CV_8UC2, pixels);
if(src.type() == CV_8UC1)
{
cvtColor(src, tmp, COLOR_GRAY2BGR565);
} else if(src.type() == CV_8UC3){
cvtColor(src, tmp, COLOR_RGB2BGR565);
} else if(src.type() == CV_8UC4){
cvtColor(src, tmp, COLOR_RGBA2BGR565);
}
}
AndroidBitmap_unlockPixels(env, bitmap);
return;
} catch(const cv::Exception& e) {
AndroidBitmap_unlockPixels(env, bitmap);
jclass je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, e.what());
return;
} catch (...) {
AndroidBitmap_unlockPixels(env, bitmap);
jclass je = env->FindClass("java/lang/Exception");
env->ThrowNew(je, "Unknown exception in JNI code {nMatToBitmap}");
return;
}
}
java.lang.Error: java.lang.Exception: OpenCV(4.2.0) C:/Users/islam/AndroidStudioProjects/DriveFriend/app/src/main/cpp/native-lib.cpp:53: error: (-215:Assertion failed) AndroidBitmap_getInfo(env, bitmap, &info) >= 0 in function 'MattoBitmap'
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1173)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
Caused by: java.lang.Exception: OpenCV(4.2.0) C:/Users/islam/AndroidStudioProjects/DriveFriend/app/src/main/cpp/native-lib.cpp:53: error: (-215:Assertion failed) AndroidBitmap_getInfo(env, bitmap, &info) >= 0 in function 'MattoBitmap'
at com.islamozcelik.drivefriend.MainActivity.SayIamHere(Native Method)
at com.islamozcelik.drivefriend.MainActivity$1.analyze(MainActivity.java:79)
at androidx.camera.core.ImageAnalysis.lambda$setAnalyzer$1$ImageAnalysis(ImageAnalysis.java:371)
at androidx.camera.core.-$$Lambda$ImageAnalysis$qO2F3Tn7pfTvGyL-EvT8WWE0F0w.analyze(Unknown Source:4)
at androidx.camera.core.ImageAnalysisAbstractAnalyzer.lambda$analyzeImage$0$ImageAnalysisAbstractAnalyzer(ImageAnalysisAbstractAnalyzer.java:87)
at androidx.camera.core.-$$Lambda$ImageAnalysisAbstractAnalyzer$g-dcm6aZmGod2IWKPwN4CArIZzI.run(Unknown Source:8)
我尝试了很多东西,但仍然不知道问题是什么?有人可以帮我解决这个问题吗?