android - Android 上的 VideoGrabber OF_PIXELS_RGB 渲染不正确

标签 android image-processing yuv openframeworks

为什么当我从设置为 OF_PIXELS_RGBofxAndroidVideoGrabber 绘制 ofImage 时,它看起来像这样吗? screenshot of weird color encoding

这是我的代码:

void ofApp::setup(){
    ofBackground(0,0,0);

    grabber.setPixelFormat(OF_PIXELS_RGB);

    // Start the grabber
    grabber.setup(640,480);

    // Get the native android video grabber
    ofxAndroidVideoGrabber* androidGrabber = (ofxAndroidVideoGrabber*)grabber.getGrabber().get();

    // Ensure facing the correct direction
    androidGrabber->setDeviceID(androidGrabber->getBackCamera());
}

void ofApp::update(){
    grabber.update();
    if(grabber.isFrameNew()){
        // Add frame
        ofPixels nextFrame = grabber.getPixels();
        frameQueue.push(nextFrame);
    }
}

void ofApp::draw(){    
    // Calculate aspect ratio of grabber image
    float grabberAspectRatio = grabber.getWidth() / grabber.getHeight();

    // Draw camera image centered in the window
    ofPushMatrix();
    ofSetHexColor(0xFFFFFF);
    ofSetRectMode(OF_RECTMODE_CENTER);

    ofTranslate(ofGetWidth() / 2, ofGetHeight() / 2);

    // Initial check that the next frame should be rendered
    if ( ! frameQueue.empty() ) {
        ofPixels nextFrame = frameQueue.front();
        grabberImage.setFromPixels(nextFrame);
        grabberImage.mirror(false, true);
        grabberImage.update();

        // Advance
        frameQueue.pop();
    }


    if ( grabberImage.isAllocated() ) {
        if(ofGetWidth() > ofGetHeight()) {
            grabberImage.draw(0, 0, ofGetHeight() * grabberAspectRatio, ofGetHeight());
        } else {
            grabberImage.draw(0, 0, ofGetWidth(), ofGetWidth() * 1.0/grabberAspectRatio);
        }
    }

    ofPopMatrix();
    ofSetRectMode(OF_RECTMODE_CORNER);
}

据我所知,视频以 NV21 形式出现,并由 openframeworks 转换为 RGB。我最好的猜测是:

  1. 我做错了什么,跳过了那个转换
  2. oF 中存在错误。

我已经尝试了提供的相机示例,我得到了同样的效果。

最佳答案

结果是我的模拟器使用了与大多数 Android 设备不同的视频格式。

潜在的问题是 openframeworks 假设每个像素的 UV channel 彼此相邻或半平面。而是基于查看 android source我发现 YUV 图像可以是 YUV420PlanarYUV420SemiPlanar。如果图像是 YUV420Planar,则 V channel 跟随整个 U channel 。 IE,第一个像素的V channel 的索引是startIndexU + width * height。我测试过的大多数 Android 设备都是半平面的,所以如果您看到像我这样的视频,可能只是您的模拟器提供的是平面馈送而不是半平面馈送。

关于android - Android 上的 VideoGrabber OF_PIXELS_RGB 渲染不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35448061/

相关文章:

android - 如何做SQL数据库ID?

用于云中托管图像的 Javascript 灰度脚本

c - 在 C 中读取 YUV 图像

ffmpeg - 保存原始 YUV420P 帧 FFmpeg/Libav

android - 检查用户登录并启动 LoginActivity

android - 删除表时出现受限 API lint 错误。房间持久性

android - 当我在 fragment 之间滑动时,tabindicator 不会在 tablayout 中从一个选项卡滑动到另一个选项卡。字体的突出显示也没有改变

c++ - TBB 是否支持 OpenCV 类型?

android - 增强现实测量物体的大小 - 可行性

android - 有人可以解释一下YuvImage的 `strides`参数吗?