现在的问题是:在获取和存储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)
向你问好,安德烈
英特尔发布了一个名为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;
}
希望这能有所帮助。