opencv can';t在虚拟void cv::videostab::{anonymous}::VideoFileSourceImpl::reset()中打开文件:/storage/emulated/0/test.mp4

opencv can';t在虚拟void cv::videostab::{anonymous}::VideoFileSourceImpl::reset()中打开文件:/storage/emulated/0/test.mp4,opencv,opencv4android,Opencv,Opencv4android,我想使用opencvvideostab来提高android设备上的视频稳定性。我使用NDK成功地运行了代码,但是当我尝试使用VideoFileSource读取文件时,它不起作用,而是抛出 下面是错误 cv::error(): OpenCV(3.4.2-dev) Error: No Error (can't open file: /storage/emulated/0/test.mp4) in virtual void cv::videostab::{anonymous}::VideoFileSo

我想使用
opencvvideostab
来提高
android
设备上的视频稳定性。我使用
NDK
成功地运行了代码,但是当我尝试使用
VideoFileSource
读取文件时,它不起作用,而是抛出 下面是错误

cv::error(): OpenCV(3.4.2-dev) Error: No Error (can't open file: /storage/emulated/0/test.mp4) in virtual void cv::videostab::{anonymous}::VideoFileSourceImpl::reset(), file /build/3_4_pack-android/opencv/modules/videostab/src/frame_source.cpp, line 71
但该文件实际上已退出,并已获得必要的权限。 有人能帮我找出这个问题吗。这对我很重要

我的cpp源代码:

stability(JNIEnv *env, jclass clazz,jstring inputPath, jstring outputPath) {

    Ptr<IFrameSource> stabilizedFrames;

    const char *input = env->GetStringUTFChars(inputPath, NULL);
    const char *output = env->GetStringUTFChars(outputPath, NULL);

    string a = input;
    try {
        Ptr<VideoFileSource> source = makePtr<VideoFileSource>(input);
        cout << "frame count (rough): " << source->count() << endl;

        double min_inlier_ratio = 0.1;
        Ptr<MotionEstimatorRansacL2> est = makePtr<MotionEstimatorRansacL2>(MM_AFFINE);
        RansacParams ransac = est->ransacParams();
        ransac.size = 3;
        ransac.thresh = 5;
        ransac.eps = 0.5;
        est->setRansacParams(ransac);
        est->setMinInlierRatio(min_inlier_ratio);

        int nkps = 1000;
        Ptr<GFTTDetector> feature_detector = GFTTDetector::create(nkps);

        Ptr<KeypointBasedMotionEstimator> motionEstBuilder = makePtr<KeypointBasedMotionEstimator>(
                est);
        motionEstBuilder->setDetector(feature_detector);
        Ptr<IOutlierRejector> outlierRejector = makePtr<NullOutlierRejector>();
        motionEstBuilder->setOutlierRejector(outlierRejector);
        StabilizerBase *stabilizer = 0;
        bool isTwoPass = 1;
        int radius_pass = 15;
        if (isTwoPass) {
            bool est_trim = true;
            TwoPassStabilizer *twoPassStabilizer = new TwoPassStabilizer();
            twoPassStabilizer->setEstimateTrimRatio(est_trim);
            twoPassStabilizer->setMotionStabilizer(makePtr<GaussianMotionFilter>(radius_pass));
            stabilizer = twoPassStabilizer;
        } else {
            OnePassStabilizer *onePassStabilizer = new OnePassStabilizer();
            onePassStabilizer->setMotionFilter(makePtr<GaussianMotionFilter>(radius_pass));
            stabilizer = onePassStabilizer;
        }
        int radius = 15;
        double trim_ratio = 0.1;
        bool incl_constr = false;
        stabilizer->setFrameSource(source);
        stabilizer->setMotionEstimator(motionEstBuilder);
        stabilizer->setRadius(radius);
        stabilizer->setTrimRatio(trim_ratio);
        stabilizer->setCorrectionForInclusion(incl_constr);
        stabilizer->setBorderMode(BORDER_REPLICATE);
        stabilizedFrames.reset(dynamic_cast<IFrameSource *>(stabilizer));


        VideoWriter writer;
        Mat stabilizedFrame;
        int nframes = 0;
        double outputFps = 25;
        while (!(stabilizedFrame = stabilizedFrames->nextFrame()).empty()) {
            nframes++;
            if (!writer.isOpened())
                writer.open(output, VideoWriter::fourcc('X', 'V', 'I', 'D'), outputFps,
                            stabilizedFrame.size());
            writer << stabilizedFrame;
            imshow("stabilizedFrame", stabilizedFrame);
            char key = static_cast<char>(waitKey(3));
            if (key == 27) {
                cout << endl;
                break;
            }
        }
        cout << "processed frames: " << nframes << endl;
        cout << "finished " << endl;


//        processing(stabilizedFrames, outputPath);
    }
    catch (const exception &e) {
        cout << "error: " << e.what() << endl;
        stabilizedFrames.release();
        return ;
    }

    env->ReleaseStringUTFChars(inputPath, input);
    env->ReleaseStringUTFChars(outputPath, output);
    stabilizedFrames.release();

}
稳定性(JNIEnv*env、jclass clazz、jstring inputPath、jstring outputPath){
Ptr稳定框架;
const char*input=env->GetStringUTFChars(inputPath,NULL);
const char*output=env->GetStringUTFChars(outputPath,NULL);
字符串a=输入;
试一试{
Ptr源=生成Ptr(输入);
cout setRansacParams(ransac);
est->setMinInlierRatio(最小内部比率);
int-nkps=1000;
Ptr feature_detector=GFTTDetector::create(nkps);
Ptr motionEstBuilder=makePtr(
est);
motionEstBuilder->setDetector(功能检测器);
Ptr-outlier-rejector=makePtr();
motionEstBuilder->setOutlierRejector(outlierRejector);
稳定器底座*稳定器=0;
布尔-伊斯特沃帕斯=1;
int半径_pass=15;
如果(通过){
bool est_trim=真;
TwoPassStabilator*TwoPassStabilator=新的TwoPassStabilator();
TwoPassStabilator->setEstimateTrimRatio(est_trim);
TwoPassStabilator->SetMotionStabilator(makePtr(半径_pass));
稳定器=双通道稳定器;
}否则{
OnePassStabilator*OnePassStabilator=新的OnePassStabilator();
OnePassStabilator->setMotionFilter(makePtr(半径_-pass));
稳定器=单向稳定器;
}
int半径=15;
双纵倾比=0.1;
bool incl_constr=假;
稳定器->设置帧源(源);
稳定器->设置运动估计器(motionEstBuilder);
稳定器->设置半径(半径);
稳定器->设置配平比(配平比);
稳定器->包含的设置校正(包括施工);
稳定器->设置顺序模式(边界\u复制);
稳定框架。重置(动态施法(稳定器));
录像作者;
垫稳定框架;
int nframes=0;
双输出fps=25;
而(!(stabilizedFrame=stabilizedFrames->nextFrame()).empty()){
nframes++;
如果(!writer.isOpened())
writer.open(输出,VideoWriter::fourcc('X','V','I','D'),outputFps,
stabilizedFrame.size());
作家