提问者:小点点

JavaCV与openCV的结合


现在的问题是:在获取和存储IplImage时,必须使用原始OpenCV代码处理该帧,因为将完整的代码移植到JavaCV是不可行的。

因此,首先,我编写了一个小的测试JNI函数,它获取MAT对象的地址,并在上面画一个小圆圈。

extern "C" {
JNIEXPORT void JNICALL Java_de_vion_postprocessing_step2_EyeTracking_editFrame(
    JNIEnv*, jobject, jlong thiz, jlong addrRgba) {
//Convert the mat addresses into the objects
Mat& rgbFrame = *(Mat*) addrRgba;

Point2i scaledSmoothPoint(100,100);
circle(rgbFrame, scaledSmoothPoint, 20, YELLOW, -1);
}

当我读到IplImage扩展CvArr时,我只是在代码中调用函数,如下所示:

captured_frame = grabber.grab();
if (captured_frame == null) {
    // no new frames
    break;
}
editFrame(captured_frame .address());
06-12 18:58:23.135: E/cv::error()(6498): OpenCV Error: Assertion failed (cn <= 4) in
                    void cv::scalarToRawData(const Scalar&, void*, int, int), file 
                    /home/reports/ci/slave_desktop/50-SDK/opencv/modules/core/src/matrix.cpp, line 845
06-12 18:58:23.135: A/libc(6498): Fatal signal 6 (SIGABRT) at 0x00001962 (code=-6),
                    thread 6526 (AsyncTask #1)

向你问好,安德烈


共1个答案

匿名用户

英特尔发布了一个名为INDE的新工具,其中包含一个名为INDE媒体包的组件。不过,这是使用Java的。Media pack采用Android媒体框架,对某些特性进行了大量封装,并添加了一些内容,使视频/音频/图像处理变得非常简单。你可以从这里下载

以下是如何使用INDE从特定帧开始到结束的视频捕获(不是完整的代码,只是为了给你一个想法)。下载该工具后,您将发现大量示例代码

    public void start(String videoPath) throws IOException
    {
        if (isStarted())
        {
            throw new IllegalStateException(TAG + " already started!");
        }

        capturer = new GLCapture(new AndroidMediaObjectFactory());

        capturer.setTargetFile(videoPath);
        capturer.setTargetVideoFormat(videoFormat);

        capturer.start();

        isStarted = true;
        isConfigured = false;
        framesCaptured = 0;
    }

希望这能有所帮助。