当前位置: 首页 > 面试题库 >

用opencv java打开视频文件

谈琦
2023-03-14
问题内容

所以现在有适用于Java的 OpenCV
…!谁能告诉我如何用它打开Videofiles?

我尝试浏览整个Internet,但一无所获。VideoCapture类的文档不是很有帮助,因为它给出了一个C#示例并显示了如何从网络摄像头捕获。

OpenCV的Q&A也无济于事,因为没有(公开)方法可以向您提供文件名字符串。

但它 应该 按照API的 规定 工作。但是它没有,但是VideoCapture类中有一个带有sting参数的privte方法。

如果有解决方案,或者您有相同的问题,请回答。加里

更新:(2017年5月)

从3.0.0版开始,VideoCapture类的构造函数带有一个字符串参数。因此,现在有一个简单的解决方案来解决这个问题!


问题答案:

在我看来,为什么为opencv所谓的自动生成的Java包装器缺少此功能是一个谜。我首先用VideoCapture(String
filename)构造函数创建了一个新的VideoCapture类,并调用了私有本机方法。这导致不满意的链接错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError:       org.opencv.highgui.VideoCapture.n_VideoCapture(Ljava/lang/String;)J
    at org.opencv.highgui.VideoCapture.n_VideoCapture(Native Method)
    at org.opencv.highgui.VideoCapture.<init>(VideoCapture.java:90)
    at Tester.main(Tester.java:30)

这表明缺少相应的JNIEXPORT。幸运的是,这可以解决。

令人惊讶的是,所需的c构造函数已在 opencv-2.4.6 / modules / highgui / include / opencv2 /
highgui / highgui.cpp中定义

CV_WRAP VideoCapture(const string& filename);

我们在 opencv-2.4.6 / modules / java / generator / src / java / highgui +
VideoCapture.java中
的VideoCapture类中添加我们很久的构造函数

//
// C++: VideoCapture::VideoCapture(const string& filename)
//

// javadoc: VideoCapture::VideoCapture(String filename)
public VideoCapture(String filename)
{
    nativeObj = n_VideoCapture(filename);

    return;
}

关键而棘手的步骤是添加jni导出。特别是,为JNICALL找到正确的方法名称被证明是具有挑战性的,因为构造函数已重载并且将Java类作为参数。另外,我们需要将java字符串转换为c字符串。其余的是从其他构造函数复制的。

opencv-2.4.6 / modules / java / generator / src / cpp /
VideoCapture.cpp中,
我们添加以下新的JNIEXPORT:

//
//   VideoCapture::VideoCapture(const string& filename)
//

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_VideoCapture_n_1VideoCapture__Ljava_lang_String_2
(JNIEnv* env, jclass, jstring filename);

JNIEXPORT jlong JNICALL Java_org_opencv_highgui_VideoCapture_n_1VideoCapture__Ljava_lang_String_2
(JNIEnv* env, jclass, jstring filename)
{
    try {
        LOGD("highgui::VideoCapture_n_1VideoCapture__Ljava_lang_String_2()");
        const char* jnamestr = env->GetStringUTFChars(filename, NULL);
        string stdFileName(jnamestr);
        VideoCapture* _retval_ = new VideoCapture( jnamestr );

        return (jlong) _retval_;
    } catch(cv::Exception e) {
        LOGD("highgui::VideoCapture_n_1VideoCapture__Ljava_lang_String_2() catched cv::Exception: %s", e.what());
        jclass je = env->FindClass("org/opencv/core/CvException");
        if(!je) je = env->FindClass("java/lang/Exception");
        env->ThrowNew(je, e.what());
        return 0;
    } catch (...) {
        LOGD("highgui::VideoCapture_n_1VideoCapture__Ljava_lang_String_2() catched unknown exception (...)");
        jclass je = env->FindClass("java/lang/Exception");
        env->ThrowNew(je, "Unknown exception in JNI code {highgui::VideoCapture_n_1VideoCapture__Ljava_lang_String_2()}");
        return 0;
    }
}

重新编译OpenCV,它应该可以工作。



 类似资料:
  • 问题内容: 在执行其他操作时,opencv可以正常工作。它可以打开图像并显示图像。但无法打开视频。 我用来打开视频的代码如下 但是执行时,它会输出如下错误消息 我和可以播放此视频,但opencv无法播放。 我已经安装和编解码器包。(使用) 我的ubuntu版本是。 我不确定是否是编解码器问题? 我已经使用或重建了opencv ,但它根本不影响问题。错误消息永远不会改变。 问题答案: 我将该文件转换

  • 点击编辑,选择视频打点标签,选择时间段、填写描述文本后,点击添加即可完成打点。 ·每个视频最多可打20个点,描述字数限制为20个; ·可拖拽进度条进行选择时间点,也可以点击"+"、"-"对时间点进行微调。" 打点页面:

  • 问题是我可以加载YouTube网站,浏览视频, 但当我点击播放视频时,什么也不会发生。 视频就像被选中一样会出现橙色闪光, 谢谢

  • 在本机(Java)Android应用程序中,我试图打开一个URL,它是Youtube视频。 我尝试过以不同的有效方式格式化URL,例如: http://www.youtube.com/watch?v=codehere https://www.youtube.com/watch?v=codehere https://youtu.be/codehere 但我总是在Youtube应用程序中出现“此视频不

  • 目标 学习读取视频、显示视频和保存视频。 学习使用摄像头拍摄视频并将其显示出来。 你会学到这些函数:cv2.VideoCapture()、cv2.VideoWriter() 用摄像头拍摄视频 通常,我们必须用摄像头拍摄实时视频流。 OpenCV为此提供了一个非常简单的接口。 让我们从摄像头中拍摄视频(我使用我的笔记本电脑的内置摄像头),将其转换为灰度视频并显示。 这只是一个用来上手的简单任务。 要

  • 如果一些文件是带音频的视频,而一些文件只是音频,是否可以连接多个文件。最终结果应该如下所示: 我认为这一定是可能的,因为我也可以结合一个大的音频文件和一个小的视频与FFMPEG。结果将是一个视频文件,其中最后一帧只是冻结,但音频仍然播放。我想实现相同的结果,要么冻结最后一帧或简单的黑色帧。这可能吗?