我一直在遵循有关如何在此site上实现HDR的示例
我正在尝试在Android的本机应用程序中实现代码,并在C ++中调用代码。代码如下:
JNIEXPORT jint JNICALL
Java_org_opencv_OpenCvJNI_processHdr(JNIEnv *env,
jclass clazz,
jlongArray inputImages,
jfloatArray exposureTimes,
jlong dst) {
cv::Mat& output = *(cv::Mat*)dst;
LOGD("HDR start");
jsize count = env->GetArrayLength(inputImages);
jlong *imagesArrayData = env->GetLongArrayElements(inputImages, 0);
LOGD("HDR get mats");
vector<cv::Mat> images(count);
vector<float> times(count);
for (int i = 0; i < count; i++) {
cv::Mat& frame = *(cv::Mat*)imagesArrayData[0];
images[i] = frame;
}
LOGD("HDR get times");
env->GetFloatArrayRegion(exposureTimes, 0, count, ×[0]);
LOGD("HDR merge");
Mat hdr;
Ptr<MergeDebevec> merge_debevec = createMergeDebevec();
merge_debevec->process(images, hdr, times);
LOGD("HDR tonemap");
Mat ldr;
Ptr<Tonemap> tonemapDrago = createTonemap(1.0);
tonemapDrago->process(hdr, ldr);
output = ldr * 255;
LOGD("HDR save");
cv::imwrite("/storage/emulated/0/opencv/example.png", output);
return 0;
}
代码运行正常,并且传递给该方法的jlongArray和jfloatArray与示例具有相同的图像。但是,输出图像是如此明亮。第一张图片是我的输出,按照代码实验室的要求,输出了2º:
有人知道我会做错什么吗?之前我也尝试过对相机Response进行校准。但是,这样做花了很长时间,结果看起来更糟。
非常感谢您。