请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册
搜索

本文来自

EasyAR SDK问题解答区

EasyAR SDK问题解答区

10 人已关注

SDK使用上有什么问题就尽管吐槽吧,我们的工程师会第一时间回答

精选帖子

关于视频抖动和缩放的尝试解决方法(非unity)

[复制链接]

5

主题

18

帖子

83

积分

注册会员

Rank: 2

积分
83
6239 bzw2017 发表于 2017-3-14 11:03:02
本帖最后由 bzw2017 于 2017-3-14 11:18 编辑

研究了几天,终于有点明白识别的原理了,这里和大家分享一下,我用的是官方demo里的HelloArVedioNative
视频识别追踪主要在void HelloARVideo::render()方法里
ok,那么我们就分析一下这个方法:
void HelloARVideo::render()
{
    glClearColor(0.f, 0.f, 0.f, 1.f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    Frame frame = augmenter_.newFrame();
    if(view_size[0] > 0){
        AR::resizeGL(view_size[0], view_size[1]);
        if(camera_ && camera_.isOpened())
            view_size[0] = -1;
    }
    augmenter_.setViewPort(viewport_);
    augmenter_.drawVideoBackground();
    glViewport(viewport_[0], viewport_[1], viewport_[2], viewport_[3]);

    AugmentedTarget::Status status = frame.targets()[0].status();
//识别到目标
    if(status == AugmentedTarget::kTargetStatusTracked){
        int id = frame.targets()[0].target().id();
//id不一样,target被更换了
        if(active_target && active_target != id) {
            video->onLost();
            delete video;
            video = NULL;
            tracked_target = 0;
            active_target = 0;
        }
//第一次识别到目标(两种情况,一个是就是第一次打开识别到target,一种是上一步说的换了另一个target)
        if (!tracked_target) {
//视频未被加载,准被加载播放视频
            if (video == NULL) {
//根据不同的target.name做不同的响应
                if(frame.targets()[0].target().name() == std::string("argame") && texid[0]) {
                    video = new ARVideo;
                    video->openVideoFile("video.mp4", texid[0]);
                    video_renderer = renderer[0];
                }
                else if(frame.targets()[0].target().name() == std::string("namecard") && texid[1]) {
                    video = new ARVideo;
                    video->openTransparentVideoFile("transparentvideo.mp4", texid[1]);
                    video_renderer = renderer[1];
                }
                else if(frame.targets()[0].target().name() == std::string("idback") && texid[2]) {
                    video = new ARVideo;
                    video->openStreamingVideo("http://7xl1ve.com5.z0.glb.clouddn.com/sdkvideo/EasyARSDKShow201520.mp4", texid[2]);
                    video_renderer = renderer[2];
                }
            }
回复

使用道具 举报

 楼主| bzw2017 发表于 2017-3-14 11:03:47
if (video) {
//onFound()里你们可以自己看看,在ar.cc里面,设置OnFound为true,上一步视频加载好也会有个回调,也在ar.cc里面有个callback,最后在setVideoStatus里面,具体逻辑很简单这里不做赘述
                video->onFound();
//给下面两个值赋值,这个不用解释了吧
                tracked_target = id;
                active_target = id;
            }
        }
//好了,来到了最重要的几个方法
        Matrix44F projectionMatrix = getProjectionGL(camera_.cameraCalibration(), 0.2f, 500.f);
projectionMatrix->投影矩阵,是个4*4的矩阵,这个是相机的投影矩阵
        Matrix44F cameraview = getPoseGL(frame.targets()[0].pose());
cameraview->相机的view矩阵     这个最重要,获取目标的姿态,是个4*4的矩阵
        ImageTarget target = frame.targets()[0].target().cast_dynamic<ImageTarget>();
target.size()->识别图的size
        if(tracked_target) {
            video->update();
//根据这个几个参数处理视频的旋转,缩放,倾斜角度(据我估计就是因为这个,没什么卵用还乱抖动)
            video_renderer->render(projectionMatrix, cameraview, target.size());
        }
    } else {
        if (tracked_target) {
            video->onLost();
//看到没有,重新赋值了,为什么自己想想
            tracked_target = 0;
        }
    }
}
回复 支持 反对

使用道具 举报

 楼主| bzw2017 发表于 2017-3-14 11:04:05
好了,一顿分析还是可以的哈哈
那么问题来了,抖动问题怎么解?
上面说了,最重要的几个方法,涉及到识别,那么问题肯定就出在这里了
我把projectionMatrix cameraview target.size()里面的float[]数组打印出来了,根据我的调试记录,我发现了规律
projectionMatrix 4*4矩阵,里面的矩阵不论你怎么动都是一致的,这个应该是相机的投影界面,不是影响因素,pass
target.size() 里面是个vec2F类型,包含一个长度是2的float[]数组,根据我的调试,发现了他就是原图的长和宽像素的比例,比如说100*96,那就是[1,0.96],所以这个也不是影响因素,pass
那么问题肯定出现在cameraview 里了,他也是个4*4矩阵,调试了几遍,打印如下:
0.06445714   -0.99775153   0.074145714  0.0
-0.9821803   -0.06017457   0.1780475    0.0
0.17654225   0.029511005   0.98775153   0.0
-0.021342441 -0.07846859   -1.8446198   1.0

0.05445714   -0.99765153   0.064145714  0.0
-0.9720803   -0.06017457   0.1380325    0.0
0.12654225   0.019511005   0.98765251   0.0
-0.01312441 -0.07846859   -3.8647192   1.0
..
..
..

当时看到这个我就有种预感,同志们,发现规律了吗,比如,这样呢:
0            -1            0            0.0
-1           0             0            0.0
0            0             1            0.0
0.43519738   0.3811065     -4.1287036   1.0

保持最后一行数据,重新赋值矩阵(float[]数组),运行,Bingo!不抖了,完美!
虽然不知道前三行数据具体怎么来的,表示什么意思,但是具体运行的时候的确发现不抖了。

缩放的话,注意这个矩阵的倒数第二个参数,根据我的调试,在离扫描物距离不变的情况下,图片越小,他的值越小,大小会有一个合适的值,我观察-2应该是标准的缩放距离,大概是宽度占屏幕的2/3;
然后你就可以根据这个参数的值/-2来定义一个缩放指数,将target.size()里的值放大这个倍数就ok了,这样能保证不论你识别图多小,播放的视频大小总能满足需求,当然识别图太小了是不行的,那样识别都识别不了了。
至于剩下的三个参数我就不知道了,希望官方能够给出这个矩阵参数的详细解释,我们开发者也能够做更细致的开发。

回复 支持 反对

使用道具 举报

kenn 发表于 2017-3-14 11:26:09
bzw2017 发表于 2017-3-14 11:04
好了,一顿分析还是可以的哈哈
那么问题来了,抖动问题怎么解?
上面说了,最重要的几个方法,涉及到识别, ...

可以看一下计算机图形学相关书籍或文章,这个矩阵是标准矩阵
回复 支持 反对

使用道具 举报

 楼主| bzw2017 发表于 2017-3-14 14:49:26
kenn 发表于 2017-3-14 11:26
可以看一下计算机图形学相关书籍或文章,这个矩阵是标准矩阵

恩,这个就要学习了,不知道我的这个方法可不可行呢,我只想要正面播放视频的功能;
另,有什么相关的资料或链接可以推荐的吗,万分感谢!
回复 支持 反对

使用道具 举报

 楼主| bzw2017 发表于 2017-3-14 16:21:20
刚刚看了一下矩阵的知识,汗,误打误撞被我蒙对了,数学真是奥妙无穷啊
回复 支持 反对

使用道具 举报

songardemo 发表于 2017-4-20 16:33:02
66666666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表