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());
作家